From d8b1e469bc0f3137b2e9258899e531bee4b7c9dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 02:58:12 +0200 Subject: [PATCH] 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