diff --git a/bin/doom b/bin/doom index 0b21a0382..20301491e 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; } @@ -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:") diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 47f571ca3..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 @@ -124,16 +125,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"))) @@ -141,8 +139,9 @@ easy 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-"))) @@ -150,31 +149,43 @@ easy 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))) @@ -280,19 +291,26 @@ 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))) (set-process-sentinel esup-child-process 'esup-child-process-sentinel))) +;;;###autoload +(advice-add #'esup :override #'doom/profile-emacs) 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) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 82f89cdf7..af357eeaf 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -103,3 +103,24 @@ 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))) + +;;;###autoload +(defun doom*recenter (&rest _) + (recenter)) diff --git a/core/core-cli.el b/core/core-cli.el index 75020a054..94548a65a 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)\"\n" + "exec \"$SHELL\" -c \"$pwd/RunEmacs $args\"") + (write-file oldbin) + (chmod oldbin (file-modes newbin))) + (message "%s successfully patched" appdir)))))) + ;; ;; Autoload file generation diff --git a/core/core-editor.el b/core/core-editor.el index 88ae20724..c60ada15d 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 @@ -143,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))) @@ -257,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 @@ -268,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/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) 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))) 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 diff --git a/core/core-ui.el b/core/core-ui.el index 431e5e404..a4cc2d24e 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 @@ -138,27 +109,14 @@ Also see `doom-exit-buffer-hook'.") (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) +;; `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' (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. @@ -289,51 +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) - (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 ;; @@ -540,14 +453,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 diff --git a/core/core.el b/core/core.el index 2a834a7e5..4613e090d 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.") @@ -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,97 @@ 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-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))))) +(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 ;; @@ -300,7 +379,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))) 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) 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). 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)))))) 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 diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 655e635f3..ff07cd41d 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -19,17 +19,92 @@ #'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)))) ;; ;; Project search ;; +(defun +helm-ag-search-args (all-files-p recursive-p) + (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 --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 --nocolor --nogroup -e" + "-S" + (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 @@ -52,13 +127,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))) @@ -66,144 +140,97 @@ 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 ((equal directory default-directory) - "./") - ((equal directory project-root) + (cond ((file-equal-p directory project-root) (projectile-project-name)) - (t - (file-relative-name directory project-root))))) + ((file-equal-p directory default-directory) + "./") + ((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 "")) - (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)))) + ;; 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) + :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) + 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 (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") -;;;###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)) +(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)) + (format "Perform a project file search using %s. -;;;###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)) +QUERY is a regexp. If omitted, the current selection is used. If no selection is +active, the last known search is used. -;;;###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)) +If ALL-FILES-P, search compressed and hidden files as well." + engine)) -;; 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)) + (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)) + (format "Perform a project file search from the current directory using %s. -;;;###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)) +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))) 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 6dcecc793..f43a596c3 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") @@ -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 @@ -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)) @@ -90,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 @@ -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) @@ -114,10 +116,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." @@ -151,7 +157,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/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index e556da596..94abf79e2 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)))) @@ -307,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))) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 5b87887ac..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 ." @@ -149,6 +151,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 @@ -199,7 +202,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))) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ec3e95aac..ca0bfecb8 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 @@ -520,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) @@ -557,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 @@ -663,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 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))) 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. 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 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) 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 () 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) 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 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) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index cba5ec627..f04e1b9a9 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -1,42 +1,39 @@ ;;; 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 - :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 - ;; 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)) + (def-package! clj-refactor + :config + (map! :map clj-refactor-map + :localleader + :desc "Refactor hydra" :n "r" #'hydra-cljr-help-menu/body))) diff --git a/modules/lang/coq/README.org b/modules/lang/coq/README.org new file mode 100644 index 000000000..680555966 --- /dev/null +++ b/modules/lang/coq/README.org @@ -0,0 +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]]. 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/packages.el b/modules/lang/coq/packages.el new file mode 100644 index 000000000..3ae652118 --- /dev/null +++ b/modules/lang/coq/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/coq/packages.el + +(package! proof-general :recipe (:fetcher github :repo "ProofGeneral/PG" :files ("*"))) + +(package! company-coq) 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..dd17e2659 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 ;; @@ -36,7 +31,9 @@ defined by Emacs, not Doom or packages). This can help make typos stand out.") (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 @@ -59,23 +56,44 @@ 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) 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)) + ;; 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." @@ -92,8 +110,7 @@ defined by Emacs, not Doom or packages). This can help make typos stand out.") ("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 () 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)) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index f3ee2b564..e701ad80d 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) @@ -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) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 2cf22ab83..787e1528a 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 () @@ -124,4 +120,4 @@ If it's found, then add it to the `exec-path'." (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))) 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)))) 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) 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'. 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") 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 () 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"))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index c1535849f..26276aa06 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 @@ -152,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 @@ -186,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)) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 3d0d9c4a8..d86227128 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -1,15 +1,13 @@ ;;; 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) - (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) + :definition #'racket-visit-definition + :documentation #'racket-describe) (set-docset! 'racket-mode "Racket") (set-pretty-symbols! 'racket-mode :lambda "lambda" @@ -29,39 +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 - (: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 "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 "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)) + (: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))) 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 9b54b78c7..b059c111e 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -4,12 +4,27 @@ :mode ("\\.http\\'" . restclient-mode) :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) + (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 + :n [return] #'+rest/dwim-at-point + :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 - :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 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" diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 3c33cc562..5c896e08c 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -38,7 +38,11 @@ (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+) + (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 diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index ad15fa351..ae0159869 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,38 @@ (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) + (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 fullscreen. - ('(magit--display-buffer-fullframe)))))) + '(display-buffer-below-selected)) + ;; Last resort: use current window + ('(display-buffer-same-window)))))) + +;;;###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)))) ;; @@ -56,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" 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 "~/" diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 4c0399d14..0ca1262fc 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.") @@ -47,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) @@ -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 diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index ddc4c4fb9..0df7c38e4 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 @@ -180,26 +180,29 @@ 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))))) + (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-selected-window window - (cons window - (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) +(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)) ;; 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) 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)))))