diff --git a/.github/PULL_REQUEST/bump.md b/.github/PULL_REQUEST_TEMPLATE/bump.md similarity index 84% rename from .github/PULL_REQUEST/bump.md rename to .github/PULL_REQUEST_TEMPLATE/bump.md index c02624b7e..91330f0ea 100644 --- a/.github/PULL_REQUEST/bump.md +++ b/.github/PULL_REQUEST_TEMPLATE/bump.md @@ -15,12 +15,13 @@ labels: is:update re:packages > > OR, if multiple packages are bumped in one commit: > -> Bump package1, package2 & package 3 +> Bump :tools lsp > > emacs-lsp/lsp-mode@91e37a6 -> emacs-lsp/lsp-mode@c8188ef > emacs-lsp/lsp-ui@cf6906c -> emacs-lsp/lsp-ui@582e153 > -> (Commit hashes should be limited to 7 characters) +> Commit hashes should be limited to 7 characters. Include additional +> commentary after the list of commit changes. > > 4. You've included links to relevant issues, if any > 5. You've deleted this template diff --git a/.github/PULL_REQUEST/general.md b/.github/PULL_REQUEST_TEMPLATE/general.md similarity index 100% rename from .github/PULL_REQUEST/general.md rename to .github/PULL_REQUEST_TEMPLATE/general.md diff --git a/README.md b/README.md index 60125414e..755b648e6 100644 --- a/README.md +++ b/README.md @@ -1,185 +1,253 @@ - - Made with Doom Emacs - - - Supports Emacs 26.x - 27.0.50 - - - Build status: develop - - - Join our discord server - -

+
+ +# Doom Emacs + +[Install](#install) • [Documentation] • [FAQ] • [Screenshots] • [Contribute](#contribute) + +![Made with Doom Emacs](https://img.shields.io/github/tag/hlissner/doom-emacs.svg?style=flat-square&label=release&color=58839b) +![Supports Emacs 26-27](https://img.shields.io/badge/Supports-Emacs_26.1_--_27.x-blueviolet.svg?style=flat-square&logo=GNU%20Emacs&logoColor=white) +![Latest commit](https://img.shields.io/github/last-commit/hlissner/doom-emacs/develop?style=flat-square) +![Build status: develop](https://img.shields.io/github/workflow/status/hlissner/doom-emacs/CI/develop?style=flat-square) +[![Discord Server](https://img.shields.io/discord/406534637242810369?color=blue&label=Discord%20Chat&logo=discord&logoColor=white&style=flat-square)][Discord] ![Doom Emacs Screenshot](https://raw.githubusercontent.com/hlissner/doom-emacs/screenshots/main.png) -

- Screenshots - | - Get started - | - Contribute - | - Documentation - | - FAQ -

+
--- -**Quick start** +### Table of Contents +- [Introduction](#introduction) +- [Features](#features) +- [Prerequisites](#prerequisites) +- [Install](#install) +- [Roadmap](#roadmap) +- [Getting help](#getting-help) +- [Contributing](#contributing) -1. **Install Emacs 26.1+**. 27 is recommended. _28+ is not supported_. -2. Install [ripgrep](https://github.com/BurntSushi/ripgrep) 11.0+. -3. Windows and BSD users will need GNU Find. -4. Clone Doom and run its installer: - - ```bash - git clone https://github.com/hlissner/doom-emacs ~/.emacs.d - ~/.emacs.d/bin/doom install - ``` - -Find more detailed install instructions [in the -documentation](docs/getting_started.org#install). - -**Table of Contents** - -- [What is Doom Emacs](#what-is-doom-emacs) - - [Doom's mantras](#dooms-mantras) - - [Features](#features) -- [Getting Help](#getting-help) - - [Community](#community) - - [Troubleshooting](#troubleshooting) - - [Contributing](#contributing) - -# What is Doom Emacs +# Introduction - + -It is a story as old as time. A stubborn, shell-dwelling, and melodramatic -vimmer -- envious of the features of modern text editors -- spirals into despair -before succumbing to the [dark side][url:evil-mode]. This is his config. +> It is a story as old as time. A stubborn, shell-dwelling, and melodramatic +> vimmer—envious of the features of modern text editors—spirals into +> despair before he succumbs to the [dark side][evil-mode]. This is his config. -Doom is a configuration framework for [GNU -Emacs](https://www.gnu.org/software/emacs/) tailored for Emacs bankruptcy -veterans who want less framework in their frameworks and the performance of a -hand rolled config (or better). It can be a foundation for your own config or a -resource for Emacs enthusiasts to learn more about our favorite OS. +Doom is a configuration framework for [GNU Emacs] tailored for Emacs bankruptcy +veterans who want less framework in their frameworks, a modicum of stability +(and reproducibility) from their package manager, and the performance of a hand +rolled config (or better). It can be a foundation for your own config or a +resource for Emacs enthusiasts to learn more about our favorite operating +system. -## Doom's mantras +Its design is guided by these mantras: -- **Gotta go fast.** Startup and run-time performance are priorities. Doom goes - beyond lazy loading packages by modifying them to be snappier and load lazier! -- **Close to metal.** There's less between you and vanilla Emacs by design. - There's less to grok, on top of Emacs. -- **Readability counts.** Internals ought to be written as if reading them were - part of the user experience, and it is! Modules should be syntactically sweet. - Backend logic should be functional (as much as elisp permits), abstraction - light and (hopefully) documented. -- **Opinionated, but not stubborn.** Doom is a bundle of reasonable defaults and - curated opinions, but all of it should be optional. Use as little or as much - of it as you like. -- **Your system, your rules.** There are more ways to set up your development - environment than there are dislikes on Youtube Rewind '18, so Doom leaves it - to you. Doom will not *automatically* install system dependencies (and will - coerce its plugins not to do so either). Use `doom doctor` to figure out - what's missing. ++ **Gotta go fast.** Startup and run-time performance are priorities. Doom goes + beyond by modifying packages to be snappier and load lazier. ++ **Close to metal.** There's less between you and vanilla Emacs by design. + That's less to grok and less to work around when you tinker. Internals ought + to be written as if reading them were part of Doom's UX, and it is! ++ **Opinionated, but not stubborn.** Doom is about reasonable defaults and + curated opinions, but use as little or as much of it as you like. ++ **Your system, your rules.** You know better. At least, Doom hopes so! It + won't *automatically* install system dependencies (and will force plugins not + to either). Rely on `doom doctor` to tell you what's missing. ++ **Nix/Guix was a great idea!** The Emacs ecosystem is temperamental. Things + break and they break often. Disaster recovery should be a priority! Doom's + package management should be declarative and your private config reproducible, + and comes with a means to roll back releases and updates (still a WIP). + +Check out [the FAQ][FAQ] for answers to common questions about the project. -## Features +# Features - Minimalistic good looks inspired by modern editors. -- A modular architecture that can be extended to your own configs. -- A standard library suited to simplifying your config. -- A declarative [package management system][doom:packages] (powered by - [straight.el][url:straight]) with a command line interface. Install packages - from anywhere, not just (M)ELPA. -- (Optional) Vim-emulation powered by [evil-mode][url:evil-mode], including - ports of popular vim plugins and functionality. - Curated and sane defaults for many packages, (major) OSes, and Emacs itself. +- A modular organizational structure for separating concerns in your config. +- A standard library designed to simplify your elisp bike shedding. +- A declarative [package management system][package-management] (powered by + [straight.el]) with a command line interface. Install packages from anywhere, + not just (M)ELPA, and pin them to any commit. +- Optional vim emulation powered by [evil-mode], including ports of popular vim + plugins like [vim-sneak], [vim-easymotion], [vim-unimpaired] and + [more][ported-vim-plugins]! +- Opt-in LSP integration for many languages, using [lsp-mode]. - Support for *many* programming languages. Includes syntax highlighting, linters/checker integration, inline code evaluation, code completion (where possible), REPLs, documentation lookups, snippets, and more! - Support for *many* tools, like docker, pass, ansible, terraform, and more. -- A Spacemacs-esque [keybinding scheme][doom:bindings], centered around leader - and localleader prefix keys (SPC and SPCm, by - default). -- A rule-based [popup management system][doom:popups] to control how temporary - or disposable buffers are displayed (and disposed of). -- Automatic indentation detection and [editorconfig][url:editorconfig] - integration. Let someone else argue about tabs vs **\_\***spaces**\*\_**. +- A Spacemacs-esque [keybinding scheme][bindings], centered around leader + and localleader prefix keys (SPC and SPCm for + evil users, C-c and C-c l for vanilla users). +- A rule-based [popup manager][popup-system] to control how temporary buffers + are displayed (and disposed of). +- Per-file indentation style detection and [editorconfig] integration. Let + someone else can argue about tabs vs **_spaces_**. - Project-management tools and framework-specific minor modes with their own snippets libraries. -- Project search (and replace) utilities, powered by [ripgrep][url:ripgrep]. +- Project search (and replace) utilities, powered by [ripgrep] and [ivy] or + [helm]. - Isolated and persistent workspaces (also substitutes for vim tabs). -- An envvar file generator that captures a snapshot of your shell environment - for Doom to load at startup. No more struggling to get Emacs to inherit your - `PATH`, among other things. +- Support for Chinese and Japanese input systems. +- Save a snapshot of your shell environment to a file for Emacs to load at + startup. No more struggling to get Emacs to inherit your `PATH`, among other + things. -# Getting Help -## Community +# Prerequisites ++ Git 2.23+ ++ Emacs 26.1+ (*27 is recommended*) with GNUTLS support ++ [ripgrep] 11.0+ ++ GNU `find` ++ *OPTIONAL:* [fd] 7.3.0+ (improves file indexing performance for some commands) + +Doom is comprised of [~150 optional modules][Modules], some of which may have +additional dependencies. [Visit their documentation][Modules] or run `bin/doom +doctor` to check for any that you may have missed. -We have [a Discord server][url:discord]! Hop on and say hi! -## Troubleshooting +# Install +``` sh +git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d +~/.emacs.d/bin/doom install +``` -Encountered a problem? Here are some things to try before shooting off that bug -report: +Then [read our Getting Started guide][getting-started] to be walked through +installing, configuring and maintaining Doom Emacs. -- Run `bin/doom sync`. This ensures Doom is properly set up and its autoloads - files are up-to-date. -- Folks who have byte-compiled their config (with `bin/doom compile`) should run - `bin/doom clean` to rule out stale bytecode. Never debug with a byte-compiled - config. It makes your job harder. -- Run `bin/doom doctor` to detect common issues in your development environment - and missing third party dependencies. -- Search [Doom's issue tracker][github:issues] in case your issue was already +It's a good idea to add `~/.emacs.d/bin` to your `PATH`! Other `bin/doom` +commands you should know about: + ++ `doom sync` to synchronize your private config with Doom. Installs new + packages, removes orphaned packages and regenerates caches. Run this whenever + you modify your private `init.el` or `packages.el`, or install/remove an Emacs + package through your OS package manager (e.g. mu4e or agda). ++ `doom upgrade` to update Doom to the latest release & all installed packages. ++ `doom doctor` to diagnose common issues with your system and config. ++ `doom env` to dump a snapshot of your shell environment to a file that Doom + will load at startup. This allows Emacs to inherit your `PATH`, among other + things. ++ `doom build` to recompile all installed packages (use this if you up/downgrade + Emacs). + + +# Roadmap +Doom is an active and ongoing project. To make that development more +transparent, its roadmap (and other concerns) are published across three github +project boards and a newsletter: + ++ [Development Roadmap](https://github.com/hlissner/doom-emacs/projects/3): + roughly outlines our goals between release milestones and their progress. ++ [Plugins under review](https://github.com/hlissner/doom-emacs/projects/2): + lists plugins we are watching and considering for inclusion, and what their + status for inclusion is. Please consult this list before requesting new + packages/features. ++ [Upstream bugs](https://github.com/hlissner/doom-emacs/projects/5): lists + issues that originate from elsewhere, and whether or not we have local + workarounds or temporary fixes for them. ++ ~~Doom's newsletter~~ (not finished) will contain changelogs in between + releases. + + +# Getting help +Emacs is no journey of a mere thousand miles. You _will_ run into problems and +mysterious errors. When you do, here are some places you can look for help: + ++ [Our documentation][documentation] covers many use cases. + + [The Configuration section][configuration] covers how to configure Doom and + its packages. + + [The Package Management section][package-management] covers how to install + and disable packages. + + [This section][bin/doom] explains the `bin/doom` script's most important + commands. + + [This section][common-mistakes] lists some common configuration mistakes new + users make, when migrating a config from another distro or their own. + + [This answer][change-theme] shows you how to add your own themes to your + private config. + + [This answer][change-font] shows you how to change the default font. + + Your issue may be documented in the [FAQ]. ++ With Emacs built-in help system documentation is a keystroke away: + + For functions: SPC h f or C-h f + + For variables: SPC h v or C-h v + + For a keybind: SPC h k or C-h k + + To search available keybinds: SPC h b b or C-h b b ++ Run `bin/doom doctor` to detect common issues with your development + environment and private config. ++ Check out the [FAQ], in case your question has already been answered. ++ Search [Doom's issue tracker](/issues) in case your issue was already reported. -- [Visit our FAQ][docs:faq] to see if your issue is listed. - -If all else fails, [file that bug report][github:new-issue]! **Please do not -ignore the issue template!** It's a great help if you can [include a backtrace -with errors][docs:backtrace]. - -## Contributing - -Doom (and my Emacs work in general) is a labor of love and incurable madness, -done on my spare time. If you'd like to support my work, there are many things -you can do to help. I welcome contributions! - -- I love pull requests and bug reports. Check out the [Contributing - Guidelines][docs:contributing] to find out how you can help out. -- I welcome Elisp pointers! Don't hesitate to [tell me my Elisp-fu - sucks][github:new-issue] (but please tell me why). -- Hop on [our Discord server][url:discord] and say hi! Help others out, hang out - or talk to me about Emacs, or gamedev, or programming, machine learning, - physics, pixel art, anime, gaming -- anything you like. Nourish this lonely - soul! -- If you'd like to support my work financially, consider buying me a drink - through [liberapay][url:liberapay] or [paypal][url:paypal]. Donations are a - great help. My work here contends with studies, ventures in indie gamedev, and - my freelance work. ++ Hop on [our Discord server][discord]; it's active and friendly! Keep an eye on + the #announcements channel, where I announce breaking updates and releases. -[docs:wiki]: docs/index.org -[docs:wiki-quickstart]: docs/getting_started.org -[docs:wiki-modules]: docs/index.org#Module%20List -[docs:wiki-customization]: docs/getting_started.org#Customize -[docs:contributing]: docs/contributing.org -[docs:faq]: docs/faq.org -[docs:backtrace]: https://github.com/hlissner/doom-emacs/blob/develop/docs/getting_started.org#how-to-extract-a-backtrace-from-an-error -[github:new-issue]: https://github.com/hlissner/doom-emacs/issues/new -[github:issues]: https://github.com/hlissner/doom-emacs/issues -[doom:bindings]: modules/config/default/+evil-bindings.el -[doom:packages]: core/autoload/packages.el -[doom:popups]: modules/ui/popup/README.org -[url:discord]: https://discord.gg/qvGgnVx -[url:liberapay]: https://liberapay.com/hlissner/donate -[url:paypal]: https://paypal.me/henriklissner/10 -[url:editorconfig]: http://editorconfig.org/ -[url:evil-mode]: https://github.com/emacs-evil/evil -[url:ripgrep]: https://github.com/BurntSushi/ripgrep -[url:straight]: https://github.com/raxod502/straight.el +# Contribute +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) +[![Elisp styleguide](https://img.shields.io/badge/elisp-style%20guide-purple?style=flat-square)](https://github.com/bbatsov/emacs-lisp-style-guide) +[![Donate on liberapay](https://img.shields.io/badge/liberapay-donate-1.svg?style=flat-square&logo=liberapay&color=blue)][liberapay] +[![Donate on paypal](https://img.shields.io/badge/paypal-donate-1?style=flat-square&logo=paypal&color=blue)][paypal] + +Doom is a labor of love and incurable madness, but I'm only one guy. Doom +wouldn't be where it is today without your help. I welcome contributions of any +kind! + ++ I :heart: pull requests and bug reports (see the [Contributing + Guidelines][contribute])! ++ Don't hesitate to [tell me my Elisp-fu + sucks](https://github.com/hlissner/doom-emacs/issues/new), but please tell me + why. ++ Hop on [our Discord server][Discord] and say hi! Help others, hang out or talk + to me about Emacs, gamedev, programming, physics, pixel art, anime, gaming -- + anything you like. Nourish this lonely soul. ++ If you'd like to support my work financially, buy me a drink through + [liberapay] or [paypal]. My work contends with studies, adventures in indie + gamedev and freelance work. Donations help me allocate more time to my Emacs + and OSS capers. + +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/0)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/0) +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/1)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/1) +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/2)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/2) +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/3)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/3) +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/4)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/4) +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/5)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/5) +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/6)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/6) +[![](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/images/7)](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/7) + + +[contribute]: docs/contributing.org +[discord]: https://discord.gg/qvGgnVx +[documentation]: docs/index.org +[faq]: docs/faq.org +[getting-started]: docs/getting_started.org +[install]: docs/getting_started.org#install +[backtrace]: docs/getting_started.org#how-to-extract-a-backtrace-from-an-error +[configuration]: docs/getting_started.org#configuring-doom +[package-management]: docs/getting_started.org#package-management +[bin/doom]: docs/getting_started.org#the-bindoom-utility +[common-mistakes]: docs/getting_started.org#common-mistakes-when-configuring-doom-emacs +[change-theme]: docs/faq.org#how-do-i-change-the-theme +[change-font]: docs/faq.org#how-do-i-change-the-fonts +[modules]: docs/modules.org +[popup-system]: modules/ui/popup/README.org +[screenshots]: #screenshots + +[bindings]: modules/config/default/+evil-bindings.el +[editorconfig]: http://editorconfig.org/ +[evil-mode]: https://github.com/emacs-evil/evil +[fd]: https://github.com/sharkdp/fd +[gnu emacs]: https://www.gnu.org/software/emacs/ +[helm]: https://github.com/emacs-helm/helm +[ivy]: https://github.com/abo-abo/swiper +[lsp-mode]: https://github.com/emacs-lsp/lsp-mode +[nix]: https://nixos.org +[ported-vim-plugins]: modules/editor/evil/README.org#ported-vim-plugins +[ripgrep]: https://github.com/BurntSushi/ripgrep +[straight.el]: https://github.com/raxod502/straight.el +[vim-easymotion]: https://github.com/easymotion/vim-easymotion +[vim-lion]: https://github.com/tommcdo/vim-lion +[vim-sneak]: https://github.com/justinmk/vim-sneak +[vim-unimpaired]: https://github.com/tpope/vim-unimpaired + +[liberapay]: https://liberapay.com/hlissner/donate +[paypal]: https://paypal.me/henriklissner/10 diff --git a/core/autoload/cache.el b/core/autoload/cache.el deleted file mode 100644 index 79db071dd..000000000 --- a/core/autoload/cache.el +++ /dev/null @@ -1,95 +0,0 @@ -;;; core/autoload/cache.el -*- lexical-binding: t; -*- - -;; This little library thinly wraps around persistent-soft (which is a pcache -;; wrapper, how about that). It has three purposes: -;; -;; + To encapsulate the cache backend (persistent-soft/pcache in this case), in -;; case it needs to change. -;; + To provide `doom-cache-persist': a mechanism for easily persisting -;; variables across Emacs sessions. -;; + To lazy-load persistent-soft until it is really needed. -;; -;; Like persistent-soft, caches assume a 2-tier structure, where all caches are -;; namespaced by location. - -(defvar doom-cache-alists '(t) - "An alist of alists, containing lists of variables for the doom cache library -to persist across Emacs sessions.") - -(defvar doom-cache-location 'doom - "The default location for cache files. This symbol is translated into a file -name under `pcache-directory' (by default a subdirectory under -`doom-cache-dir'). One file may contain multiple cache entries.") - -(defun doom-save-persistent-cache-h () - "Hook to run when an Emacs session is killed. Saves all persisted variables -listed in `doom-cache-alists' to files." - (dolist (alist (butlast doom-cache-alists 1)) - (cl-loop with key = (car alist) - for var in (cdr alist) - if (symbol-value var) - do (doom-cache-set var it nil key)))) -(add-hook 'kill-emacs-hook #'doom-save-persistent-cache-h) - - -;; -;; Library - -;;;###autoload -(defmacro with-cache! (location &rest body) - "Runs BODY with a different default `doom-cache-location'." - (declare (indent defun)) - `(let ((doom-cache-location ',location)) - ,@body)) - -;;;###autoload -(defun doom-cache-persist (location variables) - "Persist VARIABLES (list of symbols) in LOCATION (symbol). - -This populates these variables with cached values, if one exists, and saves them -to file when Emacs quits. - -Warning: this is incompatible with buffer-local variables." - (dolist (var variables) - (when (doom-cache-exists var location) - (set var (doom-cache-get var location)))) - (setf (alist-get location doom-cache-alists) - (append variables (cdr (assq location doom-cache-alists))))) - -;;;###autoload -(defun doom-cache-desist (location &optional variables) - "Unregisters VARIABLES (list of symbols) in LOCATION (symbol) from -`doom-cache-alists', thus preventing them from being saved between sessions. -Does not affect the actual variables themselves or their values." - (if variables - (setf (alist-get location doom-cache-alists) - (cl-set-difference (cdr (assq location doom-cache-alists)) - variables)) - (delq (assq location doom-cache-alists) - doom-cache-alists))) - -;;;###autoload -(defun doom-cache-get (key &optional location) - "Retrieve KEY from LOCATION (defaults to `doom-cache-location'), if it exists -and hasn't expired." - (persistent-soft-fetch - key (symbol-name (or location doom-cache-location)))) - -;;;###autoload -(defun doom-cache-set (key value &optional ttl location) - "Set KEY to VALUE in the cache. TTL is the time (in seconds) until this cache -entry expires. LOCATION is the super-key to store this cache item under; the -default is `doom-cache-location'. " - (persistent-soft-store - key value - (symbol-name (or location doom-cache-location)) ttl)) - -;;;###autoload -(defun doom-cache-exists (key &optional location) - "Returns t if KEY exists at LOCATION (defaults to `doom-cache-location')." - (persistent-soft-exists-p key (or location doom-cache-location))) - -;;;###autoload -(defun doom-cache-clear (&optional location) - "Clear a cache LOCATION (defaults to `doom-cache-location')." - (persistent-soft-flush (or location doom-cache-location))) diff --git a/core/autoload/config.el b/core/autoload/config.el index eb3acac93..cacd0d32d 100644 --- a/core/autoload/config.el +++ b/core/autoload/config.el @@ -76,7 +76,7 @@ Runs `doom-reload-hook' afterwards." (interactive) (require 'core-cli) (when (and IS-WINDOWS (file-exists-p doom-env-file)) - (warn "Can't regenerate envvar file from within Emacs. Run 'doom env' from the console")) + (message "Can't regenerate envvar file from within Emacs. Run 'doom env' from the console")) ;; In case doom/reload is run before incrementally loaded packages are loaded, ;; which could cause odd load order issues. (mapc #'require (cdr doom-incremental-packages)) @@ -136,6 +136,6 @@ imported into Emacs." (defun doom/upgrade () "Run 'doom upgrade' then prompt to restart Emacs." (interactive) - (doom--if-compile (format "%s upgrade" doom-bin) + (doom--if-compile (format "%s -y upgrade" doom-bin) (when (y-or-n-p "You must restart Emacs for the upgrade to take effect.\n\nRestart Emacs?") (doom/restart-and-restore)))) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 7b3f5ddcd..c6d58e8f9 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -46,10 +46,7 @@ ready to be pasted in a bug report on github." (require 'core-packages) (let ((default-directory doom-emacs-dir) (doom-modules (doom-modules))) - (cl-letf - (((symbol-function 'sh) - (lambda (&rest args) - (cdr (apply #'doom-call-process args))))) + (letf! (defun sh (&rest args) (cdr (apply #'doom-call-process args))) `((emacs (version . ,emacs-version) (features ,@system-configuration-features) diff --git a/core/autoload/files.el b/core/autoload/files.el index 65d0a6639..b62925d43 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -203,52 +203,29 @@ single file or nested compound statement of `and' and `or' statements." ;; ;;; Helpers -(defun doom--forget-file (path) - "Ensure `recentf', `projectile' and `save-place' forget OLD-PATH." - (when (bound-and-true-p recentf-mode) - (recentf-remove-if-non-kept path)) - (when (and (bound-and-true-p projectile-mode) - (doom-project-p) - (projectile-file-cached-p path (doom-project-root))) - (projectile-purge-file-from-cache path)) - (when (bound-and-true-p save-place-mode) - (save-place-forget-unreadable-files))) - -(defun doom--update-file (path) - (when (featurep 'vc) - (vc-file-clearprops path) - (vc-resynch-buffer path nil t)) - (when (featurep 'magit) - (when-let (default-directory (magit-toplevel (file-name-directory path))) - (magit-refresh)))) - -(defun doom--copy-file (old-path new-path &optional force-p) - (let* ((new-path (expand-file-name new-path)) - (old-path (file-truename old-path)) - (new-path (apply #'expand-file-name - (if (or (directory-name-p new-path) - (file-directory-p new-path)) - (list (file-name-nondirectory old-path) new-path) - (list new-path)))) - (new-path-dir (file-name-directory new-path)) - (project-root (doom-project-root)) - (short-new-name (if (and project-root (file-in-directory-p new-path project-root)) - (file-relative-name new-path project-root) - (abbreviate-file-name new-path)))) - (unless (file-directory-p new-path-dir) - (make-directory new-path-dir t)) - (when (buffer-modified-p) - (save-buffer)) - (cond ((file-equal-p old-path new-path) - (throw 'status 'overwrite-self)) - ((and (file-exists-p new-path) - (not force-p) - (not (y-or-n-p (format "File already exists at %s, overwrite?" short-new-name)))) - (throw 'status 'aborted)) - ((file-exists-p old-path) - (copy-file old-path new-path t) - short-new-name) - (short-new-name)))) +(defun doom--update-files (&rest files) + "Ensure FILES are updated in `recentf', `magit' and `save-place'." + (let (toplevels) + (dolist (file files) + (when (featurep 'vc) + (vc-file-clearprops file) + (when-let (buffer (get-file-buffer file)) + (with-current-buffer buffer + (vc-refresh-state)))) + (when (featurep 'magit) + (when-let (default-directory (magit-toplevel (file-name-directory file))) + (cl-pushnew default-directory toplevels))) + (unless (file-readable-p file) + (when (bound-and-true-p recentf-mode) + (recentf-remove-if-non-kept file)) + (when (and (bound-and-true-p projectile-mode) + (doom-project-p) + (projectile-file-cached-p file (doom-project-root))) + (projectile-purge-file-from-cache file)))) + (dolist (default-directory toplevels) + (magit-refresh)) + (when (bound-and-true-p save-place-mode) + (save-place-forget-unreadable-files)))) ;; @@ -256,73 +233,67 @@ single file or nested compound statement of `and' and `or' statements." ;;;###autoload (defun doom/delete-this-file (&optional path force-p) - "Delete FILENAME (defaults to the file associated with current buffer) and -kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." + "Delete PATH, kill its buffers and expunge it from vc/magit cache. + +If PATH is not specified, default to the current buffer's file. + +If FORCE-P, delete without confirmation." (interactive - (list (file-truename (buffer-file-name)) + (list (buffer-file-name (buffer-base-buffer)) current-prefix-arg)) - (let* ((fbase (file-name-sans-extension (file-name-nondirectory path))) - (buf (current-buffer))) - (cond ((not (file-exists-p path)) - (error "File doesn't exist: %s" path)) - ((not (or force-p (y-or-n-p (format "Really delete %s?" fbase)))) - (message "Aborted") - nil) - ((unwind-protect - (progn (delete-file path) t) - (let ((short-path (file-relative-name path (doom-project-root)))) - (if (file-exists-p path) - (error "Failed to delete %s" short-path) - ;; Ensures that windows displaying this buffer will be switched - ;; to real buffers (`doom-real-buffer-p') - (doom/kill-this-buffer-in-all-windows buf t) - (doom--forget-file path) - (doom--update-file path) - (message "Successfully deleted %s" short-path)))))))) + (let* ((path (or path (buffer-file-name (buffer-base-buffer)))) + (short-path (abbreviate-file-name path))) + (unless (and path (file-exists-p path)) + (user-error "Buffer is not visiting any file")) + (unless (file-exists-p path) + (error "File doesn't exist: %s" path)) + (unless (or force-p (y-or-n-p (format "Really delete %S?" short-path))) + (user-error "Aborted")) + (let ((buf (current-buffer))) + (unwind-protect + (progn (delete-file path) t) + (if (file-exists-p path) + (error "Failed to delete %S" short-path) + ;; Ensures that windows displaying this buffer will be switched to + ;; real buffers (`doom-real-buffer-p') + (doom/kill-this-buffer-in-all-windows buf t) + (doom--update-files path) + (message "Deleted %S" short-path)))))) ;;;###autoload (defun doom/copy-this-file (new-path &optional force-p) - "Copy current buffer's file to NEW-PATH. If FORCE-P, overwrite the destination -file if it exists, without confirmation." + "Copy current buffer's file to NEW-PATH. + +If FORCE-P, overwrite the destination file if it exists, without confirmation." (interactive (list (read-file-name "Copy file to: ") current-prefix-arg)) - (pcase (catch 'status - (when-let (dest (doom--copy-file (buffer-file-name) new-path force-p)) - (doom--update-file new-path) - (message "File successfully copied to %s" dest))) - (`overwrite-self (error "Cannot overwrite self")) - (`aborted (message "Aborted")) - (_ t))) + (unless (and buffer-file-name (file-exists-p buffer-file-name)) + (user-error "Buffer is not visiting any file")) + (let ((old-path (buffer-file-name (buffer-base-buffer))) + (new-path (expand-file-name new-path))) + (make-directory (file-name-directory new-path) 't) + (copy-file old-path new-path (or force-p 1)) + (doom--update-files old-path new-path) + (message "File copied to %S" (abbreviate-file-name new-path)))) ;;;###autoload (defun doom/move-this-file (new-path &optional force-p) - "Move current buffer's file to NEW-PATH. If FORCE-P, overwrite the destination -file if it exists, without confirmation." + "Move current buffer's file to NEW-PATH. + +If FORCE-P, overwrite the destination file if it exists, without confirmation." (interactive (list (read-file-name "Move file to: ") current-prefix-arg)) - (pcase (catch 'status - (let ((old-path (buffer-file-name)) - (new-path (expand-file-name new-path))) - (when-let (dest (doom--copy-file old-path new-path force-p)) - (doom--forget-file old-path) - (when (file-exists-p old-path) - (delete-file old-path)) - (mapc #'doom--update-file - (delq - nil (list (if (ignore-errors - (file-equal-p (doom-project-root old-path) - (doom-project-root new-path))) - nil - old-path) - new-path))) - (kill-current-buffer) - (find-file new-path) - (message "File successfully moved to %s" dest)))) - (`overwrite-self (error "Cannot overwrite self")) - (`aborted (message "Aborted")) - (_ t))) + (unless (and buffer-file-name (file-exists-p buffer-file-name)) + (user-error "Buffer is not visiting any file")) + (let ((old-path (buffer-file-name (buffer-base-buffer))) + (new-path (expand-file-name new-path))) + (make-directory (file-name-directory new-path) 't) + (rename-file old-path new-path (or force-p 1)) + (set-visited-file-name new-path t t) + (doom--update-files old-path new-path) + (message "File moved to %S" (abbreviate-file-name new-path)))) (defun doom--sudo-file-path (file) (let ((host (or (file-remote-p file 'host) "localhost"))) diff --git a/core/autoload/help.el b/core/autoload/help.el index 3c5954d7d..060731b18 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -3,9 +3,6 @@ (defvar doom--help-major-mode-module-alist '((dockerfile-mode :tools docker) (agda2-mode :lang agda) - (haxor-mode :lang assembly) - (mips-mode :lang assembly) - (nasm-mode :lang assembly) (c-mode :lang cc) (c++-mode :lang cc) (objc++-mode :lang cc) @@ -41,6 +38,7 @@ (LaTeX-mode :lang latex) (ledger-mode :lang ledger) (lua-mode :lang lua) + (moonscript-mode :lang lua) (markdown-mode :lang markdown) (gfm-mode :lang markdown) (nim-mode :lang nim) @@ -48,6 +46,7 @@ (taureg-mode :lang ocaml) (org-mode :lang org) (perl-mode :lang perl) + (raku-mode :lang perl) (php-mode :lang php) (hack-mode :lang php) (plantuml-mode :lang plantuml) @@ -56,7 +55,9 @@ (restclient-mode :lang rest) (ruby-mode :lang ruby) (rust-mode :lang rust) + (rustic-mode :lang rust) (scala-mode :lang scala) + (scheme-mode :lang scheme) (sh-mode :lang sh) (swift-mode :lang swift) (web-mode :lang web) @@ -134,7 +135,8 @@ selection of all minor-modes, active or not." (list (or (+org-get-global-property "TITLE") (file-relative-name (buffer-file-name))))) path - (list (replace-regexp-in-string org-link-any-re "\\4" text))) + (when text + (list (replace-regexp-in-string org-link-any-re "\\4" text)))) " > ") tags) " ") diff --git a/core/autoload/projects.el b/core/autoload/projects.el index edce48b76..b71623bf6 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -101,11 +101,10 @@ If DIR is not a project, it will be indexed (but not cached)." (unless (file-readable-p dir) (error "Directory %S isn't readable" dir)) (let* ((default-directory (file-truename (expand-file-name dir))) - (project-root (doom-project-root default-directory)) - (projectile-project-root default-directory) + (projectile-project-root (doom-project-root default-directory)) (projectile-enable-caching projectile-enable-caching)) - (cond ((and project-root (file-equal-p project-root projectile-project-root)) - (unless (doom-project-p projectile-project-root) + (cond ((and projectile-project-root (file-equal-p projectile-project-root default-directory)) + (unless (doom-project-p default-directory) ;; Disable caching if this is not a real project; caching ;; non-projects easily has the potential to inflate the projectile ;; cache beyond reason. diff --git a/core/autoload/sessions.el b/core/autoload/sessions.el index 0d2833802..de08be93d 100644 --- a/core/autoload/sessions.el +++ b/core/autoload/sessions.el @@ -130,8 +130,11 @@ (interactive "P") (setq doom-autosave-session nil) (doom/quicksave-session) - (restart-emacs - (append (if debug (list "--debug-init")) - (when (boundp 'chemacs-current-emacs-profile) - (list "--with-profile" chemacs-current-emacs-profile)) - (list "--restore")))) + (save-some-buffers nil t) + (letf! ((#'save-buffers-kill-emacs #'kill-emacs) + (confirm-kill-emacs)) + (restart-emacs + (append (if debug (list "--debug-init")) + (when (boundp 'chemacs-current-emacs-profile) + (list "--with-profile" chemacs-current-emacs-profile)) + (list "--restore"))))) diff --git a/core/autoload/store.el b/core/autoload/store.el new file mode 100644 index 000000000..92ac05832 --- /dev/null +++ b/core/autoload/store.el @@ -0,0 +1,142 @@ +;;; core/autoload/cache.el -*- lexical-binding: t; -*- + +;; This little library abstracts the process of writing arbitrary elisp values +;; to a 2-tiered file store (in `doom-store-dir'/`doom-store-location'). + +(defvar doom-store-dir (concat doom-etc-dir "store/") + "Directory to look for and store data accessed through this API.") + +(defvar doom-store-persist-alist '(t) + "An alist of alists, containing lists of variables for the doom cache library +to persist across Emacs sessions.") + +(defvar doom-store-location "default" + "The default location for cache files. This symbol is translated into a file +name under `pcache-directory' (by default a subdirectory under +`doom-store-dir'). One file may contain multiple cache entries.") + +(defvar doom--store-table (make-hash-table :test 'equal)) +(defvar doom--inhibit-flush nil) + +(defun doom-save-persistent-store-h () + "Hook to run when an Emacs session is killed. Saves all persisted variables +listed in `doom-store-persist-alist' to files." + (let (locations) + (let ((doom--inhibit-flush t)) + (dolist (alist (butlast doom-store-persist-alist 1)) + (cl-loop with location = (car alist) + for var in (cdr alist) + do (doom-store-put var (symbol-value var) nil location) + and do (cl-pushnew location locations)))) + (mapc #'doom--store-flush locations))) +(add-hook 'kill-emacs-hook #'doom-save-persistent-store-h) + + +;; +;; Library + +;;;###autoload +(defun doom-store-persist (location variables) + "Persist VARIABLES (list of symbols) in LOCATION (symbol). +This populates these variables with cached values, if one exists, and saves them +to file when Emacs quits. This cannot persist buffer-local variables." + (dolist (var variables) + (when (doom-store-member-p var location) + (set var (doom-store-get var location)))) + (setf (alist-get location doom-store-persist-alist) + (append variables (alist-get location doom-store-persist-alist)))) + +;;;###autoload +(defun doom-store-desist (location &optional variables) + "Unregisters VARIABLES (list of symbols) in LOCATION (symbol). +Variables to persist are recorded in `doom-store-persist-alist'. Does not affect +the actual variables themselves or their values." + (if variables + (setf (alist-get location doom-store-persist-alist) + (cl-set-difference (cdr (assq location doom-store-persist-alist)) + variables)) + (delq! location doom-store-persist-alist 'assoc))) + +(defun doom--store-init (location) + (or (gethash location doom--store-table) + (let* ((file-name-handler-alist nil) + (location-path (expand-file-name location doom-store-dir))) + (if (file-exists-p location-path) + (puthash location + (with-temp-buffer + (set-buffer-multibyte nil) + (setq buffer-file-coding-system 'binary) + (insert-file-contents-literally location-path) + (read (current-buffer))) + doom--store-table) + (puthash location (make-hash-table :test 'equal) + doom--store-table))))) + +(defun doom--store-get (key location &optional default-value) + (let* ((location-data (doom--store-init location)) + (data (gethash key location-data default-value))) + (if (and (not (eq data default-value)) + (or (null (car data)) + (not (time-less-p (car data) (current-time))))) + (cdr data) + default-value))) + +(defun doom--store-put (key value location &optional ttl) + (puthash key (cons (if ttl (time-add (current-time) ttl)) value) + (doom--store-init location)) + (doom--store-flush location)) + +(defun doom--store-flush (location) + (unless doom--inhibit-flush + (let ((file-name-handler-alist nil) + (coding-system-for-write 'binary) + (write-region-annotate-functions nil) + (write-region-post-annotation-function nil) + (data (doom--store-init location))) + (make-directory doom-store-dir 'parents) + (with-temp-file (expand-file-name location doom-store-dir) + (prin1 data (current-buffer))) + data))) + + +;;;###autoload +(defun doom-store-get (key &optional location default-value) + "Retrieve KEY from LOCATION (defaults to `doom-store-location'). +If it doesn't exist or has expired, DEFAULT_VALUE is returned." + (doom--store-get key (or location doom-store-location) default-value)) + +;;;###autoload +(defun doom-store-put (key value &optional ttl location) + "Set KEY to VALUE in the store at LOCATION. +KEY can be any lisp object that is comparable with `equal'. TTL is the time (in +seconds) until this cache entry expires. LOCATION is the super-key to store this +cache item under. It defaults to `doom-store-location'." + (doom--store-put key value (or location doom-store-location) ttl)) + +;;;###autoload +(defun doom-store-rem (key &optional location) + "Clear a cache LOCATION (defaults to `doom-store-location')." + (let ((location (or location doom-store-location))) + (remhash key (doom--store-init location)) + (let ((table (doom--store-init "default"))) + (remhash 'test table) + table) + (doom--store-flush location))) + +;;;###autoload +(defun doom-store-member-p (key &optional location) + "Return t if KEY in LOCATION exists. +LOCATION defaults to `doom-store-location'." + (let ((nil-value (format "--nilvalue%s--" (current-time)))) + (not (equal (doom-store-get key location nil-value) + nil-value)))) + +;;;###autoload +(defun doom-store-clear (&optional location) + "Clear the store at LOCATION (defaults to `doom-store-location')." + (let* ((location (or location doom-store-location)) + (path (expand-file-name location doom-store-dir))) + (remhash location doom--store-table) + (when (file-exists-p path) + (delete-file path) + t))) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index cfc03ba57..8150513c3 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -32,14 +32,16 @@ one wants that.") (cl-check-type file string) (and (print! (start "Generating core autoloads...")) (doom-cli--write-autoloads - file (doom-cli--generate-autoloads - (cl-loop for dir - in (append (list doom-core-dir) - (cdr (doom-module-load-path 'all-p)) - (list doom-private-dir)) - if (doom-glob dir "autoload.el") collect it - if (doom-glob dir "autoload/*.el") append it) - 'scan)) + file + (doom-cli--generate-emacs-version-check) + (doom-cli--generate-autoloads + (cl-loop for dir + in (append (list doom-core-dir) + (cdr (doom-module-load-path 'all-p)) + (list doom-private-dir)) + if (doom-glob dir "autoload.el") collect it + if (doom-glob dir "autoload/*.el") append it) + 'scan)) (print! (start "Byte-compiling core autoloads file...")) (doom-cli--byte-compile-file file) (print! (success "Generated %s") @@ -105,6 +107,12 @@ one wants that.") (print! "M-x doom/restart") (print! "M-x doom/reload"))) +(defun doom-cli--generate-emacs-version-check () + `((unless (equal emacs-major-version (eval-when-compile emacs-major-version)) + (signal 'doom-error + (list "Your installed (major) version of Emacs has changed" + "Run 'doom sync && doom build' to bring Doom up to speed"))))) + (defun doom-cli--generate-var-cache (vars) `((setq ,@(cl-loop for var in vars append `(,var ',(symbol-value var)))))) diff --git a/core/cli/doctor.el b/core/cli/doctor.el index 5f790ccfa..22e690e2e 100644 --- a/core/cli/doctor.el +++ b/core/cli/doctor.el @@ -123,11 +123,8 @@ in." "both is rarely intentional; you should one or the other.")) ;; Check for fonts - (if (not (fboundp 'find-font)) - (progn - (warn! "Warning: unable to detect font") - (explain! "The `find-font' function is missing. This could indicate the incorrect " - "version of Emacs is being used!")) + (if (not (executable-find "fc-list")) + (warn! "Warning: unable to detect fonts because fontconfig isn't installed") ;; all-the-icons fonts (when (and (pcase system-type (`gnu/linux (concat (or (getenv "XDG_DATA_HOME") diff --git a/core/cli/env.el b/core/cli/env.el index bb546ede1..f13a838d3 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -113,10 +113,11 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in "# run 'doom sync'. To create a safe-to-edit envvar file use:\n#\n" "# doom env -o ~/.doom.d/myenv\n#\n" "# And load it with (doom-load-envvars-file \"~/.doom.d/myenv\").\n") - (concat "# This file is safe to edit by hand, but needs to be loaded manually with:\n#\n" + (concat "# This file is safe to edit by hand, but remember to preserve the null bytes at\n" + "# the end of each line! needs to be loaded manually with:\n#\n" "# (doom-load-envvars-file \"path/to/this/file\")\n#\n" "# Use 'doom env -o path/to/this/file' to regenerate it.")) - "# ---------------------------------------------------------------------------\n\n")) + "# ---------------------------------------------------------------------------\n\0\n")) ;; We assume that this noninteractive session was spawned from the ;; user's interactive shell, therefore we just dump ;; `process-environment' to a file. @@ -124,7 +125,7 @@ default, on Linux, this is '$SHELL -ic /usr/bin/env'. Variables in (if (cl-find-if (doom-rpartial #'string-match-p (car (split-string env "="))) doom-env-ignored-vars) (print! (info "Ignoring %s") env) - (insert env "\n"))) + (insert env "\0\n"))) (print! (success "Successfully generated %S") (path env-file)) t)))))) diff --git a/core/core-cli.el b/core/core-cli.el index cc1511b37..852f6fd43 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -258,7 +258,7 @@ BODY will be run when this dispatcher is called." (print! "%2s) %s" (1+ (length options)) (if (cl-find-if (doom-rpartial #'string-match-p desc) doom--cli-straight-discard-options) - (concat desc " (Recommended)") + (green (concat desc " (Recommended)")) desc)))) (terpri) (let* ((options diff --git a/core/core-editor.el b/core/core-editor.el index b08f53670..d4638d5c6 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -174,6 +174,8 @@ possible." (push '("/LICENSE\\'" . text-mode) auto-mode-alist) (push '("\\.log\\'" . text-mode) auto-mode-alist) +(push '("rc\\'" . conf-mode) auto-mode-alist) +(push '("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode) auto-mode-alist) ;; @@ -291,10 +293,7 @@ possible." `pp' can be expensive for longer lists, and there's no reason to prettify cache files, so we replace calls to `pp' with the much faster `prin1'." :around #'save-place-alist-to-file - (cl-letf (((symbol-function #'pp) #'prin1)) - (funcall orig-fn))) - - (save-place-mode +1)) + (letf! ((#'pp #'prin1)) (funcall orig-fn)))) (use-package! server @@ -392,18 +391,14 @@ files, so we replace calls to `pp' with the much faster `prin1'." `nim-mode'. This prevents them from leaving Emacs in a broken state." :around #'dtrt-indent-mode (let ((dtrt-indent-run-after-smie dtrt-indent-run-after-smie)) - (cl-letf* ((old-smie-config-guess (symbol-function 'smie-config-guess)) - (old-smie-config--guess (symbol-function 'symbol-config--guess)) - ((symbol-function 'symbol-config--guess) - (lambda (beg end) - (funcall old-smie-config--guess beg (min end 10000)))) - ((symbol-function 'smie-config-guess) - (lambda () - (condition-case e (funcall old-smie-config-guess) - (error (setq dtrt-indent-run-after-smie t) - (message "[WARNING] Indent detection: %s" - (error-message-string e)) - (message "")))))) ; warn silently + (letf! ((defun symbol-config--guess (beg end) + (funcall symbol-config--guess beg (min end 10000))) + (defun smie-config-guess () + (condition-case e (funcall smie-config-guess) + (error (setq dtrt-indent-run-after-smie t) + (message "[WARNING] Indent detection: %s" + (error-message-string e)) + (message ""))))) ; warn silently (funcall orig-fn arg))))) @@ -419,8 +414,8 @@ files, so we replace calls to `pp' with the much faster `prin1'." (defun doom-use-helpful-a (orig-fn &rest args) "Force ORIG-FN to use helpful instead of the old describe-* commands." - (cl-letf (((symbol-function #'describe-function) #'helpful-function) - ((symbol-function #'describe-variable) #'helpful-variable)) + (letf! ((#'describe-function #'helpful-function) + (#'describe-variable #'helpful-variable)) (apply orig-fn args))) (after! apropos @@ -484,8 +479,9 @@ files, so we replace calls to `pp' with the much faster `prin1'." (defun doom-init-smartparens-in-minibuffer-maybe-h () "Enable `smartparens-mode' in the minibuffer, during `eval-expression', `pp-eval-expression' or `evil-ex'." - (when (memq this-command '(eval-expression pp-eval-expression evil-ex)) - (smartparens-mode)))) + (and (memq this-command '(eval-expression pp-eval-expression evil-ex)) + smartparens-global-mode + (smartparens-mode)))) ;; You're likely writing lisp in the minibuffer, therefore, disable these ;; quote pairs, which lisps doesn't use for strings: diff --git a/core/core-keybinds.el b/core/core-keybinds.el index a79258aee..0e89a270c 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -77,7 +77,8 @@ all hooks after it are ignored.") :init ;; Convenience aliases (defalias 'define-key! #'general-def) - (defalias 'unmap! #'general-unbind)) + (defalias 'undefine-key! #'general-unbind)) + ;; HACK `map!' uses this instead of `define-leader-key!' because it consumes ;; 20-30% more startup time, so we reimplement it ourselves. @@ -108,8 +109,8 @@ all hooks after it are ignored.") (general--concat t doom-leader-key ,key) ,desc)))))))) (macroexp-progn - (cons `(after! which-key ,@(nreverse wkforms)) - (nreverse forms))))) + (append (and wkforms `((after! which-key ,@(nreverse wkforms)))) + (nreverse forms))))) (defmacro define-leader-key! (&rest args) "Define keys. @@ -220,16 +221,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See else do (error "not a valid state: %s" l))) -;; Register keywords for proper indentation (see `map!') -(put :after 'lisp-indent-function 'defun) -(put :desc 'lisp-indent-function 'defun) -(put :leader 'lisp-indent-function 'defun) -(put :localleader 'lisp-indent-function 'defun) -(put :map 'lisp-indent-function 'defun) -(put :mode 'lisp-indent-function 'defun) -(put :prefix 'lisp-indent-function 'defun) -(put :prefix-map 'lisp-indent-function 'defun) - ;; specials (defvar doom--map-forms nil) (defvar doom--map-fn nil) diff --git a/core/core-lib.el b/core/core-lib.el index 1bf435167..0dd055f72 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,8 +1,5 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(require 'cl-lib) -(require 'subr-x) - ;; ;;; Helpers @@ -85,6 +82,60 @@ Accepts the same arguments as `message'." format-string) ,@args)))) +(defun doom-try-run-hook (hook) + "Run HOOK (a hook function) with better error handling. +Meant to be used with `run-hook-wrapped'." + (doom-log "Running doom hook: %s" hook) + (condition-case e + (funcall hook) + ((debug error) + (signal 'doom-hook-error (list hook e)))) + ;; return nil so `run-hook-wrapped' won't short circuit + nil) + +(defun doom-load-autoloads-file (file &optional noerror) + "Tries to load FILE (an autoloads file). +Return t on success, nil otherwise (but logs a warning)." + (condition-case e + ;; Avoid `file-name-sans-extension' for premature optimization reasons. + ;; `string-remove-suffix' is much cheaper (because it does no file sanity + ;; checks during or after; just plain ol' string manipulation). + (load (string-remove-suffix ".el" file) noerror 'nomessage) + (doom-error + (signal (car e) (cdr e))) + ((debug error) + (message "Autoload file error: %s -> %s" (file-name-nondirectory file) e) + nil))) + +(defun doom-load-envvars-file (file &optional noerror) + "Read and set envvars from FILE. +If NOERROR is non-nil, don't throw an error if the file doesn't exist or is +unreadable. Returns the names of envvars that were changed." + (if (null (file-exists-p file)) + (unless noerror + (signal 'file-error (list "No envvar file exists" file))) + (when-let + (env + (with-temp-buffer + (save-excursion + (insert "\0\n") ; to prevent off-by-one + (insert-file-contents file)) + (save-match-data + (when (re-search-forward "\0\n *\\([^#= \n]*\\)=" nil t) + (setq + env (split-string (buffer-substring (match-beginning 1) (point-max)) + "\0\n" + 'omit-nulls)))))) + (setq process-environment (append (nreverse env) process-environment) + exec-path (append (split-string (getenv "PATH") path-separator t) + (list exec-directory)) + shell-file-name (or (getenv "SHELL") shell-file-name)) + env))) + + +;; +;;; Functional library + (defalias 'doom-partial #'apply-partially) (defun doom-rpartial (fn &rest args) @@ -119,6 +170,11 @@ aliases." (call-interactively command)))) (defalias 'lambda!! 'λ!!) +(defun dir! () + "Returns the directory of the emacs lisp file this macro is called from." + (when-let (path (file!)) + (directory-file-name (file-name-directory path)))) + (defun file! () "Return the emacs lisp file this macro is called from." (cond ((bound-and-true-p byte-compile-current-file)) @@ -128,10 +184,129 @@ aliases." (buffer-file-name) ((error "Cannot get this file-path")))) -(defun dir! () - "Returns the directory of the emacs lisp file this macro is called from." - (when-let (path (file!)) - (directory-file-name (file-name-directory path)))) +(defmacro letenv! (envvars &rest body) + "Lexically bind ENVVARS in BODY, like `let' but for `process-environment'." + (declare (indent 1)) + `(let ((process-environment (copy-sequence process-environment))) + (dolist (var (list ,@(cl-loop for (var val) in envvars + collect `(cons ,var ,val)))) + (setenv (car var) (cdr var))) + ,@body)) + +(defmacro letf! (bindings &rest body) + "Temporarily rebind function and macros in BODY. + +BINDINGS is either a) a list of, or a single, `defun' or `defmacro'-ish form, or +b) a list of (PLACE VALUE) bindings as `cl-letf*' would accept. + +TYPE is either `defun' or `defmacro'. NAME is the name of the function. If an +original definition for NAME exists, it can be accessed as a lexical variable by +the same name, for use with `funcall' or `apply'. ARGLIST and BODY are as in +`defun'. + +\(fn ((TYPE NAME ARGLIST &rest BODY) ...) BODY...)" + (declare (indent defun)) + (setq body (macroexp-progn body)) + (when (memq (car bindings) '(defun defmacro)) + (setq bindings (list bindings))) + (dolist (binding (nreverse bindings) body) + (let ((type (car binding)) + (rest (cdr binding))) + (setq + body (pcase type + (`defmacro `(cl-macrolet ((,(car rest) ,(cadr rest) ,@(cddr rest))) ,body)) + (`defun `(cl-letf* ((,(car rest) (symbol-function #',(car rest))) + ((symbol-function #',(car rest)) + (lambda ,(cadr rest) ,@(cddr rest)))) + ,body)) + (_ + (when (eq (car-safe type) 'function) + (setq type `(symbol-function ,type))) + `(cl-letf ((,type ,@rest)) ,body))))))) + +(defmacro quiet! (&rest forms) + "Run FORMS without generating any output. + +This silences calls to `message', `load-file', `write-region' and anything that +writes to `standard-output'." + `(cond (doom-debug-mode ,@forms) + ((not doom-interactive-mode) + (letf! ((standard-output (lambda (&rest _))) + (defun load-file (file) (load-file nil t)) + (defun message (&rest _)) + (defun write-region (start end filename &optional append visit lockname mustbenew) + (unless visit (setq visit 'no-message)) + (funcall write-region start end filename append visit lockname mustbenew))) + ,@forms)) + ((let ((inhibit-message t) + (save-silently t)) + (prog1 ,@forms (message "")))))) + +(defmacro if! (cond then &rest body) + "Expands to THEN if COND is non-nil, to BODY otherwise. +COND is checked at compile/expansion time, allowing BODY to be omitted +entirely when the elisp is byte-compiled. Use this for forms that contain +expensive macros that could safely be removed at compile time." + (declare (indent 2)) + (if (eval cond) + then + (macroexp-progn body))) + +(defmacro when! (cond &rest body) + "Expands to BODY if CONDITION is non-nil at compile/expansion time. +See `if!' for details on this macro's purpose." + (declare (indent 1)) + (when (eval cond) + (macroexp-progn body))) + + +;;; Mutation +(defmacro appendq! (sym &rest lists) + "Append LISTS to SYM in place." + `(setq ,sym (append ,sym ,@lists))) + +(defmacro setq! (&rest settings) + "A stripped-down `customize-set-variable' with the syntax of `setq'. + +Use this instead of `setq' when you know a variable has a custom setter (a :set +property in its `defcustom' declaration). This trigger setters. `setq' does +not." + (macroexp-progn + (cl-loop for (var val) on settings by 'cddr + collect (list (or (get var 'custom-set) #'set) + (list 'quote var) + val)))) + +(defmacro delq! (elt list &optional fetcher) + "`delq' ELT from LIST in-place. + +If FETCHER is a function, ELT is used as the key in LIST (an alist)." + `(setq ,list + (delq ,(if fetcher + `(funcall ,fetcher ,elt ,list) + elt) + ,list))) + +(defmacro pushnew! (place &rest values) + "Push VALUES sequentially into PLACE, if they aren't already present. +This is a variadic `cl-pushnew'." + (let ((var (make-symbol "result"))) + `(dolist (,var (list ,@values) (with-no-warnings ,place)) + (cl-pushnew ,var ,place :test #'equal)))) + +(defmacro prependq! (sym &rest lists) + "Prepend LISTS to SYM in place." + `(setq ,sym (append ,@lists ,sym))) + + +;;; Loading +(defmacro add-load-path! (&rest dirs) + "Add DIRS to `load-path', relative to the current file. +The current file is the file from which `add-to-load-path!' is used." + `(let ((default-directory ,(dir!)) + file-name-handler-alist) + (dolist (dir (list ,@dirs)) + (cl-pushnew (expand-file-name dir) load-path)))) (defmacro after! (package &rest body) "Evaluate BODY after PACKAGE have loaded. @@ -183,58 +358,84 @@ This is a wrapper around `eval-after-load' that: (setq body `((after! ,next ,@body)))) (car body)))))) -(defmacro setq! (&rest settings) - "A stripped-down `customize-set-variable' with the syntax of `setq'. +(defun doom--handle-load-error (e target path) + (let* ((source (file-name-sans-extension target)) + (err (cond ((not (featurep 'core)) + (cons 'error (file-name-directory path))) + ((file-in-directory-p source doom-core-dir) + (cons 'doom-error doom-core-dir)) + ((file-in-directory-p source doom-private-dir) + (cons 'doom-private-error doom-private-dir)) + ((cons 'doom-module-error doom-emacs-dir))))) + (signal (car err) + (list (file-relative-name + (concat source ".el") + (cdr err)) + e)))) -Use this instead of `setq' when you know a variable has a custom setter (a :set -property in its `defcustom' declaration). This trigger setters. `setq' does -not." - (macroexp-progn - (cl-loop for (var val) on settings by 'cddr - collect `(funcall (or (get ',var 'custom-set) #'set) - ',var ,val)))) +(defmacro load! (filename &optional path noerror) + "Load a file relative to the current executing file (`load-file-name'). -(defmacro pushnew! (place &rest values) - "Push VALUES sequentially into PLACE, if they aren't already present. -This is a variadic `cl-pushnew'." - (let ((var (make-symbol "result"))) - `(dolist (,var (list ,@values) (with-no-warnings ,place)) - (cl-pushnew ,var ,place :test #'equal)))) +FILENAME is either a file path string or a form that should evaluate to such a +string at run time. PATH is where to look for the file (a string representing a +directory path). If omitted, the lookup is relative to either `load-file-name', +`byte-compile-current-file' or `buffer-file-name' (checked in that order). -(defmacro prependq! (sym &rest lists) - "Prepend LISTS to SYM in place." - `(setq ,sym (append ,@lists ,sym))) +If NOERROR is non-nil, don't throw an error if the file doesn't exist." + (let* ((path (or path + (dir!) + (error "Could not detect path to look for '%s' in" + filename))) + (file (if path + `(expand-file-name ,filename ,path) + filename))) + `(condition-case-unless-debug e + (let (file-name-handler-alist) + (load ,file ,noerror 'nomessage)) + (doom-error (signal (car e) (cdr e))) + (error (doom--handle-load-error e ,file ,path))))) -(defmacro appendq! (sym &rest lists) - "Append LISTS to SYM in place." - `(setq ,sym (append ,sym ,@lists))) +(defmacro defer-until! (condition &rest body) + "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to +serve as a predicated alternative to `after!'." + (declare (indent defun) (debug t)) + `(if ,condition + (progn ,@body) + ,(let ((fn (intern (format "doom--delay-form-%s-h" (sxhash (cons condition body)))))) + `(progn + (fset ',fn (lambda (&rest args) + (when ,(or condition t) + (remove-hook 'after-load-functions #',fn) + (unintern ',fn nil) + (ignore args) + ,@body))) + (put ',fn 'permanent-local-hook t) + (add-hook 'after-load-functions #',fn))))) -(defmacro delq! (elt list &optional fetcher) - "`delq' ELT from LIST in-place. +(defmacro defer-feature! (feature &optional fn) + "Pretend FEATURE hasn't been loaded yet, until FEATURE-hook or FN runs. -If FETCHER is a function, ELT is used as the key in LIST (an alist)." - `(setq ,list - (delq ,(if fetcher - `(funcall ,fetcher ,elt ,list) - elt) - ,list))) +Some packages (like `elisp-mode' and `lisp-mode') are loaded immediately at +startup, which will prematurely trigger `after!' (and `with-eval-after-load') +blocks. To get around this we make Emacs believe FEATURE hasn't been loaded yet, +then wait until FEATURE-hook (or MODE-hook, if FN is provided) is triggered to +reverse this and trigger `after!' blocks at a more reasonable time." + (let ((advice-fn (intern (format "doom--defer-feature-%s-a" feature))) + (fn (or fn feature))) + `(progn + (setq features (delq ',feature features)) + (advice-add #',fn :before #',advice-fn) + (defun ,advice-fn (&rest _) + ;; Some plugins (like yasnippet) will invoke a fn early to parse + ;; code, which would prematurely trigger this. In those cases, well + ;; behaved plugins will use `delay-mode-hooks', which we can check for: + (when (and ,(intern (format "%s-hook" fn)) + (not delay-mode-hooks)) + ;; ...Otherwise, announce to the world this package has been loaded, + ;; so `after!' handlers can react. + (provide ',feature) + (advice-remove #',fn #',advice-fn)))))) -(defmacro letenv! (envvars &rest body) - "Lexically bind ENVVARS in BODY, like `let' but for `process-environment'." - (declare (indent 1)) - `(let ((process-environment (copy-sequence process-environment))) - (dolist (var (list ,@(cl-loop for (var val) in envvars - collect `(cons ,var ,val)))) - (setenv (car var) (cdr var))) - ,@body)) - -(defmacro add-load-path! (&rest dirs) - "Add DIRS to `load-path', relative to the current file. -The current file is the file from which `add-to-load-path!' is used." - `(let ((default-directory ,(dir!)) - file-name-handler-alist) - (dolist (dir (list ,@dirs)) - (cl-pushnew (expand-file-name dir) load-path)))) ;;; Hooks (defvar doom--transient-counter 0) @@ -360,106 +561,8 @@ If N and M = 1, there's no benefit to using this macro over `remove-hook'. in (doom--setq-hook-fns hooks vars 'singles) collect `(remove-hook ',hook #',fn)))) -(defmacro load! (filename &optional path noerror) - "Load a file relative to the current executing file (`load-file-name'). -FILENAME is either a file path string or a form that should evaluate to such a -string at run time. PATH is where to look for the file (a string representing a -directory path). If omitted, the lookup is relative to either `load-file-name', -`byte-compile-current-file' or `buffer-file-name' (checked in that order). - -If NOERROR is non-nil, don't throw an error if the file doesn't exist." - (let* ((path (or path - (dir!) - (error "Could not detect path to look for '%s' in" - filename))) - (file (if path - `(expand-file-name ,filename ,path) - filename))) - `(condition-case-unless-debug e - (let (file-name-handler-alist) - (load ,file ,noerror 'nomessage)) - (doom-error (signal (car e) (cdr e))) - (error - (let* ((source (file-name-sans-extension ,file)) - (err (cond ((not (featurep 'core)) - (cons 'error (file-name-directory path))) - ((file-in-directory-p source doom-core-dir) - (cons 'doom-error doom-core-dir)) - ((file-in-directory-p source doom-private-dir) - (cons 'doom-private-error doom-private-dir)) - ((cons 'doom-module-error doom-emacs-dir))))) - (signal (car err) - (list (file-relative-name - (concat source ".el") - (cdr err)) - e))))))) - -(defmacro defer-until! (condition &rest body) - "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to -serve as a predicated alternative to `after!'." - (declare (indent defun) (debug t)) - `(if ,condition - (progn ,@body) - ,(let ((fn (intern (format "doom--delay-form-%s-h" (sxhash (cons condition body)))))) - `(progn - (fset ',fn (lambda (&rest args) - (when ,(or condition t) - (remove-hook 'after-load-functions #',fn) - (unintern ',fn nil) - (ignore args) - ,@body))) - (put ',fn 'permanent-local-hook t) - (add-hook 'after-load-functions #',fn))))) - -(defmacro defer-feature! (feature &optional fn) - "Pretend FEATURE hasn't been loaded yet, until FEATURE-hook or FN runs. - -Some packages (like `elisp-mode' and `lisp-mode') are loaded immediately at -startup, which will prematurely trigger `after!' (and `with-eval-after-load') -blocks. To get around this we make Emacs believe FEATURE hasn't been loaded yet, -then wait until FEATURE-hook (or MODE-hook, if FN is provided) is triggered to -reverse this and trigger `after!' blocks at a more reasonable time." - (let ((advice-fn (intern (format "doom--defer-feature-%s-a" feature))) - (fn (or fn feature))) - `(progn - (setq features (delq ',feature features)) - (advice-add #',fn :before #',advice-fn) - (defun ,advice-fn (&rest _) - ;; Some plugins (like yasnippet) will invoke a fn early to parse - ;; code, which would prematurely trigger this. In those cases, well - ;; behaved plugins will use `delay-mode-hooks', which we can check for: - (when (and ,(intern (format "%s-hook" fn)) - (not delay-mode-hooks)) - ;; ...Otherwise, announce to the world this package has been loaded, - ;; so `after!' handlers can react. - (provide ',feature) - (advice-remove #',fn #',advice-fn)))))) - -(defmacro quiet! (&rest forms) - "Run FORMS without generating any output. - -This silences calls to `message', `load-file', `write-region' and anything that -writes to `standard-output'." - `(cond (doom-debug-mode ,@forms) - ((not doom-interactive-mode) - (let ((old-fn (symbol-function 'write-region))) - (cl-letf ((standard-output (lambda (&rest _))) - ((symbol-function 'load-file) (lambda (file) (load file nil t))) - ((symbol-function 'message) (lambda (&rest _))) - ((symbol-function 'write-region) - (lambda (start end filename &optional append visit lockname mustbenew) - (unless visit (setq visit 'no-message)) - (funcall old-fn start end filename append visit lockname mustbenew)))) - ,@forms))) - ((let ((inhibit-message t) - (save-silently t)) - (prog1 ,@forms (message "")))))) - - -;; ;;; Definers - (defmacro defadvice! (symbol arglist &optional docstring &rest body) "Define an advice called SYMBOL and add it to PLACES. diff --git a/core/core-modules.el b/core/core-modules.el index c0125b8dd..c866e1289 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -211,13 +211,15 @@ those directories. The first returned path is always `doom-private-dir'." (declare (pure t) (side-effect-free t)) (append (list doom-private-dir) (if module-dirs - (doom-files-in (if (listp module-dirs) - module-dirs - doom-modules-dirs) - :type 'dirs - :mindepth 1 - :depth 1) - (cl-loop for plist being the hash-values of (doom-modules) + (mapcar (lambda (m) (doom-module-locate-path (car m) (cdr m))) + (doom-files-in (if (listp module-dirs) + module-dirs + doom-modules-dirs) + :map #'doom-module-from-path + :type 'dirs + :mindepth 1 + :depth 1)) + (cl-loop for plist being the hash-values of doom-modules collect (plist-get plist :path))) nil)) @@ -481,39 +483,6 @@ WARNINGS: (lambda () ,@body) 'append))) -(defmacro require! (category module &rest flags) - "Loads the CATEGORY MODULE module with FLAGS. - -CATEGORY is a keyword, MODULE is a symbol and FLAGS are symbols. - - (require! :lang php +lsp) - -This is for testing and internal use. This is not the correct way to enable a -module." - `(let ((doom-modules (or ,doom-modules (doom-modules))) - (module-path (doom-module-locate-path ,category ',module))) - (doom-module-set - ,category ',module - (let ((plist (doom-module-get ,category ',module))) - ,(when flags - `(plist-put plist :flags `,flags)) - (unless (plist-member plist :path) - (plist-put plist :path ,(doom-module-locate-path category module))) - plist)) - (if (directory-name-p module-path) - (condition-case-unless-debug ex - (let ((doom--current-module ',(cons category module)) - (doom--current-flags ',flags)) - (load! "init" module-path :noerror) - (load! "config" module-path :noerror)) - ('error - (lwarn 'doom-modules :error - "%s in '%s %s' -> %s" - (car ex) ,category ',module - (error-message-string ex)))) - (warn 'doom-modules :warning "Couldn't find module '%s %s'" - ,category ',module)))) - (defmacro featurep! (category &optional module flag) "Returns t if CATEGORY MODULE is enabled. @@ -538,18 +507,5 @@ CATEGORY and MODULE can be omitted When this macro is used from inside a module (memq category (doom-module-get (car module) (cdr module) :flags))))) t)) -;; DEPRECATED -(defmacro def-package! (&rest args) - "Do not use this macro. Use `use-package!' instead." - (warn "`def-package!' is deprecated and was renamed to `use-package!'") - `(use-package! ,@args)) -(make-obsolete 'def-package! 'use-package! "2.0.9") - -(defmacro def-package-hook! (&rest args) - "Do not use this macro. Use `use-package!' instead." - (warn "`def-package-hook!' is deprecated and was renamed to `use-package-hook!'") - `(use-package-hook! ,@args)) -(make-obsolete 'def-package-hook! 'use-package-hook! "2.0.9") - (provide 'core-modules) ;;; core-modules.el ends here diff --git a/core/core-packages.el b/core/core-packages.el index 416e0f2d0..1ad951a37 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -269,9 +269,13 @@ elsewhere." recipe ;; Expand :local-repo from current directory (when local-repo - (plist-put! plist :recipe - (plist-put recipe :local-repo - (expand-file-name local-repo ,(dir!))))))) + (plist-put! + plist :recipe + (plist-put recipe :local-repo + (let ((local-path (expand-file-name local-repo ,(dir!)))) + (if (file-directory-p local-path) + local-path + local-repo))))))) (error (signal 'doom-package-error (cons ,(symbol-name name) diff --git a/core/core-projects.el b/core/core-projects.el index 8b65e1ee9..04310ffe7 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -15,9 +15,6 @@ Emacs.") "fd") "name of `fd-find' executable binary") -(defvar doom-projectile-cache-timer-file (concat doom-cache-dir "projectile.timers") - "Where to save project file cache timers.") - ;; ;;; Packages @@ -43,6 +40,16 @@ Emacs.") :config (projectile-mode +1) + ;; REVIEW Resolve the project root once, when the file/buffer is opened. This + ;; speeds up projectile's project root resolution by leaps, but does + ;; put you at risk of having a stale project root. + (setq-hook! '(change-major-mode-after-body-hook + ;; In case the user saves the file to a new location + after-save-hook + ;; ...or makes external changes then returns to Emacs + focus-in-hook) + projectile-project-root (if default-directory (doom-project-root))) + ;; Projectile runs four functions to determine the root (in this order): ;; ;; + `projectile-root-local' -> checks the `projectile-project-root' variable @@ -139,7 +146,7 @@ c) are not valid projectile projects." ;; .gitignore. This is recommended in the projectile docs. ((executable-find doom-projectile-fd-binary) (setq projectile-generic-command - (format "%s . --color=never --type f -0 -H -E .git" + (format "%s . -0 -H -E .git --color=never --type file --type symlink --follow" doom-projectile-fd-binary) projectile-git-command projectile-generic-command projectile-git-submodule-command nil @@ -149,9 +156,11 @@ c) are not valid projectile projects." ;; Otherwise, resort to ripgrep, which is also faster than find ((executable-find "rg") (setq projectile-generic-command - (concat "rg -0 --files --color=never --hidden" + (concat "rg -0 --files --follow --color=never --hidden" (cl-loop for dir in projectile-globally-ignored-directories - concat (format " --glob '!%s'" dir))) + concat " --glob " + concat (shell-quote-argument (concat "!" dir))) + (if IS-WINDOWS " --path-separator /")) projectile-git-command projectile-generic-command projectile-git-submodule-command nil ;; ensure Windows users get rg's benefits diff --git a/core/core-ui.el b/core/core-ui.el index da17eeafe..9b590b668 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -54,6 +54,9 @@ examples. It is recommended you don't set specify a font-size, as to inherit `doom-font's size.") +(defvar doom-unicode-extra-fonts nil + "Fonts to inject into the unicode charset before `doom-unicode-font'.") + ;; ;;; Custom hooks @@ -85,48 +88,51 @@ size.") (defvar doom--last-frame nil) (defun doom-run-switch-window-hooks-h () - (let ((gc-cons-threshold most-positive-fixnum)) - (unless (or doom-inhibit-switch-window-hooks - (eq doom--last-window (selected-window)) - (minibufferp)) - (let ((doom-inhibit-switch-window-hooks t) - (inhibit-redisplay t)) - (run-hooks 'doom-switch-window-hook) - (setq doom--last-window (selected-window)))))) + (unless (or doom-inhibit-switch-window-hooks + (eq doom--last-window (selected-window)) + (minibufferp)) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-window-hooks t) + (inhibit-redisplay t)) + (run-hooks 'doom-switch-window-hook) + (setq doom--last-window (selected-window))))) (defun doom-run-switch-frame-hooks-h (&rest _) (unless (or doom-inhibit-switch-frame-hooks (eq doom--last-frame (selected-frame)) (frame-parameter nil 'parent-frame)) - (let ((doom-inhibit-switch-frame-hooks t)) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-frame-hooks t)) (run-hooks 'doom-switch-frame-hook) (setq doom--last-frame (selected-frame))))) (defun doom-run-switch-buffer-hooks-a (orig-fn buffer-or-name &rest args) - (let ((gc-cons-threshold most-positive-fixnum)) - (if (or doom-inhibit-switch-buffer-hooks - (eq (current-buffer) (get-buffer buffer-or-name)) - (and (eq orig-fn #'switch-to-buffer) (car args))) - (apply orig-fn buffer-or-name args) - (let ((doom-inhibit-switch-buffer-hooks t) - (inhibit-redisplay t)) - (when-let (buffer (apply orig-fn buffer-or-name args)) - (with-current-buffer (if (windowp buffer) - (window-buffer buffer) - buffer) - (run-hooks 'doom-switch-buffer-hook)) - buffer))))) + (if (or doom-inhibit-switch-buffer-hooks + (and buffer-or-name + (eq (current-buffer) + (get-buffer buffer-or-name))) + (and (eq orig-fn #'switch-to-buffer) (car args))) + (apply orig-fn buffer-or-name args) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-buffer-hooks t) + (inhibit-redisplay t)) + (when-let (buffer (apply orig-fn buffer-or-name args)) + (with-current-buffer (if (windowp buffer) + (window-buffer buffer) + buffer) + (run-hooks 'doom-switch-buffer-hook)) + buffer)))) (defun doom-run-switch-to-next-prev-buffer-hooks-a (orig-fn &rest args) - (let ((gc-cons-threshold most-positive-fixnum)) - (if doom-inhibit-switch-buffer-hooks - (apply orig-fn args) - (let ((doom-inhibit-switch-buffer-hooks t) - (inhibit-redisplay t)) - (when-let (buffer (apply orig-fn args)) - (with-current-buffer buffer - (run-hooks 'doom-switch-buffer-hook)) - buffer))))) + (if doom-inhibit-switch-buffer-hooks + (apply orig-fn args) + (let ((gc-cons-threshold most-positive-fixnum) + (doom-inhibit-switch-buffer-hooks t) + (inhibit-redisplay t)) + (when-let (buffer (apply orig-fn args)) + (with-current-buffer buffer + (run-hooks 'doom-switch-buffer-hook)) + buffer)))) (defun doom-protect-fallback-buffer-h () "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." @@ -278,9 +284,6 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (setq indicate-buffer-boundaries nil indicate-empty-lines nil) -;; remove continuation arrow on right fringe -(delq! 'continuation fringe-indicator-alist 'assq) - ;; ;;; Windows/frames @@ -303,7 +306,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (add-to-list 'default-frame-alist '(tool-bar-lines . 0)) (add-to-list 'default-frame-alist '(vertical-scroll-bars))) -(when IS-MAC +(when! IS-MAC ;; Curse Lion and its sudden but inevitable fullscreen mode! ;; NOTE Meaningless to railwaycat's emacs-mac build (setq ns-use-native-fullscreen nil) @@ -413,16 +416,9 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (set-window-configuration doom--ediff-saved-wconf))))) -(use-package! goto-addr - :hook (text-mode . goto-address-mode) - :hook (prog-mode . goto-address-prog-mode) - :config - (define-key goto-address-highlight-keymap (kbd "RET") #'goto-address-at-point)) - - (use-package! hl-line ;; Highlights the current line - :hook ((prog-mode text-mode conf-mode) . hl-line-mode) + :hook ((prog-mode text-mode conf-mode special-mode) . hl-line-mode) :config ;; Not having to render the hl-line overlay in multiple buffers offers a tiny ;; performance boost. I also don't need to see it in other buffers. @@ -488,6 +484,14 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon) + :preface + (setq doom-unicode-extra-fonts + (list "Weather Icons" + "github-octicons" + "FontAwesome" + "all-the-icons" + "file-icons" + "Material Icons")) :config (cond ((daemonp) (defadvice! doom--disable-all-the-icons-in-tty-a (orig-fn &rest args) @@ -582,8 +586,9 @@ behavior). Do not set this directly, this is let-bound in `doom-init-theme-h'.") (set-face-attribute 'fixed-pitch-serif nil :font doom-serif-font)) (when doom-variable-pitch-font (set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font)) - (when (and doom-unicode-font (fboundp 'set-fontset-font)) - (set-fontset-font t 'unicode doom-unicode-font nil 'prepend))) + (when (fboundp 'set-fontset-font) + (dolist (font (append doom-unicode-extra-fonts (doom-enlist doom-unicode-font))) + (set-fontset-font t 'unicode font nil 'prepend)))) ((debug error) (if (string-prefix-p "Font not available: " (error-message-string e)) (lwarn 'doom-ui :warning @@ -598,22 +603,30 @@ behavior). Do not set this directly, this is let-bound in `doom-init-theme-h'.") (let ((doom--prefer-theme-elc t)) ; DEPRECATED in Emacs 27 (load-theme doom-theme t))))) -(defadvice! doom--run-load-theme-hooks-a (theme &optional _no-confirm no-enable) - "Set up `doom-load-theme-hook' to run after `load-theme' is called." - :after-while #'load-theme - (unless no-enable - (setq doom-theme theme - doom-init-theme-p t) - (run-hooks 'doom-load-theme-hook))) +(defadvice! doom--load-theme-a (orig-fn theme &optional no-confirm no-enable) + "Run `doom-load-theme-hook' on `load-theme' and fix its issues. -(defadvice! doom--disable-enabled-themes-a (theme &optional _no-confirm no-enable) - "Disable previously enabled themes before loading a new one. -Otherwise, themes can conflict with each other." - :after-while #'load-theme - (unless no-enable - (mapc #'disable-theme (remq theme custom-enabled-themes)))) +1. Disable previously enabled themes. +2. Don't let face-remapping screw up loading the new theme + (*cough*`mixed-pitch-mode'). +3. Record the current theme in `doom-theme'." + :around #'load-theme + ;; HACK Run `load-theme' from an estranged buffer, where we can be assured + ;; that buffer-local face remaps (by `mixed-pitch-mode', for instance) + ;; won't interfere with changing themes. + (with-temp-buffer + (when-let (result (funcall orig-fn theme no-confirm no-enable)) + (unless no-enable + (setq doom-theme theme + doom-init-theme-p t) + ;; `load-theme' doesn't disable previously enabled themes, which seems + ;; like what you'd want. You could always use `enable-theme' to activate + ;; multiple themes instead. + (mapc #'disable-theme (remq theme custom-enabled-themes)) + (run-hooks 'doom-load-theme-hook)) + result))) -(unless EMACS27+ +(when! (not EMACS27+) ;; DEPRECATED Not needed in Emacs 27 (defadvice! doom--prefer-compiled-theme-a (orig-fn &rest args) "Have `load-theme' prioritize the byte-compiled theme. @@ -622,10 +635,8 @@ This offers a moderate boost in startup (or theme switch) time, so long as :around #'load-theme (if (or (null after-init-time) doom--prefer-theme-elc) - (cl-letf* ((old-locate-file (symbol-function 'locate-file)) - ((symbol-function 'locate-file) - (lambda (filename path &optional _suffixes predicate) - (funcall old-locate-file filename path '("c" "") predicate)))) + (letf! (defun locate-file (filename path &optional _suffixes predicate) + (funcall locate-file filename path '("c" "") predicate)) (apply orig-fn args)) (apply orig-fn args)))) diff --git a/core/core.el b/core/core.el index 9a9b5d0db..713799e90 100644 --- a/core/core.el +++ b/core/core.el @@ -8,11 +8,16 @@ "Current version of Doom Emacs.") (defconst EMACS27+ (> emacs-major-version 26)) +(defconst EMACS28+ (> emacs-major-version 27)) (defconst IS-MAC (eq system-type 'darwin)) (defconst IS-LINUX (eq system-type 'gnu/linux)) (defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) (defconst IS-BSD (or IS-MAC (eq system-type 'berkeley-unix))) +;; Unix tools looks for HOME, but this is normally not defined on Windows. +(when (and IS-WINDOWS (null (getenv "HOME"))) + (setenv "HOME" (getenv "USERPROFILE"))) + ;; Ensure `doom-core-dir' is in `load-path' (add-to-list 'load-path (file-name-directory load-file-name)) @@ -39,6 +44,8 @@ (add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h)) ;; Just the bare necessities +(require 'subr-x) +(require 'cl-lib) (require 'core-lib) @@ -196,29 +203,30 @@ users).") (setq gnutls-verify-error (not (getenv "INSECURE")) gnutls-algorithm-priority (when (boundp 'libgnutls-version) - (concat "SECURE128:+SECURE192:-VERS-ALL:+VERS-TLS1.2" + (concat "SECURE128:+SECURE192:-VERS-ALL" (if (and (not IS-WINDOWS) (not (version< emacs-version "26.3")) (>= libgnutls-version 30605)) - ":+VERS-TLS1.3"))) + ":+VERS-TLS1.3") + ":+VERS-TLS1.2")) ;; `gnutls-min-prime-bits' is set based on recommendations from ;; https://www.keylength.com/en/4/ gnutls-min-prime-bits 3072 tls-checktrust gnutls-verify-error - ;; Emacs is built with `gnutls' by default, so `tls-program' would not - ;; be used in that case. Otherwiese, people have reasons to not go with - ;; `gnutls', we use `openssl' instead. - ;; For more details, see https://redd.it/8sykl1 + ;; Emacs is built with `gnutls' by default, so `tls-program' would not be + ;; used in that case. Otherwise, people have reasons to not go with + ;; `gnutls', we use `openssl' instead. For more details, see + ;; https://redd.it/8sykl1 tls-program '("openssl s_client -connect %h:%p -CAfile %t -nbio -no_ssl3 -no_tls1 -no_tls1_1 -ign_eof" "gnutls-cli -p %p --dh-bits=3072 --ocsp --x509cafile=%t \ --strict-tofu --priority='SECURE192:+SECURE128:-VERS-ALL:+VERS-TLS1.2:+VERS-TLS1.3' %h" ;; compatibility fallbacks "gnutls-cli -p %p %h")) -;; Emacs stores authinfo in $HOME and in plaintext. Let's not do that, mkay? +;; Emacs stores `authinfo' in $HOME and in plain-text. Let's not do that, mkay? ;; This file stores usernames, passwords, and other such treasures for the ;; aspiring malicious third party. -(setq auth-sources (list (expand-file-name "authinfo.gpg" doom-etc-dir) +(setq auth-sources (list (concat doom-etc-dir "authinfo.gpg") "~/.authinfo.gpg")) ;; Emacs on Windows frequently confuses HOME (C:\Users\) and %APPDATA%, @@ -281,7 +289,7 @@ users).") (setq ffap-machine-p-known 'reject) ;; Font compacting can be terribly expensive, especially for rendering icon -;; fonts on Windows. Whether it has a noteable affect on Linux and Mac hasn't +;; fonts on Windows. Whether it has a notable affect on Linux and Mac hasn't ;; been determined, but we inhibit it there anyway. (setq inhibit-compacting-font-caches t) @@ -425,17 +433,6 @@ If this is a daemon session, load them all immediately instead." ;; ;;; Bootstrap helpers -(defun doom-try-run-hook (hook) - "Run HOOK (a hook function) with better error handling. -Meant to be used with `run-hook-wrapped'." - (doom-log "Running doom hook: %s" hook) - (condition-case e - (funcall hook) - ((debug error) - (signal 'doom-hook-error (list hook e)))) - ;; return nil so `run-hook-wrapped' won't short circuit - nil) - (defun doom-display-benchmark-h (&optional return-p) "Display a benchmark including number of packages and modules loaded. @@ -448,50 +445,6 @@ If RETURN-P, return the message as a string instead of displaying it." (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) -(defun doom-load-autoloads-file (file &optional noerror) - "Tries to load FILE (an autoloads file). -Return t on success, nil otherwise (but logs a warning)." - (condition-case e - (load (substring file 0 -3) noerror 'nomessage) - ((debug error) - (message "Autoload file error: %s -> %s" (file-name-nondirectory file) e) - nil))) - -(defun doom-load-envvars-file (file &optional noerror) - "Read and set envvars from FILE. -If NOERROR is non-nil, don't throw an error if the file doesn't exist or is -unreadable. Returns the names of envvars that were changed." - (if (not (file-readable-p file)) - (unless noerror - (signal 'file-error (list "Couldn't read envvar file" file))) - (let (envvars environment) - (with-temp-buffer - (save-excursion - (insert "\n") - (insert-file-contents file)) - (while (re-search-forward "\n *\\([^#= \n]*\\)=" nil t) - (push (match-string 1) envvars) - (push (buffer-substring - (match-beginning 1) - (1- (or (save-excursion - (when (re-search-forward "^\\([^= ]+\\)=" nil t) - (line-beginning-position))) - (point-max)))) - environment))) - (when environment - (setq process-environment - (append (nreverse environment) process-environment) - exec-path - (if (member "PATH" envvars) - (append (split-string (getenv "PATH") path-separator t) - (list exec-directory)) - exec-path) - shell-file-name - (if (member "SHELL" envvars) - (or (getenv "SHELL") shell-file-name) - shell-file-name)) - envvars)))) - (defun doom-initialize (&optional force-p noerror) "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). @@ -510,7 +463,7 @@ The overall load order of Doom is as follows: Module config.el files ~/.doom.d/config.el `doom-init-modules-hook' - `doom-after-init-hook' (`after-init-hook') + `doom-after-init-modules-hook' (`after-init-hook') `emacs-startup-hook' `doom-init-ui-hook' `window-setup-hook' diff --git a/core/packages.el b/core/packages.el index 6e22d9c1e..4d6494314 100644 --- a/core/packages.el +++ b/core/packages.el @@ -2,47 +2,44 @@ ;;; core/packages.el ;; core.el -(package! auto-minor-mode :pin "17cfa1b548") -(package! gcmh :pin "b1bde50891") +(package! auto-minor-mode :pin "17cfa1b54800fdef2975c0c0531dad34846a5065") +(package! gcmh :pin "b1bde5089169a74f62033d027e06e98cbeedd43f") ;; core-ui.el -(package! all-the-icons :pin "0b74fc3618") -(package! hide-mode-line :pin "88888825b5") -(package! highlight-numbers :pin "8b4744c7f4") -(package! rainbow-delimiters :pin "5125f4e476") -(package! restart-emacs :pin "9aa90d3df9") +(package! all-the-icons :pin "0b74fc361817e885580c3f3408079f949f5830e1") +(package! hide-mode-line :pin "88888825b5b27b300683e662fa3be88d954b1cea") +(package! highlight-numbers :pin "8b4744c7f46c72b1d3d599d4fb75ef8183dee307") +(package! rainbow-delimiters :pin "5125f4e47604ad36c3eb4706310fcafac729ca8c") +(package! restart-emacs :pin "9aa90d3df9e08bc420e1c9845ee3ff568e911bd9") ;; core-editor.el -(package! better-jumper :pin "6d240032ca") -(package! dtrt-indent :pin "9163cd990f") -(package! helpful :pin "c54e9ddbd6") +(package! better-jumper :pin "6d240032ca213ccb3347e25f26c29b6822bf03a7") +(package! dtrt-indent :pin "9163cd990fb1f43dafed3948c6e406c13a45a6be") +(package! helpful :pin "c54e9ddbd6a77858048c1a4c4b549de98af8f88e") (when IS-MAC - (package! ns-auto-titlebar :pin "1efc30d385")) -(package! pcre2el :pin "0b5b2a2c17") -(package! smartparens :pin "555626a43f") + (package! ns-auto-titlebar :pin "1efc30d38509647b417f05587fd7003457719256")) +(package! pcre2el :pin "0b5b2a2c173aab3fd14aac6cf5e90ad3bf58fa7d") +(package! smartparens :pin "555626a43f9bb1985aa9a0eb675f2b88b29702c8") (package! so-long :built-in 'prefer ; included in Emacs 27+ ;; REVIEW so-long is slated to be published to ELPA eventually, but until then ;; I've created my own mirror for it because git.savannah.gnu.org runs ;; on a potato. :recipe (:host github :repo "hlissner/emacs-so-long") - :pin "ed666b0716") + :pin "ed666b0716f60e8988c455804de24b55919e71ca") (package! ws-butler ;; Use my fork of ws-butler, which has a few choice improvements and ;; optimizations (the original has been abandoned). :recipe (:host github :repo "hlissner/ws-butler") - :pin "2bb49d3ee7") + :pin "2bb49d3ee7d2cba133bc7e9cdac416cd1c5e4fe0") (unless IS-WINDOWS (package! clipetty :recipe (:host github :repo "spudlyo/clipetty") - :pin "7ee3f9c52f")) + :pin "01b39044b9b65fa4ea7d3166f8b1ffab6f740362")) ;; core-projects.el -(package! projectile :pin "eec569dc32") +(package! projectile :pin "5cd261dd75f4d711c0016617621349e2a98b43aa") ;; core-keybinds.el -(package! general :pin "14ad4c888b") -(package! which-key :pin "8b49ae978c") - -;; autoload/cache.el -(package! persistent-soft :pin "a1e0ddf2a1") +(package! general :pin "42e38034cd2305fa7432866323c923979d8f9b06") +(package! which-key :pin "8b49ae978cceca65967f3544c236f32964ddbed0") diff --git a/docs/api.org b/docs/api.org index e4702ffc5..9c3f8e1c5 100644 --- a/docs/api.org +++ b/docs/api.org @@ -535,7 +535,7 @@ These are side-by-side comparisons, showing how to bind keys with and without ** Persist Emacs' initial frame position, dimensions and/or full-screen state across sessions #+BEGIN_SRC elisp ;; add to ~/.doom.d/config.el -(when-let (dims (doom-cache-get 'last-frame-size)) +(when-let (dims (doom-store-get 'last-frame-size)) (cl-destructuring-bind ((left . top) width height fullscreen) dims (setq initial-frame-alist (append initial-frame-alist @@ -546,7 +546,7 @@ These are side-by-side comparisons, showing how to bind keys with and without (fullscreen . ,fullscreen)))))) (defun save-frame-dimensions () - (doom-cache-set 'last-frame-size + (doom-store-set 'last-frame-size (list (frame-position) (frame-width) (frame-height) diff --git a/docs/getting_started.org b/docs/getting_started.org index 5745cbd2d..62dd8226f 100644 --- a/docs/getting_started.org +++ b/docs/getting_started.org @@ -343,9 +343,7 @@ provides, and ~bin/doom help COMMAND~ to display documentation for a particular #+begin_quote I recommend you add =~/.emacs.d/bin= to your ~PATH~ so you can call =doom= directly and from anywhere. Accomplish this by adding this to your .bashrc or -.zshrc file: - -~export PATH="$HOME/.emacs.d/bin:$PATH"~ +.zshrc file: ~export PATH=~/.emacs.d/bin:$PATH~ #+end_quote *** Install Doom Manually @@ -910,7 +908,7 @@ also be helpful for debugging. + define-key + global-set-key + map! -+ unmap! ++ undefine-key! + define-key! ** Writing your own modules diff --git a/docs/modules.org b/docs/modules.org index 4a8dc11d4..cd5b7e282 100644 --- a/docs/modules.org +++ b/docs/modules.org @@ -92,7 +92,6 @@ Modules that reconfigure or augment packages or features built into Emacs. Modules that bring support for a language or group of languages to Emacs. + [[file:../modules/lang/agda/README.org][agda]] - TODO -+ assembly - TODO + [[file:../modules/lang/cc/README.org][cc]] =+lsp= - TODO + [[file:../modules/lang/clojure/README.org][clojure]] =+lsp= - TODO + common-lisp - TODO @@ -112,11 +111,12 @@ Modules that bring support for a language or group of languages to Emacs. + [[file:../modules/lang/haskell/README.org][haskell]] =+dante +ghcide +lsp= - TODO + hy - TODO + [[file:../modules/lang/idris/README.org][idris]] - TODO ++ [[file:../modules/lang/json/README.org][json]] =+lsp= - TODO + java =+meghanada +lsp= - TODO + [[file:../modules/lang/javascript/README.org][javascript]] =+lsp= - JavaScript, TypeScript, and CoffeeScript support + julia =+lsp= - TODO + kotlin =+lsp+= - TODO -+ [[file:../modules/lang/latex/README.org][latex]] =+latexmk +cdlatex +fold= - TODO ++ [[file:../modules/lang/latex/README.org][latex]] =+latexmk +cdlatex +fold +lsp= - TODO + lean - TODO + [[file:../modules/lang/ledger/README.org][ledger]] - TODO + lua =+moonscript= - TODO @@ -129,7 +129,7 @@ Modules that bring support for a language or group of languages to Emacs. + [[file:../modules/lang/php/README.org][php]] =+lsp= - TODO + plantuml - TODO + purescript - TODO -+ [[file:../modules/lang/python/README.org][python]] =+lsp +pyenv +conda= - TODO ++ [[file:../modules/lang/python/README.org][python]] =+lsp +pyenv +conda +poetry= - TODO + qt - TODO + racket - TODO + [[file:../modules/lang/rest/README.org][rest]] - TODO @@ -143,6 +143,7 @@ Modules that bring support for a language or group of languages to Emacs. + swift =+lsp= - TODO + terra - TODO + web =+lsp= - HTML and CSS (SCSS/SASS/LESS/Stylus) support. ++ [[file:../modules/lang/yaml/README.org][yaml]] =+lsp= - TODO * :term Modules that offer terminal emulation. @@ -167,7 +168,7 @@ Small modules that give Emacs access to external tools & services. backend + [[file:../modules/tools/lsp/README.org][lsp]] =+peek= - TODO + macos - TODO -+ magit - TODO ++ [[file:../modules/tools/magit/README.org][magit]] =+forge= - TODO + make - TODO + pass - TODO + pdf - TODO diff --git a/init.example.el b/init.example.el index be49b185d..370dd77d4 100644 --- a/init.example.el +++ b/init.example.el @@ -1,11 +1,11 @@ ;;; init.el -*- lexical-binding: t; -*- -;; This file controls what Doom modules are enabled and what order they load in. -;; Remember to run 'doom sync' after modifying it! +;; This file controls what Doom modules are enabled and what order they load +;; in. Remember to run 'doom sync' after modifying it! ;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's -;; documentation. There you'll find information about all of Doom's modules -;; and what flags they support. +;; documentation. There you'll find information about all of Doom's +;; modules and what flags they support. ;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or ;; 'C-c g k' for non-vim users) to view its documentation. This works on @@ -34,7 +34,7 @@ ;;hydra ;;indent-guides ; highlighted indent columns modeline ; snazzy, Atom-inspired modeline, plus API - nav-flash ; blink the current line after jumping + ;;nav-flash ; blink cursor line after big motions ;;neotree ; a project drawer, like NERDTree for vim ophints ; highlight the region an operation acts on (popup +defaults) ; tame sudden yet inevitable temporary windows @@ -44,7 +44,7 @@ ;;unicode ; extended unicode support for various languages vc-gutter ; vcs diff in the fringe vi-tilde-fringe ; fringe tildes to mark beyond EOB - window-select ; visually switch windows + ;;window-select ; visually switch windows workspaces ; tab emulation, persistence & separate workspaces ;;zen ; distraction-free coding or writing @@ -104,14 +104,13 @@ :lang ;;agda ; types of types of types of types... - ;;assembly ; assembly for fun or debugging ;;cc ; C/C++/Obj-C madness ;;clojure ; java with a lisp ;;common-lisp ; if you've seen one lisp, you've seen them all ;;coq ; proofs-as-programs ;;crystal ; ruby at the speed of c ;;csharp ; unity, .NET, and mono shenanigans - data ; config/data formats + ;;data ; config/data formats ;;(dart +flutter) ; paint ui and not much else ;;elixir ; erlang done right ;;elm ; care for a cup of TEA? @@ -125,6 +124,7 @@ ;;(haskell +dante) ; a language that's lazier than I am ;;hy ; readability of scheme w/ speed of python ;;idris ; + ;;json ; At least it ain't XML ;;(java +meghanada) ; the poster child for carpal tunnel syndrome ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) ;;julia ; a better, faster MATLAB @@ -158,6 +158,7 @@ ;;swift ; who asked for emoji variables? ;;terra ; Earth and Moon in alignment for performance. ;;web ; the tubes + ;;yaml ; JSON, but readable :email ;;(mu4e +gmail) diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index 66a26291e..46b94c22b 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -42,10 +42,10 @@ org-gcal-fetch org-gcal-post-at-point org-gcal-delete-at-point) + :init + (defvar org-gcal-dir (concat doom-cache-dir "org-gcal/")) + (defvar org-gcal-token-file (concat org-gcal-dir "token.gpg")) :config ;; hack to avoid the deferred.el error (defun org-gcal--notify (title mes) (message "org-gcal::%s - %s" title mes))) - - -;; (use-package! alert) diff --git a/modules/app/calendar/packages.el b/modules/app/calendar/packages.el index 9f10dc730..a66ecac7b 100644 --- a/modules/app/calendar/packages.el +++ b/modules/app/calendar/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; app/calendar/packages.el -(package! calfw :pin "03abce9762") -(package! calfw-org :pin "03abce9762") -(package! org-gcal :pin "6821e34967") +(package! calfw :pin "03abce97620a4a7f7ec5f911e669da9031ab9088") +(package! calfw-org :pin "03abce97620a4a7f7ec5f911e669da9031ab9088") +(package! org-gcal :pin "2ee2b31547e6f4e33db70fb812d552e55d612fd6") diff --git a/modules/app/irc/packages.el b/modules/app/irc/packages.el index d4609d107..5c83b8060 100644 --- a/modules/app/irc/packages.el +++ b/modules/app/irc/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; app/irc/packages.el -(package! circe :pin "e5bf5f8974") -(package! circe-notifications :pin "291149ac12") +(package! circe :pin "e5bf5f89741a9c43aa406491e94dd8d58c302fb4") +(package! circe-notifications :pin "291149ac12877bbd062da993479d3533a26862b0") diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 1cf548212..98f121c83 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -101,10 +101,9 @@ ;;;###autoload (defun +rss-put-sliced-image-fn (spec alt &optional flags) "TODO" - (cl-letf (((symbol-function #'insert-image) - (lambda (image &optional alt _area _slice) - (let ((height (cdr (image-size image t)))) - (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1))))) + (letf! (defun insert-image (image &optional alt _area _slice) + (let ((height (cdr (image-size image t)))) + (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1))) (shr-put-image spec alt flags))) ;;;###autoload diff --git a/modules/app/rss/packages.el b/modules/app/rss/packages.el index 076686e55..544a39f89 100644 --- a/modules/app/rss/packages.el +++ b/modules/app/rss/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; app/rss/packages.el -(package! elfeed :pin "d0405e6386") -(package! elfeed-org :pin "77b6bbf222") +(package! elfeed :pin "d0405e63863e54a01200740a6717ac875eceabc1") +(package! elfeed-org :pin "77b6bbf222487809813de260447d31c4c59902c9") diff --git a/modules/app/twitter/packages.el b/modules/app/twitter/packages.el index 927619ae8..8ad7dd82e 100644 --- a/modules/app/twitter/packages.el +++ b/modules/app/twitter/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; app/twitter/packages.el -(package! twittering-mode :pin "114891e8fd") -(package! avy :pin "3bf83140fa") +(package! twittering-mode :pin "114891e8fdb4f06b1326a6cf795e49c205cf9e29") +(package! avy :pin "509471bad0e8094b8639729ec39ca141fae7d4bd") diff --git a/modules/checkers/grammar/config.el b/modules/checkers/grammar/config.el index 58a505fb5..f972eaa61 100644 --- a/modules/checkers/grammar/config.el +++ b/modules/checkers/grammar/config.el @@ -8,15 +8,16 @@ :init (setq langtool-default-language "en-US") :config (unless (or langtool-bin - langtool-language-tool-jar) - (setq langtool-language-tool-jar - (cond (IS-MAC + langtool-language-tool-jar + langtool-java-classpath) + (cond (IS-MAC + (setq langtool-language-tool-jar (locate-file "libexec/languagetool-commandline.jar" (doom-files-in "/usr/local/Cellar/languagetool" :type 'dirs - :depth 2))) - (IS-LINUX - "/usr/share/java/languagetool/languagetool-commandline.jar"))))) + :depth 2)))) + (IS-LINUX + (setq langtool-java-classpath "/usr/share/languagetool:/usr/share/java/languagetool/*"))))) ;; Detects weasel words, passive voice and duplicates. Proselint would be a diff --git a/modules/checkers/grammar/packages.el b/modules/checkers/grammar/packages.el index 052e9207c..3207a672d 100644 --- a/modules/checkers/grammar/packages.el +++ b/modules/checkers/grammar/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; checkers/grammar/packages.el -(package! langtool :pin "a71ed02ce0") -(package! writegood-mode :pin "b71757ec33") +(package! langtool :pin "a71ed02ce06920ae3cafd6708de1c21811ce14c3") +(package! writegood-mode :pin "b71757ec337e226909fb0422f0224e31acc71733") diff --git a/modules/checkers/spell/packages.el b/modules/checkers/spell/packages.el index 083a1cf12..254de3230 100644 --- a/modules/checkers/spell/packages.el +++ b/modules/checkers/spell/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; checkers/spell/packages.el -(package! flyspell-correct :pin "e765d1a3d9") +(package! flyspell-correct :pin "fd8ac7a4f922ce5ea1cc5d4583a7d584847cb6b5") (cond ((featurep! :completion ivy) - (package! flyspell-correct-ivy :pin "e765d1a3d9")) + (package! flyspell-correct-ivy)) ((featurep! :completion helm) - (package! flyspell-correct-helm :pin "e765d1a3d9")) - ((package! flyspell-correct-popup :pin "e765d1a3d9"))) + (package! flyspell-correct-helm)) + ((package! flyspell-correct-popup))) -(package! flyspell-lazy :pin "3ebf68cc9e") +(package! flyspell-lazy :pin "3ebf68cc9eb10c972a2de8d7861cbabbbce69570") diff --git a/modules/checkers/syntax/packages.el b/modules/checkers/syntax/packages.el index d4cf34bbc..a1db8dc40 100644 --- a/modules/checkers/syntax/packages.el +++ b/modules/checkers/syntax/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; checkers/syntax/packages.el -(package! flycheck :pin "f19a51c0f1") -(package! flycheck-popup-tip :pin "ef86aad907") +(package! flycheck :pin "246e1d4380721ca03962464f11d02dd1372860ce") +(package! flycheck-popup-tip :pin "ef86aad907f27ca076859d8d9416f4f7727619c6") (when (featurep! +childframe) - (package! flycheck-posframe :pin "2b3e94c2e4")) + (package! flycheck-posframe :pin "2b3e94c2e427ec9831c513007460c5ea9e2225a3")) ;; TODO flymake? diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 62a1a4f52..06b2459a6 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -11,9 +11,26 @@ company-require-match 'never company-global-modes '(not erc-mode message-mode help-mode gud-mode eshell-mode) - company-backends '(company-capf) company-frontends '(company-pseudo-tooltip-frontend - company-echo-metadata-frontend)) + company-echo-metadata-frontend) + + ;; Buffer-local backends will be computed when loading a major mode, so + ;; only specify a global default here. + company-backends '(company-capf) + + ;; Company overrides `company-active-map' based on + ;; `company-auto-complete-chars'; no magic please! + company-auto-complete-chars nil + + ;; Only search the current buffer for `company-dabbrev' (a backend that + ;; suggests text your open buffers). This prevents Company from causing + ;; lag once you have a lot of buffers open. + company-dabbrev-other-buffers nil + ;; Make `company-dabbrev' fully case-sensitive, to improve UX with + ;; domain-specific words with particular casing. + company-dabbrev-ignore-case nil + company-dabbrev-downcase nil) + :config (when (featurep! :editor evil) (add-hook 'company-mode-hook #'evil-normalize-keymaps) @@ -106,6 +123,8 @@ (ElispFeature . ,(all-the-icons-material "stars" :face 'all-the-icons-orange)) (ElispFace . ,(all-the-icons-material "format_paint" :face 'all-the-icons-pink))))) + (delq! 'company-echo-metadata-frontend company-frontends) + (defun +company-box-icons--elisp-fn (candidate) (when (derived-mode-p 'emacs-lisp-mode) (let ((sym (intern candidate))) diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el index 2006fe791..0fefa4d71 100644 --- a/modules/completion/company/packages.el +++ b/modules/completion/company/packages.el @@ -1,8 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/company/packages.el -(package! company :pin "61ddd9afb5") -(package! company-dict :pin "cd7b8394f6") -(package! company-prescient :pin "53307731f3") +(package! company :pin "6333fc4ebbbf4d28e834de8715561e984f149ecb") +(package! company-dict :pin "cd7b8394f6014c57897f65d335d6b2bd65dab1f4") +(package! company-prescient :pin "0f4a89bdec61395138d968a38d375e63ccfbed63") (when (featurep! +childframe) - (package! company-box :pin "8fc6168f2d")) + (package! company-box :pin "3814fcb14e92f4b85b19e664e216a7c8d5c7144d")) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index c27d30113..66e8d7b9a 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -101,14 +101,7 @@ be negative.") :config (set-popup-rule! "^\\*helm" :vslot -100 :size 0.22 :ttl nil) - ;; HACK Doom doesn't support these commands, which invite the user to install - ;; the package via ELPA. Force them to use +helm/* instead, because they work - ;; out of the box. - (advice-add #'helm-projectile-rg :override #'+helm/project-search) - (advice-add #'helm-projectile-ag :override #'+helm/project-search) - (advice-add #'helm-projectile-grep :override #'+helm/project-search) - - ;; Hide the modeline + ;; Hide the modeline in helm windows as it serves little purpose. (defun +helm--hide-mode-line (&rest _) (with-current-buffer (helm-buffer-get) (unless helm-mode-line-string diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index e16931e25..9b1bf3090 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -1,19 +1,19 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/helm/packages.el -(package! helm :pin "d978f20f4c") -(package! helm-rg :pin "785a80fe5c") -(package! helm-c-yasnippet :pin "65ca732b51") -(package! helm-company :pin "6eb5c2d730") +(package! helm :pin "b6db9fb47a8900704394e63b795f4a54cb4701a8") +(package! helm-rg :pin "785a80fe5cc87e27c5ea3d00a70049028d9e2847") +(package! helm-c-yasnippet :pin "65ca732b510bfc31636708aebcfe4d2d845b59b0") +(package! helm-company :pin "6eb5c2d730a60e394e005b47c1db018697094dde") (package! helm-describe-modes :recipe (:host github :repo "emacs-helm/helm-describe-modes") - :pin "11fb36af11") -(package! helm-projectile :pin "5328b74ddd") -(package! swiper-helm :pin "93fb6db87b") + :pin "11fb36af119b784539d31c6160002de1957408aa") +(package! helm-projectile :pin "5328b74dddcee8d1913803ca8167868831a07463") +(package! swiper-helm :pin "93fb6db87bc6a5967898b5fd3286954cc72a0008") (when (featurep! +fuzzy) - (package! helm-flx :pin "6640fac5cb")) + (package! helm-flx :pin "6640fac5cb16bee73c95b8ed1248a4e5e113690e")) (when (featurep! +childframe) - (package! posframe :pin "e62e584268")) + (package! posframe :pin "093b29a53cbeda6d637ccc9ef4dfc47123e79b9e")) (when (featurep! :lang org) - (package! helm-org :pin "b7a18dfc17")) -(package! helm-descbinds :pin "b725159823") + (package! helm-org :pin "b7a18dfc17e8b933956d61d68c435eee03a96c24")) +(package! helm-descbinds :pin "b72515982396b6e336ad7beb6767e95a80fca192") diff --git a/modules/completion/ido/packages.el b/modules/completion/ido/packages.el index fc694fbfc..a7bed5bed 100644 --- a/modules/completion/ido/packages.el +++ b/modules/completion/ido/packages.el @@ -1,8 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/ido/packages.el -(package! flx-ido :pin "17f5c9cb2a") -(package! ido-completing-read+ :pin "98d3a6e56b") -(package! ido-sort-mtime :pin "f638ff0c92") -(package! ido-vertical-mode :pin "16c4c1a112") -(package! crm-custom :pin "f1aaccf643") +(package! flx-ido :pin "17f5c9cb2af18aa6f52910ff4a5a63591261ced5") +(package! ido-completing-read+ :pin "98d3a6e56b1d3652da7b47f49f76d77f82ea80ba") +(package! ido-sort-mtime :pin "f638ff0c922af862f5211779f2311a27fde428eb") +(package! ido-vertical-mode :pin "16c4c1a112796ee0bcf401ea39d3e2643a89feaf") +(package! crm-custom :pin "f1aaccf64306a5f99d9bf7ba815d7ea41c15518d") diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 8688311b6..bfdf62690 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -129,7 +129,11 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." (ivy-rich-counsel-function-docstring (:face font-lock-doc-face)))) ;; Apply switch buffer transformers to `counsel-projectile-switch-to-buffer' as well 'counsel-projectile-switch-to-buffer - (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer)) + (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer) + 'counsel-bookmark + '(:columns + ((ivy-rich-candidate (:width 0.5)) + (ivy-rich-bookmark-filename (:width 60))))) ;; Remove built-in coloring of buffer list; we do our own (setq ivy-switch-buffer-faces-alist nil) @@ -260,9 +264,15 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." :override #'counsel--find-return-list (cl-destructuring-bind (find-program . args) (cond ((executable-find doom-projectile-fd-binary) - (cons doom-projectile-fd-binary (list "-t" "f" "-E" ".git"))) + (cons doom-projectile-fd-binary + (list "--color=never" "-E" ".git" + "--type" "file" "--type" "symlink" "--follow"))) ((executable-find "rg") - (split-string (format counsel-rg-base-command "--files --no-messages") " " t)) + (append (list "rg" "--files" "--follow" "--color=never" "--hidden" "--no-messages") + (cl-loop for dir in projectile-globally-ignored-directories + collect "--glob" + collect (concat "!" dir)) + (if IS-WINDOWS (list "--path-separator" "/")))) ((cons find-program args))) (unless (listp args) (user-error "`counsel-file-jump-args' is a list now, please customize accordingly.")) @@ -328,7 +338,9 @@ evil-ex-specific constructs, so we disable it solely in evil-ex." ;; posframe. (dolist (fn '(swiper counsel-rg counsel-grep counsel-git-grep)) (setf (alist-get fn ivy-posframe-display-functions-alist) - #'ivy-display-function-fallback))) + #'ivy-display-function-fallback)) + + (add-hook 'doom-reload-hook #'posframe-delete-all)) (use-package! flx diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 3f1b3ad4a..f7f6d57ab 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -1,23 +1,23 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/ivy/packages.el -(package! swiper :pin "64f05f4735") +(package! swiper :pin "9e0803cdb5b47e4e1844e8281516b46589ef26c7") (package! ivy) (package! ivy-hydra) (package! counsel) -(package! amx :pin "e512e74e83") -(package! counsel-projectile :pin "b556ed8995") -(package! ivy-rich :pin "596874d146") -(package! wgrep :pin "5977b8e000") +(package! amx :pin "7fb7b874291e0cdeb1f0acb18564a686ec86788d") +(package! counsel-projectile :pin "b556ed8995f375e57496f3482aef4b0def565de8") +(package! ivy-rich :pin "3f818b201769bc13cc75aa73645217e374136aca") +(package! wgrep :pin "5977b8e00051c9003ca96e9d35133e0dea68db2c") (if (featurep! +prescient) - (package! ivy-prescient :pin "53307731f3") + (package! ivy-prescient :pin "0f4a89bdec61395138d968a38d375e63ccfbed63") (when (featurep! +fuzzy) - (package! flx :pin "17f5c9cb2a"))) + (package! flx :pin "17f5c9cb2af18aa6f52910ff4a5a63591261ced5"))) (when (featurep! +childframe) - (package! ivy-posframe :pin "ae9bafe94f")) + (package! ivy-posframe :pin "ae9bafe94fe6b77b6fe45766ae6172646f6a5d50")) (when (featurep! +icons) - (package! all-the-icons-ivy :pin "a70cbfa1ef")) + (package! all-the-icons-ivy :pin "a70cbfa1effe36efc946a823a580cec686d5e88d")) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index f6099d74d..9bc931ae9 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -39,7 +39,7 @@ :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines :desc "List errors" "x" #'flymake-show-diagnostics-buffer - (:when (featurep! :tools flycheck) + (:when (featurep! :checkers syntax) :desc "List errors" "x" #'flycheck-list-errors) (:when (featurep! :tools lsp) :desc "LSP Code actions" "a" #'lsp-execute-code-action @@ -159,7 +159,7 @@ :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer :desc "Org Roam Capture" "c" #'org-roam-capture :desc "Find file" "f" #'org-roam-find-file - :desc "Show graph" "g" #'org-roam-graph-show + :desc "Show graph" "g" #'org-roam-graph :desc "Insert" "i" #'org-roam-insert :desc "Org Roam" "r" #'org-roam (:prefix ("d" . "by date") @@ -182,7 +182,7 @@ :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) (:when (featurep! :ui treemacs) :desc "Project sidebar" "p" #'+treemacs/toggle - :desc "Find file in project rsidebar" "P" #'+treemacs/find-file) + :desc "Find file in project rsidebar" "P" #'treemacs-find-file) (:when (featurep! :term shell) :desc "Toggle shell popup" "t" #'+shell/toggle :desc "Open shell here" "T" #'+shell/here) @@ -249,14 +249,14 @@ :desc "Indent style" "I" #'doom/toggle-indent-style :desc "Line numbers" "l" #'doom/toggle-line-numbers :desc "Word-wrap mode" "w" #'+word-wrap-mode - (:when (featurep! :tools flycheck) + (:when (featurep! :checkers syntax) :desc "Flycheck" "f" #'flycheck-mode) (:when (featurep! :ui indent-guides) :desc "Indent guides" "i" #'highlight-indent-guides-mode) (:when (featurep! :lang org +present) :desc "org-tree-slide mode" "p" #'+org-present/start) :desc "Read-only mode" "r" #'read-only-mode - (:when (featurep! :tools flyspell) + (:when (featurep! :checkers spell) :desc "Flyspell" "s" #'flyspell-mode) (:when (featurep! :lang org +pomodoro) :desc "Pomodoro timer" "t" #'org-pomodoro) @@ -543,14 +543,4 @@ ;;; treemacs (:when (featurep! :ui treemacs) "" #'+treemacs/toggle - "" #'+treemacs/find-file) - - ;;; yasnippet - (:after yasnippet - :map yas-keymap ; keymap while editing an inserted snippet - "C-e" #'+snippets/goto-end-of-field - "C-a" #'+snippets/goto-start-of-field - "" #'yas-prev-field - "" #'+snippets/delete-to-start-of-field - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field)) + "" #'treemacs-find-file)) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 4b1c155e2..7cc9a270a 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -4,9 +4,12 @@ ;; NOTE SPC u replaces C-u as the universal argument. ;; Minibuffer - (define-key! evil-ex-completion-map + (define-key! :keymaps '(evil-ex-completion-map evil-ex-search-keymap) "C-a" #'evil-beginning-of-line - "C-b" #'evil-backward-char) + "C-b" #'evil-backward-char + "C-f" #'evil-forward-char + "C-j" #'next-complete-history-element + "C-k" #'previous-complete-history-element) (define-key! :keymaps +default-minibuffer-maps [escape] #'abort-recursive-edit @@ -15,16 +18,20 @@ "C-u" #'evil-delete-back-to-indentation "C-v" #'yank "C-w" #'doom/delete-backward-word - "C-z" (λ! (ignore-errors (call-interactively #'undo))) - ;; Scrolling lines - "C-j" #'next-line - "C-k" #'previous-line - "C-S-j" #'scroll-up-command - "C-S-k" #'scroll-down-command) + "C-z" (λ! (ignore-errors (call-interactively #'undo)))) - (define-key! read-expression-map - "C-j" #'next-line-or-history-element - "C-k" #'previous-line-or-history-element)) + (when (featurep! :editor evil +everywhere) + (define-key! :keymaps +default-minibuffer-maps + "C-j" #'next-line + "C-k" #'previous-line + "C-S-j" #'scroll-up-command + "C-S-k" #'scroll-down-command) + (define-key! :states 'insert :keymaps +default-minibuffer-maps + "C-j" #'next-line + "C-k" #'previous-line) + (define-key! read-expression-map + "C-j" #'next-line-or-history-element + "C-k" #'previous-line-or-history-element))) ;; @@ -186,9 +193,9 @@ ;;; :ui (map! (:when (featurep! :ui popup) - :n "C-`" #'+popup/toggle - :n "C-~" #'+popup/raise - :g "C-x p" #'+popup/other) + "C-`" #'+popup/toggle + "C-~" #'+popup/raise + "C-x p" #'+popup/other) (:when (featurep! :ui workspaces) :n "C-t" #'+workspace/new @@ -489,7 +496,7 @@ :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer :desc "Org Roam Capture" "c" #'org-roam-capture :desc "Find file" "f" #'org-roam-find-file - :desc "Show graph" "g" #'org-roam-graph-show + :desc "Show graph" "g" #'org-roam-graph :desc "Insert" "i" #'org-roam-insert :desc "Org Roam" "r" #'org-roam (:prefix ("d" . "by date") @@ -522,7 +529,7 @@ :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) (:when (featurep! :ui treemacs) :desc "Project sidebar" "p" #'+treemacs/toggle - :desc "Find file in project sidebar" "P" #'+treemacs/find-file) + :desc "Find file in project sidebar" "P" #'treemacs-find-file) (:when (featurep! :term shell) :desc "Toggle shell popup" "t" #'+shell/toggle :desc "Open shell here" "T" #'+shell/here) diff --git a/modules/config/default/autoload/files.el b/modules/config/default/autoload/files.el index 3c90f6d23..e49e8255f 100644 --- a/modules/config/default/autoload/files.el +++ b/modules/config/default/autoload/files.el @@ -27,11 +27,15 @@ ;;;###autoload (defun +default/browse-notes () "Browse files from `org-directory'." - (interactive) (doom-project-browse org-directory)) + (interactive) + (require 'org) + (doom-project-browse org-directory)) ;;;###autoload (defun +default/find-in-notes () "Find a file under `org-directory', recursively." - (interactive) (doom-project-find-file org-directory)) + (interactive) + (require 'org) + (doom-project-find-file org-directory)) ;;;###autoload (defun +default/find-file-under-here () diff --git a/modules/config/default/autoload/search.el b/modules/config/default/autoload/search.el index dcd704895..bb3cb2445 100644 --- a/modules/config/default/autoload/search.el +++ b/modules/config/default/autoload/search.el @@ -25,7 +25,8 @@ If prefix ARG is set, prompt for a directory to search from." "Conduct a text search in the current project root. If prefix ARG is set, prompt for a known project to search from." (interactive "P") - (let* ((disabled-command-function nil) + (let* ((projectile-project-root nil) + (disabled-command-function nil) (default-directory (if arg (if-let (projects (projectile-relevant-known-projects)) @@ -51,13 +52,14 @@ If prefix ARG is set, prompt for a known project to search from." (interactive (list (rxt-quote-pcre (or (doom-thing-at-point-or-region) "")) current-prefix-arg)) - (let ((default-directory - (if arg - (if-let (projects (projectile-relevant-known-projects)) - (completing-read "Switch to project: " projects - nil t nil nil (doom-project-root)) - (user-error "There are no known projects")) - default-directory))) + (let* ((projectile-project-root nil) + (default-directory + (if arg + (if-let (projects (projectile-relevant-known-projects)) + (completing-read "Switch to project: " projects + nil t nil nil (doom-project-root)) + (user-error "There are no known projects")) + default-directory))) (cond ((featurep! :completion ivy) (+ivy/project-search nil symbol)) ((featurep! :completion helm) diff --git a/modules/config/default/autoload/text.el b/modules/config/default/autoload/text.el index 7c523817e..01141cc6e 100644 --- a/modules/config/default/autoload/text.el +++ b/modules/config/default/autoload/text.el @@ -50,21 +50,6 @@ If `buffer-file-name' isn't set, uses `default-directory'." (abbreviate-file-name path) (file-name-nondirectory path))))) -;;;###autoload -(defun +default--newline-indent-and-continue-comments-a () - "A replacement for `newline-and-indent'. - -Continues comments if executed from a commented line, with special support for -languages with weak native comment continuation support (like C-family -languages)." - (interactive) - (if (and (sp-point-in-comment) - comment-line-break-function) - (funcall comment-line-break-function nil) - (delete-horizontal-space t) - (newline nil t) - (indent-according-to-mode))) - (defun doom--backward-delete-whitespace-to-column () "Delete back to the previous column of whitespace, or as much whitespace as diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 490ec2a14..bbfc1ade7 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -1,5 +1,8 @@ ;;; config/default/config.el -*- lexical-binding: t; -*- +(defvar +default-want-RET-continue-comments t + "If non-nil, RET will continue commented lines.") + (defvar +default-minibuffer-maps (append '(minibuffer-local-map minibuffer-local-ns-map @@ -31,7 +34,10 @@ (after! epa ;; With GPG 2.1+, this forces gpg-agent to use the Emacs minibuffer to prompt ;; for the key passphrase. - (setq epa-pinentry-mode 'loopback) + (set (if EMACS27+ + 'epg-pinentry-mode + 'epa-pinentry-mode) ; DEPRECATED `epa-pinentry-mode' + 'loopback) ;; Default to the first secret key available in your keyring. (setq-default epa-file-encrypt-to @@ -217,8 +223,28 @@ ;; f) do none of this when inside a string (advice-add #'delete-backward-char :override #'+default--delete-backward-char-a)) - ;; Makes `newline-and-indent' continue comments (and more reliably) - (advice-add #'newline-and-indent :override #'+default--newline-indent-and-continue-comments-a)) + ;; HACK Makes `newline-and-indent' continue comments (and more reliably). + ;; Consults `doom-point-in-comment-functions' to detect a commented + ;; region and uses that mode's `comment-line-break-function' to continue + ;; comments. If neither exists, it will fall back to the normal behavior + ;; of `newline-and-indent'. + ;; + ;; We use an advice here instead of a remapping because many modes define + ;; and remap to their own newline-and-indent commands, and tackling all + ;; those cases was judged to be more work than dealing with the edge + ;; cases on a case by case basis. + (defadvice! +default--newline-indent-and-continue-comments-a (&rest _) + "A replacement for `newline-and-indent'. + +Continues comments if executed from a commented line. Consults +`doom-point-in-comment-functions' to determine if in a comment." + :before-until #'newline-and-indent + (interactive "*") + (when (and +default-want-RET-continue-comments + (doom-point-in-comment-p) + (fboundp comment-line-break-function)) + (funcall comment-line-break-function nil) + t))) ;; diff --git a/modules/config/default/packages.el b/modules/config/default/packages.el index 8178f8758..a4eb26ffe 100644 --- a/modules/config/default/packages.el +++ b/modules/config/default/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; config/default/packages.el -(package! avy :pin "3bf83140fa") -(package! drag-stuff :pin "6d06d846cd") -(package! link-hint :pin "0d9cabcdb7") +(package! avy :pin "509471bad0e8094b8639729ec39ca141fae7d4bd") +(package! drag-stuff :pin "6d06d846cd37c052d79acd0f372c13006aa7e7c8") +(package! link-hint :pin "7440704cacb5c0fab35fff8ec59d30fbea17f44a") (unless (featurep! :editor evil) - (package! expand-region :pin "ea6b4cbb99")) + (package! expand-region :pin "ea6b4cbb9985ddae532bd2faf9bb00570c9f2781")) diff --git a/modules/editor/evil/+commands.el b/modules/editor/evil/+commands.el index 9277c23ec..3bf6cf5e5 100644 --- a/modules/editor/evil/+commands.el +++ b/modules/editor/evil/+commands.el @@ -98,7 +98,7 @@ (evil-ex-define-cmd "tabsave" #'+workspace:save) ;;; Org-mode -(evil-ex-define-cmd "cap" #'org-capture) +(evil-ex-define-cmd "cap[ture]" #'org-capture) ;;; ibuffer (when (featurep! :emacs ibuffer) diff --git a/modules/editor/evil/README.org b/modules/editor/evil/README.org index 46053eaad..bbb2bd803 100644 --- a/modules/editor/evil/README.org +++ b/modules/editor/evil/README.org @@ -71,6 +71,7 @@ The following vim plugins have been ported to evil: | vim-lion | evil-lion | omap =gl= / =gL= | | vim-seek or vim-sneak | evil-snipe | mmap =s= / =S=, omap =z= / =Z= & =x= / =X= | | vim-surround | evil-embrace and evil-surround | vmap =S=, omap =ys= | +| vim-unimpaired | (provided by Doom) | [[https://github.com/hlissner/doom-emacs/blob/develop/modules/editor/evil/config.el#L413-L460][see the list]] | This module has also ported vim-unimpaired keybinds to Emacs. diff --git a/modules/editor/evil/autoload/advice.el b/modules/editor/evil/autoload/advice.el index 834f40315..bdf2ce8f9 100644 --- a/modules/editor/evil/autoload/advice.el +++ b/modules/editor/evil/autoload/advice.el @@ -7,7 +7,7 @@ (call-interactively #'doom/escape))) ;;;###autoload -(defun +evil-resolve-vim-path-a (file-name) +(defun +evil-replace-filename-modifiers-a (file-name) "Take a path and resolve any vim-like filename modifiers in it. This adds support for most vim file modifiers, as well as: @@ -15,66 +15,65 @@ support for most vim file modifiers, as well as: See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for more information on modifiers." - (let (case-fold-search) + (let ((origin-buffer (current-buffer)) + case-fold-search) (with-temp-buffer - (save-excursion (insert file-name)) - (while (re-search-forward "\\(^\\|[^\\\\]\\)\\(\\([%#]\\)\\(:\\([PphtreS~.]\\|g?s\\)\\)*\\)" nil t) - (catch 'continue - (unless buffer-file-name - (replace-match (match-string 1) t t nil 2) - (throw 'continue t)) - (let ((beg (match-beginning 2)) - (end (match-end 3)) - (path (pcase (match-string 3) - ("%" (file-relative-name buffer-file-name)) - ("#" (and (other-buffer) - (buffer-file-name (other-buffer))))))) - (save-match-data - (goto-char beg) - (while (re-search-forward ":\\([PphtreS~.]\\|g?s\\)" (+ (point) 3) t) - (let* ((modifier (match-string 1)) - (global (string-prefix-p "gs" modifier))) - (when global - (setq modifier (substring modifier 1))) - (setq end (match-end 1) - path - (or (when path - (pcase (substring modifier 0 1) - ("p" (expand-file-name path)) - ("~" (concat "~/" (file-relative-name path "~"))) - ("." (file-relative-name path default-directory)) - ("t" (file-name-nondirectory (directory-file-name path))) - ("r" (file-name-sans-extension path)) - ("e" (file-name-extension path)) - ("S" (shell-quote-argument path)) - ("h" - (let ((parent (file-name-directory (expand-file-name path)))) - (unless (file-equal-p path parent) - (if (file-name-absolute-p path) - (directory-file-name parent) - (file-relative-name parent))))) - ("s" - (if (featurep 'evil) - (when-let (args (evil-delimited-arguments (substring modifier 1) 2)) - (let ((pattern (evil-transform-vim-style-regexp (car args))) - (replace (cadr args))) - (replace-regexp-in-string - (if global pattern (concat "\\(" pattern "\\).*\\'")) - (evil-transform-vim-style-regexp replace) path t t - (unless global 1)))) - path)) - ("P" - (let ((project-root (doom-project-root (file-name-directory (expand-file-name path))))) - (unless project-root - (user-error "Not in a project")) - (abbreviate-file-name project-root))))) - "")) - ;; strip trailing slash, if applicable - (or (string-empty-p path) - (not (equal (substring path -1) "/")) - (setq path (substring path 0 -1)))))) - (replace-match path t t nil 2)))) - (replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" (buffer-string) t)))) + (let ((buffer-file-name (buffer-file-name origin-buffer))) + (save-excursion (insert file-name)) + (while (re-search-forward "\\(^\\|[^\\\\]\\)\\(\\([%#]\\)\\(:\\([PphtreS~.]\\|g?s\\)\\)*\\)" nil t) + (if (null buffer-file-name) + (replace-match (match-string 1) t t nil 2) + (let ((beg (match-beginning 2)) + (end (match-end 3)) + (path (pcase (match-string 3) + ("%" (file-relative-name buffer-file-name default-directory)) + ("#" (and (other-buffer origin-buffer) + (buffer-file-name (other-buffer origin-buffer))))))) + (save-match-data + (goto-char beg) + (while (re-search-forward ":\\([PphtreS~.]\\|g?s\\)" (+ (point) 3) t) + (let* ((modifier (match-string 1)) + (global (string-prefix-p "gs" modifier))) + (when global + (setq modifier (substring modifier 1))) + (setq end (match-end 1) + path + (pcase (and path (substring modifier 0 1)) + (`nil "") + ("p" (expand-file-name path)) + ("~" (concat "~/" (file-relative-name path "~"))) + ("." (file-relative-name path)) + ("t" (file-name-nondirectory (directory-file-name path))) + ("r" (file-name-sans-extension path)) + ("e" (file-name-extension path)) + ("S" (shell-quote-argument path)) + ("h" + (let ((parent (file-name-directory (expand-file-name path)))) + (unless (file-equal-p path parent) + (if (file-name-absolute-p path) + (directory-file-name parent) + (file-relative-name parent))))) + ("s" + (if (featurep 'evil) + (when-let (args (evil-delimited-arguments (substring modifier 1) 2)) + (let ((pattern (evil-transform-vim-style-regexp (car args))) + (replace (cadr args))) + (replace-regexp-in-string + (if global pattern (concat "\\(" pattern "\\).*\\'")) + (evil-transform-vim-style-regexp replace) path t t + (unless global 1)))) + path)) + ("P" + (let ((project-root (doom-project-root (file-name-directory (expand-file-name path))))) + (unless project-root + (user-error "Not in a project")) + (abbreviate-file-name project-root))))) + ;; strip trailing slash, if applicable + (or (string-empty-p path) + (not (equal (substring path -1) "/")) + (setq path (substring path 0 -1)))))) + (replace-match path t t nil 2)))) + (replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" (buffer-string) t))))) (defun +evil--insert-newline (&optional above _noextranewline) (let ((pos (save-excursion (beginning-of-line-text) (point))) @@ -124,8 +123,7 @@ more information on modifiers." (not (eq this-command 'evil-open-below)) (evil-insert-state-p)) (funcall orig-fn count) - (cl-letf (((symbol-function 'evil-insert-newline-below) - (lambda () (+evil--insert-newline)))) + (letf! (defun evil-insert-newline-below () (+evil--insert-newline)) (let ((evil-auto-indent evil-auto-indent)) (funcall orig-fn count))))) @@ -135,8 +133,7 @@ more information on modifiers." (not (eq this-command 'evil-open-above)) (evil-insert-state-p)) (funcall orig-fn count) - (cl-letf (((symbol-function 'evil-insert-newline-above) - (lambda () (+evil--insert-newline 'above)))) + (letf! (defun evil-insert-newline-above () (+evil--insert-newline 'above)) (let ((evil-auto-indent evil-auto-indent)) (funcall orig-fn count))))) diff --git a/modules/editor/evil/autoload/ex.el b/modules/editor/evil/autoload/ex.el index 09b18ed70..bdcb5d6fa 100644 --- a/modules/editor/evil/autoload/ex.el +++ b/modules/editor/evil/autoload/ex.el @@ -108,7 +108,7 @@ g Repeat alignment on all matches in each line" If BANG is non-nil, open compilation output in a comint buffer. If BANG, then run ARGUMENTS as a full command. This command understands vim file -modifiers (like %:p:h). See `+evil-resolve-vim-path-a' for details." +modifiers (like %:p:h). See `+evil-replace-filename-modifiers-a' for details." (interactive "") (let ((compile-command "make")) (+evil:compile (if (stringp arguments) @@ -122,7 +122,7 @@ modifiers (like %:p:h). See `+evil-resolve-vim-path-a' for details." If BANG is non-nil, open compilation output in a comint buffer. This command understands vim file modifiers (like %:p:h). See -`+evil-resolve-vim-path-a' for details." +`+evil-replace-filename-modifiers-a' for details." (interactive "") (compile (evil-ex-replace-special-filenames (format "%s %s" diff --git a/modules/editor/evil/autoload/files.el b/modules/editor/evil/autoload/files.el index ac3daed1b..93de22915 100644 --- a/modules/editor/evil/autoload/files.el +++ b/modules/editor/evil/autoload/files.el @@ -6,8 +6,7 @@ kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." :repeat nil (interactive "") - (doom/delete-this-file (or filename (file-truename buffer-file-name)) - force-p)) + (doom/delete-this-file filename force-p)) ;;;###autoload (autoload '+evil:move-this-file "editor/evil/autoload/files" nil t) (evil-define-command +evil:move-this-file (new-path &optional force-p) @@ -30,4 +29,3 @@ overwrite the destination file if it exists, without confirmation." (when (or (not new-path) (string-empty-p new-path)) (user-error "No new path was specified")) (doom/copy-this-file new-path force-p)) - diff --git a/modules/editor/evil/config.el b/modules/editor/evil/config.el index 3dfb39fd3..c9c27f272 100644 --- a/modules/editor/evil/config.el +++ b/modules/editor/evil/config.el @@ -159,7 +159,7 @@ directives. By default, this only recognizes C directives.") ;; monkey patch `evil-ex-replace-special-filenames' to improve support for ;; file modifiers like %:p:h. This adds support for most of vim's modifiers, ;; and one custom one: %:P (expand to the project root). - (advice-add #'evil-ex-replace-special-filenames :override #'+evil-resolve-vim-path-a) + (advice-add #'evil-ex-replace-special-filenames :override #'+evil-replace-filename-modifiers-a) ;; make `try-expand-dabbrev' (from `hippie-expand') work in minibuffer (add-hook 'minibuffer-inactive-mode-hook #'+evil--fix-dabbrev-in-minibuffer-h) @@ -280,8 +280,13 @@ directives. By default, this only recognizes C directives.") evil-escape-delay 0.15) (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) :config - ;; no `evil-escape' in minibuffer - (add-hook 'evil-escape-inhibit-functions #'minibufferp) + ;; no `evil-escape' in minibuffer, unless `evil-collection-setup-minibuffer' + ;; is enabled, where we could be in insert mode in the minibuffer. + (add-hook! 'evil-escape-inhibit-functions + (defun +evil-inhibit-escape-in-minibuffer-fn () + (and (minibufferp) + (or (not (bound-and-true-p evil-collection-setup-minibuffer)) + (evil-normal-state-p))))) ;; so that evil-escape-mode-hook runs, and can be toggled by evil-mc (evil-escape-mode +1)) diff --git a/modules/editor/evil/init.el b/modules/editor/evil/init.el index 1674bceb4..462e35b39 100644 --- a/modules/editor/evil/init.el +++ b/modules/editor/evil/init.el @@ -258,6 +258,10 @@ and complains if a module is loaded too early (during startup)." (+evil-collection-init 'elisp-mode)) (add-transient-hook! 'occur-mode (+evil-collection-init '(occur replace))) + (add-transient-hook! 'minibuffer-setup-hook + (when evil-collection-setup-minibuffer + (+evil-collection-init 'minibuffer) + (evil-collection-minibuffer-insert))) ;; HACK Do this ourselves because evil-collection break's `eval-after-load' ;; load order by loading their target plugin before applying keys. This diff --git a/modules/editor/evil/packages.el b/modules/editor/evil/packages.el index 2a427f444..d4d940266 100644 --- a/modules/editor/evil/packages.el +++ b/modules/editor/evil/packages.el @@ -1,27 +1,29 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/evil/packages.el -(package! evil :pin "8aa6337fa8") -(package! evil-args :pin "758ad5ae54") -(package! evil-easymotion :pin "79c13ed3bc") -(package! evil-embrace :pin "4379adea03") -(package! evil-escape :pin "f4e9116bfb") -(package! evil-exchange :pin "3030e21ee1") -(package! evil-indent-plus :pin "0c7501e6ef") -(package! evil-lion :pin "6b03593f5d") -(package! evil-nerd-commenter :pin "747e346f11") +(package! evil :pin "d243eae8649272799ec3864fde14c1164f036940") +(package! evil-args :pin "758ad5ae54ad34202064fec192c88151c08cb387") +(package! evil-easymotion :pin "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9") +(package! evil-embrace :pin "4379adea032b25e359d01a36301b4a5afdd0d1b7") +(package! evil-escape + :recipe (:host github :repo "hlissner/evil-escape") + :pin "819f1ee1cf3f69a1ae920e6004f2c0baeebbe077") +(package! evil-exchange :pin "3030e21ee16a42dfce7f7cf86147b778b3f5d8c1") +(package! evil-indent-plus :pin "0c7501e6efed661242c3a20e0a6c79a6455c2c40") +(package! evil-lion :pin "6b03593f5dd6e7c9ca02207f9a73615cf94c93ab") +(package! evil-nerd-commenter :pin "1bd2de52011c39777a3e8779b14cee2790dc873b") (package! evil-numbers :recipe (:host github :repo "janpath/evil-numbers") - :pin "c2cfdd1eb1") -(package! evil-snipe :pin "3ec8adfd49") -(package! evil-surround :pin "9b0b17f06c") -(package! evil-textobj-anyblock :pin "ff00980f06") -(package! evil-traces :pin "bc25cae9fa") -(package! evil-visualstar :pin "06c053d8f7") -(package! exato :pin "d5daea3017") + :pin "c2cfdd1eb1f193bea28ee79b191b78309677058a") +(package! evil-snipe :pin "2ba6353bb9253dbbc4193f1d35403e7dcc1317b1") +(package! evil-surround :pin "9b0b17f06cef9bac81ee4800d121265e54718a17") +(package! evil-textobj-anyblock :pin "ff00980f0634f95bf2ad9956b615a155ea8743be") +(package! evil-traces :pin "bc25cae9fa5ab0ba1507827f0944f52ce0ca7462") +(package! evil-visualstar :pin "06c053d8f7381f91c53311b1234872ca96ced752") +(package! exato :pin "d5daea30176d48e74c9d063ac9bfc240ebeb97d0") (package! evil-quick-diff :recipe (:host github :repo "rgrinberg/evil-quick-diff") - :pin "69c883720b") + :pin "69c883720b30a892c63bc89f49d4f0e8b8028908") ;; (when (featurep! +everywhere) @@ -31,4 +33,4 @@ (package! neotree) (autoload 'neotree-make-executor "neotree" nil nil 'macro)) - (package! evil-collection :pin "493d523c9b")) + (package! evil-collection :pin "ba3630476b3927d9d2e3ec75308a28e3a5bd54a8")) diff --git a/modules/editor/evil/test/test-evil.el b/modules/editor/evil/test/test-evil.el index dd77fd0f4..3b77c9cc3 100644 --- a/modules/editor/evil/test/test-evil.el +++ b/modules/editor/evil/test/test-evil.el @@ -9,10 +9,10 @@ (load! "../autoload/evil") (before-each - (fset 'resv #'+evil-resolve-vim-path-a) + (fset 'resv #'+evil-replace-filename-modifiers-a) (spy-on 'doom-project-root :and-call-fake (lambda () project-root))) - ;; `evil-ex-replace-special-filenames' / `+evil-resolve-vim-path-a' + ;; `evil-ex-replace-special-filenames' / `+evil-replace-filename-modifiers-a' (describe "file modifiers" (it "supports basic vim file modifiers" (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") diff --git a/modules/editor/file-templates/packages.el b/modules/editor/file-templates/packages.el index 42c98b815..2a16ccb75 100644 --- a/modules/editor/file-templates/packages.el +++ b/modules/editor/file-templates/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/file-templates/packages.el -(package! yasnippet :pin "ac03c2f192") +(package! yasnippet :pin "5b1217ab085fab4abeb1118dccb260691b446703") diff --git a/modules/editor/file-templates/templates/org-mode/__doom-readme b/modules/editor/file-templates/templates/org-mode/__doom-readme index 56a1f25a8..695067459 100644 --- a/modules/editor/file-templates/templates/org-mode/__doom-readme +++ b/modules/editor/file-templates/templates/org-mode/__doom-readme @@ -7,7 +7,7 @@ (match-string 2 buffer-file-name)) "")`} #+DATE: `(format (format-time-string "%B %%s, %Y") (string-to-number (format-time-string "%d")))` -#+SINCE: ${2:{replace with next tagged release version}} +#+SINCE: ${2:} #+STARTUP: inlineimages nofold * Table of Contents :TOC_3:noexport: diff --git a/modules/editor/fold/packages.el b/modules/editor/fold/packages.el index 9420d41a5..de5af2df9 100644 --- a/modules/editor/fold/packages.el +++ b/modules/editor/fold/packages.el @@ -3,6 +3,6 @@ (package! hideshow :built-in t) -(package! vimish-fold :pin "d3248a41a7") +(package! vimish-fold :pin "63685239655a151181b9152e45478dad587f86f2") (when (featurep! :editor evil) - (package! evil-vimish-fold :pin "b6e0e6b91b")) + (package! evil-vimish-fold :pin "b6e0e6b91b8cd047e80debef1a536d9d49eef31a")) diff --git a/modules/editor/god/packages.el b/modules/editor/god/packages.el index 1dc6a2016..edfcc1033 100644 --- a/modules/editor/god/packages.el +++ b/modules/editor/god/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/god/packages.el -(package! god-mode :pin "1eb6ef3a4f") +(package! god-mode :pin "1eb6ef3a4f67a805c5d6deb1e3895b6c853707d7") diff --git a/modules/editor/lispy/packages.el b/modules/editor/lispy/packages.el index 747c914ec..7f343c5a3 100644 --- a/modules/editor/lispy/packages.el +++ b/modules/editor/lispy/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/lispyville/packages.el -(package! lispy :pin "c7e282ae06") +(package! lispy :pin "cdaa9c70ca39a880163cbbce924bb46cc56b9fa4") (when (featurep! :editor evil) - (package! lispyville :pin "25a70126ea")) + (package! lispyville :pin "25a70126ea807653e0a8c512d4128c90ed673d7a")) diff --git a/modules/editor/multiple-cursors/packages.el b/modules/editor/multiple-cursors/packages.el index 72dfe9061..5e317fe2d 100644 --- a/modules/editor/multiple-cursors/packages.el +++ b/modules/editor/multiple-cursors/packages.el @@ -3,7 +3,7 @@ (cond ((featurep! :editor evil) - (package! evil-multiedit :pin "9f271e0e60") - (package! evil-mc :pin "4d4c0172e4")) + (package! evil-multiedit :pin "9f271e0e6048297692f80ed6c5ae8994ac523abc") + (package! evil-mc :pin "4d4c0172e4c7f80acc1d0e73d5fb3e536929b262")) - ((package! multiple-cursors :pin "b880554d04"))) + ((package! multiple-cursors :pin "b880554d04b8f61165afba7d4de19ac9e39bb7ab"))) diff --git a/modules/editor/objed/packages.el b/modules/editor/objed/packages.el index 49c15be40..5b49d2fbf 100644 --- a/modules/editor/objed/packages.el +++ b/modules/editor/objed/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/objed/packages.el -(package! objed :pin "8dc17701d1") +(package! objed :pin "e89d8dae3b2d4331a4455d2a7b203500537d184d") diff --git a/modules/editor/parinfer/packages.el b/modules/editor/parinfer/packages.el index df109114b..a3badc94c 100644 --- a/modules/editor/parinfer/packages.el +++ b/modules/editor/parinfer/packages.el @@ -11,4 +11,4 @@ ;; separate session: (autoload 'evil-define-key "evil-core" nil nil 'macro)) -(package! parinfer :pin "eaad857ae4") +(package! parinfer :pin "eaad857ae4351f72a561ee3dec8943713510003f") diff --git a/modules/editor/rotate-text/packages.el b/modules/editor/rotate-text/packages.el index 15c7216dd..846641da6 100644 --- a/modules/editor/rotate-text/packages.el +++ b/modules/editor/rotate-text/packages.el @@ -3,4 +3,4 @@ (package! rotate-text :recipe (:host github :repo "debug-ito/rotate-text.el") - :pin "48f193697d") + :pin "48f193697db996855aee1ad2bc99b38c6646fe76") diff --git a/modules/editor/snippets/config.el b/modules/editor/snippets/config.el index d4b9728a8..6a9e6cc94 100644 --- a/modules/editor/snippets/config.el +++ b/modules/editor/snippets/config.el @@ -20,8 +20,7 @@ ;; Remove default ~/.emacs.d/snippets (defvar yas-snippet-dirs nil) - (if (daemonp) - (after! yasnippet (yas-reload-all)) + (unless (daemonp) ;; Ensure `yas-reload-all' is called as late as possible. Other modules ;; could have additional configuration for yasnippet. For example, ;; file-templates. @@ -88,7 +87,10 @@ ;; Replace commands with superior alternatives :map yas-minor-mode-map [remap yas-new-snippet] #'+snippets/new - [remap yas-visit-snippet-file] #'+snippets/edit)) + [remap yas-visit-snippet-file] #'+snippets/edit) + + ;; If in a daemon session, front-load this expensive work: + (if (daemonp) (yas-reload-all))) (use-package! auto-yasnippet @@ -100,6 +102,6 @@ us who use yas-minor-mode and enable yasnippet more selectively. This advice swaps `yas-global-mode' with `yas-minor-mode'." :around '(aya-expand aya-open-line) - (cl-letf (((symbol-function #'yas-global-mode) #'yas-minor-mode) - (yas-global-mode yas-minor-mode)) + (letf! ((#'yas-global-mode #'yas-minor-mode) + (yas-global-mode yas-minor-mode)) (apply orig-fn args)))) diff --git a/modules/editor/snippets/packages.el b/modules/editor/snippets/packages.el index fec5e4d36..12b720197 100644 --- a/modules/editor/snippets/packages.el +++ b/modules/editor/snippets/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/snippets/packages.el -(package! yasnippet :pin "5b1217ab08") -(package! auto-yasnippet :pin "db9e0dd433") +(package! yasnippet :pin "5b1217ab085fab4abeb1118dccb260691b446703") +(package! auto-yasnippet :pin "db9e0dd4335b2202cd5dac95bbbc87a1032d9bbe") (package! doom-snippets :recipe (:host github :repo "hlissner/doom-snippets" :files ("*.el" "*")) - :pin "feaedeb550") + :pin "422f683adfbec1b01fe00524690b64dc9e702ae0") diff --git a/modules/editor/word-wrap/config.el b/modules/editor/word-wrap/config.el index 2a6af06c7..968e71954 100644 --- a/modules/editor/word-wrap/config.el +++ b/modules/editor/word-wrap/config.el @@ -24,3 +24,7 @@ Otherwise no extra indentation will be used.") '(text-mode markdown-mode markdown-view-mode gfm-mode gfm-view-mode rst-mode latex-mode LaTeX-mode) "Major-modes where `+word-wrap-mode' should not provide extra indentation.") + +(when (memq 'visual-line-mode text-mode-hook) + (remove-hook 'text-mode-hook #'visual-line-mode) + (add-hook 'text-mode-hook #'+word-wrap-mode)) diff --git a/modules/editor/word-wrap/packages.el b/modules/editor/word-wrap/packages.el index 8a82b406d..1e31f226e 100644 --- a/modules/editor/word-wrap/packages.el +++ b/modules/editor/word-wrap/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/word-wrap/packages.el -(package! adaptive-wrap :pin "1810c0ee8d") +(package! adaptive-wrap :pin "1810c0ee8d827dd502ddeaae5bd759d4811fcbce") diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el old mode 100755 new mode 100644 index 56fac7351..3da7048bd --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -31,20 +31,16 @@ (setq insert-directory-program gls) ;; BSD ls doesn't support --group-directories-first (setq args (delete "--group-directories-first" args)))) - (setq dired-listing-switches (string-join args " "))) + (setq dired-listing-switches (string-join args " ")) - (add-hook! 'dired-mode-hook - (defun +dired-disable-gnu-ls-flags-in-tramp-buffers-h () - "Fix #1703: dired over TRAMP displays a blank screen. + (add-hook! 'dired-mode-hook + (defun +dired-disable-gnu-ls-flags-in-tramp-buffers-h () + "Fix #1703: dired over TRAMP displays a blank screen. This is because there's no guarantee the remote system has GNU ls, which is the only variant that supports --group-directories-first." - (when (file-remote-p default-directory) - (setq-local dired-listing-switches - (string-join - (split-string dired-listing-switches - "--group-directories-first") - " "))))) + (when (file-remote-p default-directory) + (setq-local dired-listing-switches (car args)))))) ;; Don't complain about this command being disabled when we use it (put 'dired-find-alternate-file 'disabled nil) diff --git a/modules/emacs/dired/packages.el b/modules/emacs/dired/packages.el index fe6498417..9a483f259 100644 --- a/modules/emacs/dired/packages.el +++ b/modules/emacs/dired/packages.el @@ -1,12 +1,12 @@ ;; -*- no-byte-compile: t; -*- ;;; emacs/dired/packages.el -(package! diredfl :pin "83567d00af") -(package! dired-git-info :pin "b47f2b0c3a") -(package! diff-hl :pin "2cf8b489f3") -(package! dired-rsync :pin "bfd5c155be") +(package! diredfl :pin "83567d00affce66a4e501563eddd0bd436ac48d0") +(package! dired-git-info :pin "b47f2b0c3a6cb9b7a62a4ee2605a492e512d40a9") +(package! diff-hl :pin "a625033fb1dde83f6e4c2fc21f632b22ec34b609") +(package! dired-rsync :pin "bfd5c155be1cb6b71c83e5f41116c81b6532b6d5") (when (featurep! +ranger) - (package! ranger :pin "af6f781a60")) + (package! ranger :pin "ae9b3816a6da927cca5beb62c45400103797a2da")) (when (featurep! +icons) - (package! all-the-icons-dired :pin "816987d339")) -(package! fd-dired :pin "fd4c3f490b") + (package! all-the-icons-dired :pin "fc2dfa1e9eb8bf1c402a675e7089638d702a27a5")) +(package! fd-dired :pin "001cc95effdd5c4d9974b3f2c40b2ddf1f0e3de2") diff --git a/modules/emacs/ibuffer/packages.el b/modules/emacs/ibuffer/packages.el index 037024cc6..a43d06d4b 100644 --- a/modules/emacs/ibuffer/packages.el +++ b/modules/emacs/ibuffer/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; emacs/ibuffer/packages.el -(package! ibuffer-projectile :pin "504b0edaa0") -(package! ibuffer-vc :pin "1249c1e30c") +(package! ibuffer-projectile :pin "504b0edaa0d937ce60ccc8fdf09f2dae0a90fbaf") +(package! ibuffer-vc :pin "1249c1e30cf11badfe032ac3b1058f24ba510ace") diff --git a/modules/emacs/undo/packages.el b/modules/emacs/undo/packages.el index d960bda32..8c21f4904 100644 --- a/modules/emacs/undo/packages.el +++ b/modules/emacs/undo/packages.el @@ -2,6 +2,6 @@ ;;; emacs/undo/packages.el (if (featurep! +tree) - (package! undo-tree :pin "5b6df03781") - (package! undo-fu :pin "0c34b6747e") - (package! undo-fu-session :pin "b808ef0cdc")) + (package! undo-tree :pin "5b6df03781495d8a25695d846b0cce496d3d3058") + (package! undo-fu :pin "0ce9ac36144e80316fff50bfe1bc5dd7e5e7ded6") + (package! undo-fu-session :pin "b808ef0cdcdd2eef221c67eda567eed7fcb3d4af")) diff --git a/modules/emacs/vc/packages.el b/modules/emacs/vc/packages.el index 693554e96..b022a543c 100644 --- a/modules/emacs/vc/packages.el +++ b/modules/emacs/vc/packages.el @@ -5,7 +5,7 @@ (package! vc-annotate :built-in t) (package! smerge-mode :built-in t) -(package! browse-at-remote :pin "6aecae4b5d") -(package! git-timemachine :pin "391eb61050") -(package! gitconfig-mode :pin "55468314a5") -(package! gitignore-mode :pin "55468314a5") +(package! browse-at-remote :pin "6aecae4b5d202e582425fc8aa2c9c2b6a4779f25") +(package! git-timemachine :pin "391eb61050de321101e631fcf373fc70ec6e7700") +(package! gitconfig-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217") +(package! gitignore-mode :pin "55468314a5f6b77d2c96be62c7005ac94545e217") diff --git a/modules/email/mu4e/README.org b/modules/email/mu4e/README.org index 9f4a95172..93f2ab37c 100644 --- a/modules/email/mu4e/README.org +++ b/modules/email/mu4e/README.org @@ -12,11 +12,12 @@ - [[#arch-linux][Arch Linux]] - [[#nixos][NixOS]] - [[#opensuse][openSUSE]] - - [[Debian/Ubuntu]] + - [[#debianubuntu][Debian/Ubuntu]] - [[#features][Features]] - [[#configuration][Configuration]] - [[#offlineimap][offlineimap]] - [[#mbsync][mbsync]] + - [[#mu-and-mu4e][mu and mu4e]] - [[#troubleshooting][Troubleshooting]] - [[#no-such-file-or-directory-mu4e][=No such file or directory, mu4e=]] - [[#void-function-org-time-add-error-on-gentoo][~(void-function org-time-add)~ error on Gentoo]] @@ -37,13 +38,13 @@ via IMAP) and ~mu~ (to index my mail into a format ~mu4e~ can understand). + ~+gmail~ Enables gmail-specific configuration. ** Plugins -+ [[https://github.com/agpchil/mu4e-maildirs-extension][mu4e-maildirs-extension]] +This module install no plugins. * Prerequisites This module requires: + Either ~mbsync~ (default) or ~offlineimap~ (to sync mail with) -+ ~mu~ (to index your downloaded messages) ++ ~mu~, to index your downloaded messages and to provide the ~mu4e~ package. ** MacOS #+BEGIN_SRC sh @@ -105,20 +106,53 @@ sudo apt-get install maildir-utils # mu * Configuration ** offlineimap -This module uses =mbsync= by default. To change this, change ~+mu4e-backend~: +This module uses =mbsync= by default. To use =offlineimap=, change ~+mu4e-backend~: #+BEGIN_SRC emacs-lisp (setq +mu4e-backend 'offlineimap) #+END_SRC -Then you must set up offlineimap and index your mail: +Next, you need to write a configuration file for =offlineimap=. Mine can be found +[[https://github.com/hlissner/dotfiles/tree/master/shell/mu][in my dotfiles repository]]. It is configured to download mail to ~\~/.mail~. I +use [[https://www.passwordstore.org/][unix pass]] to securely store my login credentials. You can find a *very* +detailed configuration [[https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf][here]]. -1. Write a ~\~/.offlineimaprc~. Mine can be found [[https://github.com/hlissner/dotfiles/tree/master/shell/mu][in my dotfiles repository]]. It - is configured to download mail to ~\~/.mail~. I use [[https://www.passwordstore.org/][unix pass]] to securely - store my login credentials. You can find a *very* detailed configuration - [[https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf][here]]. -2. Download your email: ~offlineimap -o~ (may take a while) -3. Index it with mu: ~mu index --maildir ~/.mail~ +Next you can download your email with ~offlineimap -o~. This may take a while, +especially if you have thousands of mails. + +You can now proceed with the [[*mu and mu4e][mu and mu4e]] section. + +** mbsync +The steps needed to set up =mu4e= with =mbsync= are very similar to the ones for +[[*offlineimap][offlineimap]]. + +Start with writing a ~\~/.mbsyncrc~. An example for GMAIL can be found on +[[http://pragmaticemacs.com/emacs/migrating-from-offlineimap-to-mbsync-for-mu4e/][pragmaticemacs.com]]. A non-GMAIL example is available as a gist [[https://gist.github.com/agraul/60977cc497c3aec44e10591f94f49ef0][here]]. The [[http://isync.sourceforge.net/mbsync.html][manual +page]] contains all needed information to set up your own. + +Next you can download your email with ~mbsync --all~. This may take a while, but +should be quicker than =offlineimap= ;). + +You can now proceed with the [[*mu and mu4e][mu and mu4e]] section. + +** mu and mu4e +You should have your email downloaded already. If you have not, you need to set +=offlineimap= or =mbsync= up before you proceed. + +Before you can use =mu4e= or the cli program =mu=, you need to index your email +initially. How to do that differs a little depending on the version of =mu= you +use. You can check your version with ~mu --version~. + +For =mu= *>=1.4* you need to run two commands: +#+BEGIN_SRC sh +mu init --maildir ~/.mail --my-address email@example.com +mu index +#+END_SRC + +=mu= *<1.4* only requires one command: +#+BEGIN_SRC sh +mu index --maildir ~/.mail +#+END_SRC Then configure Emacs to use your email address: @@ -130,12 +164,11 @@ Then configure Emacs to use your email address: (mu4e-trash-folder . "/Lissner.net/Trash") (mu4e-refile-folder . "/Lissner.net/All Mail") (smtpmail-smtp-user . "henrik@lissner.net") - (user-mail-address . "henrik@lissner.net") + (user-mail-address . "henrik@lissner.net") ;; only needed for mu < 1.4 (mu4e-compose-signature . "---\nHenrik Lissner")) t) #+END_SRC -** TODO mbsync * Troubleshooting ** =No such file or directory, mu4e= You will get =No such file or directory, mu4e= errors if you don't run ~doom diff --git a/modules/email/mu4e/autoload/email.el b/modules/email/mu4e/autoload/email.el index 27d9a10db..f413207df 100644 --- a/modules/email/mu4e/autoload/email.el +++ b/modules/email/mu4e/autoload/email.el @@ -6,7 +6,7 @@ list of cons cells (VARIABLE . VALUE) -- you may want to modify: + `user-full-name' (this or the global `user-full-name' is required) - + `user-mail-address' (required) + + `user-mail-address' (required in mu4e < 1.4) + `smtpmail-smtp-user' (required for sending mail from Emacs) OPTIONAL: @@ -19,8 +19,9 @@ OPTIONAL: DEFAULT-P is a boolean. If non-nil, it marks that email account as the default/fallback account." (after! mu4e - (when-let (address (cdr (assq 'user-mail-address letvars))) - (add-to-list 'mu4e-user-mail-address-list address)) + (when (version< mu4e-mu-version "1.4") + (when-let (address (cdr (assq 'user-mail-address letvars))) + (add-to-list 'mu4e-user-mail-address-list address))) (setq mu4e-contexts (cl-loop for context in mu4e-contexts unless (string= (mu4e-context-name context) label) diff --git a/modules/email/mu4e/config.el b/modules/email/mu4e/config.el index 3bdb86efa..41544f3a3 100644 --- a/modules/email/mu4e/config.el +++ b/modules/email/mu4e/config.el @@ -14,9 +14,11 @@ :commands mu4e mu4e-compose-new :init (provide 'html2text) ; disable obsolete package - (setq mu4e-maildir "~/.mail" - mu4e-attachment-dir "~/.mail/.attachments" - mu4e-user-mail-address-list nil) + (when (or (not (require 'mu4e-meta nil t)) + (version< mu4e-mu-version "1.4")) + (setq mu4e-maildir "~/.mail" + mu4e-user-mail-address-list nil)) + (setq mu4e-attachment-dir "~/.mail/.attachments") :config (pcase +mu4e-backend (`mbsync @@ -90,6 +92,9 @@ ;; Wrap text in messages (setq-hook! 'mu4e-view-mode-hook truncate-lines nil) + ;; Html mails might be better rendered in a browser + (add-to-list 'mu4e-view-actions '("View in browser" . mu4e-action-view-in-browser)) + (when (fboundp 'imagemagick-register-types) (imagemagick-register-types)) @@ -104,13 +109,13 @@ (use-package! org-mu4e :hook (mu4e-compose-mode . org-mu4e-compose-org-mode) :config - (setq org-mu4e-link-query-in-headers-mode nil - org-mu4e-convert-to-html t) + (setq org-mu4e-convert-to-html t) + (when (version< mu4e-mu-version "1.4") + (setq org-mu4e-link-query-in-headers-mode nil)) ;; Only render to html once. If the first send fails for whatever reason, ;; org-mu4e would do so each time you try again. - (add-hook! 'message-send-hook - (setq-local org-mu4e-convert-to-html nil))) + (setq-hook! 'message-send-hook org-mu4e-convert-to-html nil)) ;; diff --git a/modules/email/notmuch/packages.el b/modules/email/notmuch/packages.el index d1f108bf7..63a955ce5 100644 --- a/modules/email/notmuch/packages.el +++ b/modules/email/notmuch/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; email/notmuch/packages.el -(package! notmuch :pin "aba7fb375b") -(package! org-mime :pin "b189976217") +(package! notmuch :pin "ad9c2e91a012920bebfe70bc472d44678abc3259") +(package! org-mime :pin "9f8444603806e6baa94b2b67a23aab0ea52fef97") (when (featurep! :completion ivy) - (package! counsel-notmuch :pin "a4a1562935")) + (package! counsel-notmuch :pin "a4a1562935e4180c42524c51609d1283e9be0688")) (when (featurep! :completion helm) - (package! helm-notmuch :pin "97a01497e0")) + (package! helm-notmuch :pin "97a01497e079a7b6505987e9feba6b603bbec288")) diff --git a/modules/email/wanderlust/packages.el b/modules/email/wanderlust/packages.el index 04963b55b..1188d3005 100644 --- a/modules/email/wanderlust/packages.el +++ b/modules/email/wanderlust/packages.el @@ -4,8 +4,8 @@ ;; HACK These are wanderlust's dependencies (wanderlust depends on semi, semi ;; depends on flim, flim on apel), but they all have non-standard default ;; branches which straight cannot detect without our help. -(package! apel :recipe (:branch "apel-wl") :pin "d146ddbf88") -(package! flim :recipe (:branch "flim-1_14-wl") :pin "e4bd54fd7d") -(package! semi :recipe (:branch "semi-1_14-wl") :pin "16228dc2d1") +(package! apel :recipe (:branch "apel-wl") :pin "d146ddbf8818e81d3577d5eee7825d377bec0c73") +(package! flim :recipe (:branch "flim-1_14-wl") :pin "f303f2f6c124bc8635add96d3326a2209749437b") +(package! semi :recipe (:branch "semi-1_14-wl") :pin "57a948c5f07e57e78ab3c0e6fd76ffcd591bb4ac") -(package! wanderlust :pin "7a919e422a") +(package! wanderlust :pin "7af0d582cd48a37469e0606ea35887740d78c8b5") diff --git a/modules/input/chinese/config.el b/modules/input/chinese/config.el index 666cfe395..ffa4e2669 100644 --- a/modules/input/chinese/config.el +++ b/modules/input/chinese/config.el @@ -2,9 +2,10 @@ (use-package! pyim :after-call after-find-file pre-command-hook + :init + (setq pyim-dcache-directory (concat doom-cache-dir "pyim/")) :config - (setq pyim-dcache-directory (concat doom-cache-dir "pyim/") - pyim-page-tooltip t + (setq pyim-page-tooltip t default-input-method "pyim")) diff --git a/modules/input/chinese/packages.el b/modules/input/chinese/packages.el index 138c376c4..68bda1d2a 100644 --- a/modules/input/chinese/packages.el +++ b/modules/input/chinese/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; input/chinese/packages.el -(package! pyim :pin "77170724fa") -(package! fcitx :pin "12dc2638dd") -(package! ace-pinyin :pin "8b2e9335b0") -(package! pangu-spacing :pin "f92898949b") +(package! pyim :pin "b934273bb33d6be6aea6e20e68930bc5aaf4a48a") +(package! fcitx :pin "12dc2638ddd15c8f6cfaecb20e1f428ab2bb5624") +(package! ace-pinyin :pin "8b2e9335b02486730ea4ceee790130cc5328f9ea") +(package! pangu-spacing :pin "f92898949ba3bf991fd229416f3bbb54e9c6c223") diff --git a/modules/input/japanese/packages.el b/modules/input/japanese/packages.el index 5e86fd79a..126633dcf 100644 --- a/modules/input/japanese/packages.el +++ b/modules/input/japanese/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; input/japanese/packages.el -(package! migemo :pin "f42832c8ac") -(package! avy-migemo :pin "922a6dd82c") -(package! ddskk :pin "f9a2333ec3") -(package! pangu-spacing :pin "f92898949b") +(package! migemo :pin "f42832c8ac462ecbec9a16eb781194f876fba64a") +(package! avy-migemo :pin "922a6dd82c0bfa316b0fbb56a9d4dd4ffa5707e7") +(package! ddskk :pin "11d91b4cce988e15d7c5fc4345535c9d7a92d53b") +(package! pangu-spacing :pin "f92898949ba3bf991fd229416f3bbb54e9c6c223") diff --git a/modules/lang/assembly/autoload.el b/modules/lang/assembly/autoload.el deleted file mode 100644 index 29e8ded24..000000000 --- a/modules/lang/assembly/autoload.el +++ /dev/null @@ -1,4 +0,0 @@ -;;; lang/assembly/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.hax\\'" . haxor-mode)) diff --git a/modules/lang/assembly/packages.el b/modules/lang/assembly/packages.el deleted file mode 100644 index 78e44be3d..000000000 --- a/modules/lang/assembly/packages.el +++ /dev/null @@ -1,6 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; lang/assembly/packages.el - -(package! mips-mode :pin "75152fc78b") -(package! haxor-mode :pin "6fa25a8e6b") -(package! nasm-mode :pin "65ca6546fc") diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 36d8b0b75..7a091a3ae 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -11,21 +11,22 @@ ;; ;;; Packages -;;;###package clojure-mode -(add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) -(when (featurep! +lsp) - (add-hook! '(clojure-mode-local-vars-hook - clojurec-mode-local-vars-hook - clojurescript-mode-local-vars-hook) - (defun +clojure-disable-lsp-indentation-h () - (setq-local lsp-enable-indentation nil)) - #'lsp!) - (after! lsp-clojure - (dolist (m '(clojure-mode - clojurec-mode - clojurescript-mode - clojurex-mode)) - (add-to-list 'lsp-language-id-configuration (cons m "clojure"))))) +(use-package! clojure-mode + :hook (clojure-mode . rainbow-delimiters-mode) + :config + (when (featurep! +lsp) + (add-hook! '(clojure-mode-local-vars-hook + clojurec-mode-local-vars-hook + clojurescript-mode-local-vars-hook) + (defun +clojure-disable-lsp-indentation-h () + (setq-local lsp-enable-indentation nil)) + #'lsp!) + (after! lsp-clojure + (dolist (m '(clojure-mode + clojurec-mode + clojurescript-mode + clojurex-mode)) + (add-to-list 'lsp-language-id-configuration (cons m "clojure")))))) (use-package! cider @@ -58,13 +59,18 @@ cider-repl-history-quit-action 'delete-and-restore cider-repl-history-highlight-inserted-item t cider-repl-history-size 1000 - cider-repl-pop-to-buffer-on-connect 'display-only cider-repl-result-prefix ";; => " cider-repl-print-length 100 cider-repl-use-clojure-font-lock t cider-repl-use-pretty-printing t cider-repl-wrap-history nil - cider-stacktrace-default-filters '(tooling dup)) + cider-stacktrace-default-filters '(tooling dup) + + ;; Don't focus the CIDER REPL when it starts. Since it can take so long + ;; to start up, you either wait for a minute doing nothing or be + ;; prepared for your cursor to suddenly change buffers without warning. + ;; See https://github.com/clojure-emacs/cider/issues/1872 + cider-repl-pop-to-buffer-on-connect 'display-only) ;; Error messages emitted from CIDER is silently funneled into *nrepl-server* ;; rather than the *cider-repl* buffer. How silly. We might want to see that diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index f126695d0..ed980f0b5 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -73,26 +73,36 @@ ((message "WARNING: Couldn't find `inferior-lisp-program' (%s)" inferior-lisp-program))))) - (map! :localleader - :map lisp-mode-map - :desc "Sly" "'" #'sly - :desc "Sly (ask)" ";" (λ!! #'sly '-) - :desc "Expand macro" "m" #'macrostep-expand - (:prefix ("c" . "compile") + (map! (:map sly-db-mode-map + :n "gr" #'sly-db-restart-frame) + (:map sly-inspector-mode-map + :n "gr" #'sly-inspector-reinspect + :n "gR" #'sly-inspector-fetch-all + :n "K" #'sly-inspector-describe-inspectee) + (:map sly-xref-mode-map + :n "gr" #'sly-recompile-xref + :n "gR" #'sly-recompile-all-xrefs) + + (:localleader + :map lisp-mode-map + :desc "Sly" "'" #'sly + :desc "Sly (ask)" ";" (λ!! #'sly '-) + :desc "Expand macro" "m" #'macrostep-expand + (:prefix ("c" . "compile") :desc "Compile file" "c" #'sly-compile-file :desc "Compile/load file" "C" #'sly-compile-and-load-file :desc "Compile toplevel form" "f" #'sly-compile-defun :desc "Load file" "l" #'sly-load-file :desc "Remove notes" "n" #'sly-remove-notes :desc "Compile region" "r" #'sly-compile-region) - (:prefix ("e" . "evaluate") + (:prefix ("e" . "evaluate") :desc "Evaulate buffer" "b" #'sly-eval-buffer :desc "Evaluate last" "e" #'sly-eval-last-expression :desc "Evaluate/print last" "E" #'sly-eval-print-last-expression :desc "Evaluate defun" "f" #'sly-eval-defun :desc "Undefine function" "F" #'sly-undefine-function :desc "Evaluate region" "r" #'sly-eval-region) - (:prefix ("g" . "goto") + (:prefix ("g" . "goto") :desc "Go back" "b" #'sly-pop-find-definition-stack :desc "Go to" "d" #'sly-edit-definition :desc "Go to (other window)" "D" #'sly-edit-definition-other-window @@ -100,7 +110,7 @@ :desc "Previous note" "N" #'sly-previous-note :desc "Next sticker" "s" #'sly-stickers-next-sticker :desc "Previous sticker" "S" #'sly-stickers-prev-sticker) - (:prefix ("h" . "help") + (:prefix ("h" . "help") :desc "Who calls" "<" #'sly-who-calls :desc "Calls who" ">" #'sly-calls-who :desc "Lookup format directive" "~" #'hyperspec-lookup-format @@ -115,22 +125,22 @@ :desc "Who references" "r" #'sly-who-references :desc "Who specializes" "s" #'sly-who-specializes :desc "Who sets" "S" #'sly-who-sets) - (:prefix ("r" . "repl") + (:prefix ("r" . "repl") :desc "Clear REPL" "c" #'sly-mrepl-clear-repl :desc "Quit connection" "q" #'sly-quit-lisp :desc "Restart connection" "r" #'sly-restart-inferior-lisp :desc "Sync REPL" "s" #'sly-mrepl-sync) - (:prefix ("s" . "stickers") + (:prefix ("s" . "stickers") :desc "Toggle breaking stickers" "b" #'sly-stickers-toggle-break-on-stickers :desc "Clear defun stickers" "c" #'sly-stickers-clear-defun-stickers :desc "Clear buffer stickers" "C" #'sly-stickers-clear-buffer-stickers :desc "Fetch stickers" "f" #'sly-stickers-fetch :desc "Replay stickers" "r" #'sly-stickers-replay :desc "Add/remove sticker" "s" #'sly-stickers-dwim) - (:prefix ("t" . "trace") + (:prefix ("t" . "trace") :desc "Toggle" "t" #'sly-toggle-trace-fdefinition :desc "Toggle (fancy)" "T" #'sly-toggle-fancy-trace - :desc "Untrace all" "u" #'sly-untrace-all)) + :desc "Untrace all" "u" #'sly-untrace-all))) (when (featurep! :editor evil +everywhere) (add-hook 'sly-mode-hook #'evil-normalize-keymaps))) diff --git a/modules/lang/dart/packages.el b/modules/lang/dart/packages.el index 44d69fa9a..878d55630 100644 --- a/modules/lang/dart/packages.el +++ b/modules/lang/dart/packages.el @@ -4,8 +4,8 @@ (package! dart-mode :pin "04fcd649f1") (when (featurep! +lsp) - (package! lsp-dart :pin "064d47bad3")) + (package! lsp-dart :pin "80f8ecaf62")) (when (featurep! +flutter) - (package! flutter :pin "ec92a4df84") + (package! flutter :pin "293b7225b9") (package! hover :pin "6f9ed1a651")) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index e625d4fd0..da0e72344 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -1,9 +1,5 @@ ;;; lang/data/config.el -*- lexical-binding: t; -*- -;; Built in plugins -(add-to-list 'auto-mode-alist '("/sxhkdrc\\'" . conf-mode)) -(add-to-list 'auto-mode-alist '("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode)) - (use-package! nxml-mode :mode "\\.p\\(?:list\\|om\\)\\'" ; plist, pom :mode "\\.xs\\(?:d\\|lt\\)\\'" ; xslt, xsd @@ -16,9 +12,6 @@ (setq-hook! 'nxml-mode-hook tab-width nxml-child-indent)) -;; -;;; Third-party plugins - ;;;###package csv-mode (map! :after csv-mode :localleader @@ -29,25 +22,3 @@ "S" #'csv-sort-numeric-fields "k" #'csv-kill-fields "t" #'csv-transpose) - -(use-package! graphql-mode - :mode "\\.gql\\'" - :config (setq-hook! 'graphql-mode-hook tab-width graphql-indent-level)) - -(use-package! json-mode - :mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'" - :config - (set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))) - -(after! jsonnet-mode - (set-electric! 'jsonnet-mode :chars '(?\n ?: ?{ ?}))) - -(after! yaml-mode - (setq-hook! 'yaml-mode-hook tab-width yaml-indent-offset)) - - -;; -;;; Frameworks - -(def-project-mode! +data-vagrant-mode - :files ("Vagrantfile")) diff --git a/modules/lang/data/packages.el b/modules/lang/data/packages.el index 1c338af9e..72a9dae2d 100644 --- a/modules/lang/data/packages.el +++ b/modules/lang/data/packages.el @@ -1,12 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/data/packages.el -(package! graphql-mode :pin "7c37aee28b") -(package! json-mode :pin "0e819e519a") -(package! jsonnet-mode :pin "d8b486c837") -(package! yaml-mode :pin "cecf4b106b") (package! csv-mode :pin "635337407c") -(package! dhall-mode :pin "ef4d33debe") -(package! protobuf-mode - :recipe (:host github :repo "emacsmirror/protobuf-mode" :files (:defaults "*")) - :pin "94b7bd7e8b") diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 71c3dd97c..504adbce8 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -1,12 +1,10 @@ ;;; lang/elm/config.el -*- lexical-binding: t; -*- (after! elm-mode - (add-hook 'elm-mode-hook #'rainbow-delimiters-mode) - - (when (featurep! +lsp) - (add-hook 'elm-mode-local-vars-hook #'lsp!)) - - (set-company-backend! 'elm-mode 'company-elm) + (if (featurep! +lsp) + (add-hook 'elm-mode-local-vars-hook #'lsp!) + (set-company-backend! 'elm-mode 'company-elm)) + (set-repl-handler! 'elm-mode #'run-elm-interactive) (set-pretty-symbols! 'elm-mode :null "null" @@ -22,4 +20,4 @@ (use-package! flycheck-elm :when (featurep! :checkers syntax) :after elm-mode - :config (add-to-list 'flycheck-checkers 'elm nil #'eq)) + :config (add-to-list 'flycheck-checkers 'elm)) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 228a3a8ef..ca3440d0d 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -221,6 +221,66 @@ verbosity when editing a file in `doom-private-dir' or `doom-emacs-dir'." (default-value 'flycheck-emacs-lisp-check-form) ")")))) +;;;###autoload +(defun +emacs-lisp-truncate-pin () + "Truncates long SHA1 hashes in `package!' :pin's." + (save-excursion + (goto-char (match-beginning 0)) + (and (stringp (plist-get (sexp-at-point) :pin)) + (search-forward ":pin" nil t) + (let ((start (re-search-forward "\"[^\"]\\{10\\}" nil t)) + (finish (and (re-search-forward "\"" (line-end-position) t) + (match-beginning 0)))) + (when (and start finish) + (put-text-property start finish 'display "..."))))) + nil) + +;;;###autoload +(defun +emacs-lisp-indent-function (indent-point state) + "A replacement for `lisp-indent-function'. + +Indents plists more sensibly. Adapted from +https://emacs.stackexchange.com/questions/10230/how-to-indent-keywords-aligned" + (let ((normal-indent (current-column)) + (orig-point (point)) + ;; TODO Refactor `target' usage (ew!) + target) + (goto-char (1+ (elt state 1))) + (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t) + (cond ((and (elt state 2) + (or (not (looking-at-p "\\sw\\|\\s_")) + (eq (char-after) ?:))) + (unless (> (save-excursion (forward-line 1) (point)) + calculate-lisp-indent-last-sexp) + (goto-char calculate-lisp-indent-last-sexp) + (beginning-of-line) + (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)) + (backward-prefix-chars) + (current-column)) + ((and (save-excursion + (goto-char indent-point) + (skip-syntax-forward " ") + (not (eq (char-after) ?:))) + (save-excursion + (goto-char orig-point) + (and (eq (char-after) ?:) + (setq target (current-column))))) + (save-excursion + (move-to-column target t) + target)) + ((let* ((function (buffer-substring (point) (progn (forward-sexp 1) (point)))) + (method (or (function-get (intern-soft function) 'lisp-indent-function) + (get (intern-soft function) 'lisp-indent-hook)))) + (cond ((or (eq method 'defun) + (and (null method) + (> (length function) 3) + (string-match-p "\\`def" function))) + (lisp-indent-defform state indent-point)) + ((integerp method) + (lisp-indent-specform method state indent-point normal-indent)) + (method + (funcall method indent-point state)))))))) + ;;;###autoload (defun +emacs-lisp/edebug-instrument-defun-on () "Toggle on instrumentalisation for the function under `defun'." diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 7d4bf782d..6f80d6cfd 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -43,7 +43,9 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") mode-name "Elisp" ;; Don't treat autoloads or sexp openers as outline headers, we have ;; hideshow for that. - outline-regexp +emacs-lisp-outline-regexp) + outline-regexp +emacs-lisp-outline-regexp + ;; Fixed indenter that intends plists sensibly. + lisp-indent-function #'+emacs-lisp-indent-function) ;; variable-width indentation is superior in elisp (add-to-list 'doom-detect-indentation-excluded-modes 'emacs-lisp-mode nil #'eq) @@ -75,7 +77,9 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") ("^;;;###\\(autodef\\|if\\|package\\)[ \n]" (1 font-lock-warning-face t))) ;; highlight defined, special variables & functions (when +emacs-lisp-enable-extra-fontification - `((+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face))))) + `((+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face))) + + `(("(package!\\_>" (0 (+emacs-lisp-truncate-pin)))))) ;; Recenter window after following definition (advice-add #'elisp-def :after #'doom-recenter-a) diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index f953c3662..a72ea6124 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -4,6 +4,8 @@ (package! elisp-mode :built-in t) (package! highlight-quoted :pin "2410347815") + +;; Tools (package! macrostep :pin "424e3734a1") (package! overseer :pin "02d49f582e") (package! elisp-def :pin "368b04da68") @@ -11,4 +13,5 @@ (when (featurep! :checkers syntax) (package! flycheck-cask :pin "3457ae553c")) +;; Libraries (package! buttercup :pin "a91f282025") diff --git a/modules/lang/java/README.org b/modules/lang/java/README.org new file mode 100644 index 000000000..eb4b69098 --- /dev/null +++ b/modules/lang/java/README.org @@ -0,0 +1,114 @@ +#+TITLE: lang/java +#+DATE: January 16, 2017 +#+SINCE: v1.3 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#module-flags][Module Flags]] +- [[#prerequisites][Prerequisites]] + - [[#openjdk-11][OpenJDK 11]] + - [[#ubuntu][Ubuntu]] + - [[#fedora][Fedora]] + - [[#oracle-jdk-11][Oracle JDK 11]] + - [[#ubuntu-1][Ubuntu]] + - [[#fedora-1][Fedora]] +- [[#features][Features]] + - [[#lsp-features][=+lsp= features]] + - [[#meghanada-features][=+meghanada= features]] +- [[#configuration][Configuration]] + +* Description +This module adds [[https://www.java.com][java]] support to Doom Emacs, including =android-mode= and +=groovy-mode=. + +** Module Flags ++ =+lsp= Enables integration for the eclipse.jdt.ls LSP server. ++ =+meghanada= Enables the [[https://github.com/mopemope/meghanada-emacs/tree/master][meghanada-mode]] + +The =+lsp= and =+meghanada= packages are mutually exclusive and do not work +together. At the time of writing the =+meghanada= is already configured whereas +=+lsp= needs to manual configuring. + +* Prerequisites +This module requires the Java SDK. + +** OpenJDK 11 +*** Ubuntu +#+BEGIN_SRC sh +sudo apt-get install openjdk-11-jdk-headless +#+END_SRC +*** Fedora +#+BEGIN_SRC sh +sudo dnf install java-11-openjdk +#+END_SRC + +** Oracle JDK 11 +*** Ubuntu +#+BEGIN_SRC sh +sudo add-apt-repository ppa:linuxuprising/java +sudo apt update +sudo apt install oracle-java11-installer +sudo apt install oracle-java11-set-default +#+END_SRC +*** Fedora +#+BEGIN_SRC sh +curl -O https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz +tar zxvf openjdk-11.0.2_linux-x64_bin.tar.gz +sudo mv jdk-11.0.2/ /usr/local/ +#+END_SRC + +Open =/etc/profile.d/jdk11.sh= as root and add + +#+BEGIN_SRC sh +export JAVA_HOME=/usr/local/jdk-11.0.2 +export PATH=$PATH:$JAVA_HOME/bin +#+END_SRC + +Save the file and source the file + +#+BEGIN_SRC sh +source /etc/profile.d/jdk11.sh +java -version +#+END_SRC + +* Features +** =+lsp= features +According to [[https://github.com/emacs-lsp/lsp-java]] it adds + ++ As you type reporting of parsing and compilation errors (via flycheck/[[https://github.com/emacs-lsp/lsp-ui][lsp-ui]]) ++ Code completion - using [[https://github.com/tigersoldier/company-lsp][company-lsp]] or builtin complete-at-point ++ Javadoc hovers - using [[https://github.com/emacs-lsp/lsp-ui][lsp-ui]] ++ Code actions - using [[https://github.com/emacs-lsp/lsp-ui][lsp-ui]] ++ Code outline - using builtin [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Imenu.html][imenu]] ++ Code navigation - using builtin [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Xref.html][xref]] ++ Code lens (references/implementations) - using builtin [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Xref.html][xref]] ++ Highlights ++ Code formatting ++ Maven pom.xml project support ++ Limited Gradle support ++ Visual debugger - [[https://github.com/yyoncho/dap-mode/][dap-mode]] ++ Test runner - [[https://github.com/yyoncho/dap-mode/][dap-mode]] ++ Project explorer integration - [[https://github.com/Alexander-Miller/treemacs][treemacs]] ++ Integration with [[https://start.spring.io/][Spring Initializr]] + +** =+meghanada= features +According to [[https://github.com/mopemope/meghanada-emacs/]] it adds + ++ Auto-update server module ++ [[https://gradle.org/][Gradle]] and [[http://maven.apache.org/][Maven]] and Eclipse project support ++ No need build tool's plugin ++ Run build tool task ++ Compile your project ++ Syntax check and analyze java source (=flycheck-meghanada=) ++ Support =Generic Types= ++ Code completion with [[http://company-mode.github.io/][company-mode]] (=company-meghanada=) ++ Optimize import and sort ++ Jump declaration ++ Run [[http://www.junit.org/][JUnit]] test (include test runner) ++ Diagnostic reporting with [[http://flycheck.org/][flycheck]] (=flycheck-meghanada=) ++ Show symbol's type info with =el-doc= ++ Search references ++ Full-featured text search + +* TODO Configuration diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 4b04f3dff..5e6dee5fd 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -22,7 +22,7 @@ If the depth is 2, the first two directories are removed: net.lissner.game.") ;; -;; java-mode +;;; java-mode (add-hook 'java-mode-hook #'rainbow-delimiters-mode) @@ -31,7 +31,7 @@ If the depth is 2, the first two directories are removed: net.lissner.game.") ;; -;; Common packages +;;; Common packages (use-package! android-mode :commands android-mode diff --git a/modules/lang/javascript/README.org b/modules/lang/javascript/README.org index 2d45742fa..7edd05fc5 100644 --- a/modules/lang/javascript/README.org +++ b/modules/lang/javascript/README.org @@ -37,7 +37,6 @@ This module adds JavaScript and TypeScript support. + [[https://github.com/mooz/js2-mode][js2-mode]] + [[https://github.com/felipeochoa/rjsx-mode][rjsx-mode]] + [[https://github.com/emacs-typescript/typescript.el][typescript-mode]] -+ [[https://github.com/aaronjensen/eslintd-fix][eslintd-fix]] + [[https://github.com/magnars/js2-refactor.el][js2-refactor]] + [[https://github.com/mojochao/npm-mode][npm-mode]] + [[https://github.com/abicky/nodejs-repl.el][nodejs-repl]] diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index a570be4ff..d4633f6b6 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -83,18 +83,6 @@ Run this for any buffer you want to skewer." ;; ;; Hooks -;;;###autoload -(defun +javascript-add-node-modules-path-h () - "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-h () "Clean up dangling tsserver processes if there are no more buffers with diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index c2fddb09b..479116ec7 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -133,7 +133,9 @@ ;; ;;; Tools -(add-hook! '(js-mode-hook typescript-mode-hook web-mode-hook) +(add-hook! '(js2-mode-local-vars-hook + typescript-mode-local-vars-hook + web-mode-local-vars-hook) (defun +javascript-init-lsp-or-tide-maybe-h () "Start `lsp' or `tide' in the current buffer. @@ -177,9 +179,11 @@ to tide." (setq-default company-backends (delq 'company-tide (default-value 'company-backends)))) (set-company-backend! 'tide-mode 'company-tide) ;; navigation - (set-lookup-handlers! 'tide-mode - :definition '(tide-jump-to-definition :async t) - :references '(tide-references :async t)) + (set-lookup-handlers! 'tide-mode :async t + :definition #'tide-jump-to-definition + :references #'tide-references + :documentation #'tide-documentation-at-point) + (set-popup-rule! "^\\*tide-documentation" :quit t) ;; resolve to `doom-project-root' if `tide-project-root' fails (advice-add #'tide-project-root :override #'+javascript-tide-project-root-a) ;; cleanup tsserver when no tide buffers are left @@ -192,8 +196,6 @@ to tide." ;; `tide-mode-hook' is too early, so... (advice-add #'tide-setup :after #'eldoc-mode) - (define-key tide-mode-map [remap +lookup/documentation] #'tide-documentation-at-point) - (map! :localleader :map tide-mode-map "R" #'tide-restart-server @@ -239,13 +241,6 @@ to tide." (js2r-add-keybindings-with-prefix (format "%s r" doom-localleader-key))))) -(use-package! eslintd-fix - :commands eslintd-fix - :config - (setq-hook! 'eslintd-fix-mode-hook - flycheck-javascript-eslint-executable eslintd-fix-executable)) - - ;;;###package skewer-mode (map! :localleader (:after js2-mode @@ -292,10 +287,11 @@ to tide." web-mode markdown-mode js-mode + json-mode typescript-mode solidity-mode) :when (locate-dominating-file default-directory "package.json") - :add-hooks '(+javascript-add-node-modules-path-h npm-mode)) + :add-hooks '(add-node-modules-path npm-mode)) (def-project-mode! +javascript-gulp-mode :when (locate-dominating-file default-directory "gulpfile.js")) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 5c3f1f9ad..8e51570d3 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -2,21 +2,21 @@ ;;; lang/javascript/packages.el ;; Major modes -(package! coffee-mode :pin "35a41c7d82") -(package! js2-mode :pin "fe53814dc2") -(package! rjsx-mode :pin "0061587a06") -(package! typescript-mode :pin "102587e458") +(package! coffee-mode :pin "35a41c7d8233eac0b267d9593e67fb8b6235e134") +(package! js2-mode :pin "fe53814dc2a0db2e95ac06083362e43923bf83fc") +(package! rjsx-mode :pin "0061587a06cdc2579a8d0e90863498d96bf982d8") +(package! typescript-mode :pin "102587e458d48ece6335cd708300647f22ec8b8d") ;; Tools -(package! eslintd-fix :pin "0c431141be") -(package! js2-refactor :pin "d4c40b5fc8") -(package! npm-mode :pin "3ee7c0bad5") +(package! js2-refactor :pin "d4c40b5fc86d3edd7c6a7d83ac86483ee1cb7a28") +(package! npm-mode :pin "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb") +(package! add-node-modules-path :pin "f31e69ccb681f882aebb806ce6e9478e3ac39708") ;; Eval -(package! nodejs-repl :pin "6fad7d764f") -(package! skewer-mode :pin "e5bed35193") +(package! nodejs-repl :pin "6fad7d764fa0d818ba497450bd722ae10cb8efed") +(package! skewer-mode :pin "e5bed351939c92a1f788f78398583c2f83f1bb3c") ;; Programming environment -(package! tide :pin "3b45610faa") +(package! tide :pin "3b45610faaab33bc53ae2d44e1e573f19f35a74a") (when (featurep! :tools lookup) - (package! xref-js2 :pin "6f1ed5dae0")) + (package! xref-js2 :pin "6f1ed5dae0c2485416196a51f2fa92f32e4b8262")) diff --git a/modules/lang/json/README.org b/modules/lang/json/README.org new file mode 100644 index 000000000..6106c7ff1 --- /dev/null +++ b/modules/lang/json/README.org @@ -0,0 +1,40 @@ +#+TITLE: lang/json +#+DATE: April 23, 2020 +#+SINCE: v3.0.0 +#+STARTUP: inlineimages nofold + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#maintainers][Maintainers]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] +- [[#prerequisites][Prerequisites]] +- [[#features][Features]] +- [[#configuration][Configuration]] +- [[#troubleshooting][Troubleshooting]] + +* Description +This module provides JSON support. + +** Maintainers +This module has no dedicated maintainers. + +** Module Flags ++ =+lsp= Enable integration with LSP servers, if one is available. Requires the + =:tools lsp= module to be enabled. + +** Plugins ++ [[https://github.com/joshwnj/json-mode][json-mode]] ++ [[https://github.com/Sterlingg/json-snatcher][json-snatcher]] + +* Prerequisites +This module has no prereqisites. + +* TODO Features +# An in-depth list of features, how to use them, and their dependencies. + +* TODO Configuration +# How to configure this module, including common problems and how to address them. + +* TODO Troubleshooting +# Common issues and their solution, or places to look for help. diff --git a/modules/lang/json/config.el b/modules/lang/json/config.el new file mode 100644 index 000000000..62db538af --- /dev/null +++ b/modules/lang/json/config.el @@ -0,0 +1,14 @@ +;;; lang/json/config.el -*- lexical-binding: t; -*- + +(use-package! json-mode + :mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'" + :init + (when (featurep! +lsp) + (add-hook 'json-mode-local-vars-hook #'lsp!)) + :config + (set-electric! 'json-mode :chars '(?\n ?: ?{ ?})) + + (map! :after json-mode + :map json-mode-map + :localleader + "s" #'jsons-print-path)) diff --git a/modules/lang/json/packages.el b/modules/lang/json/packages.el new file mode 100644 index 000000000..69d84fb8a --- /dev/null +++ b/modules/lang/json/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/json/packages.el + +(package! json-mode :pin "0e819e519a") +(package! json-snatcher :pin "c4cecc0a50") diff --git a/modules/lang/julia/autoload.el b/modules/lang/julia/autoload.el index 5d0d16641..d25f60b58 100644 --- a/modules/lang/julia/autoload.el +++ b/modules/lang/julia/autoload.el @@ -10,7 +10,8 @@ "Run an inferior instance of `julia' inside Emacs." (interactive) (if (require 'julia-repl nil t) - (julia-repl) + (prog1 (julia-repl) + (julia-repl-use-emacsclient)) (let ((buffer (get-buffer-create "*Julia*"))) (unless (comint-check-proc "*Julia*") (apply #'make-comint-in-buffer "Julia" "*Julia*" julia-program julia-arguments)) diff --git a/modules/lang/latex/README.org b/modules/lang/latex/README.org index a70d76989..1baa4a33c 100644 --- a/modules/lang/latex/README.org +++ b/modules/lang/latex/README.org @@ -33,6 +33,8 @@ Provide a helping hand when working with LaTeX documents. ** Module Flags + =+latexmk= Use LatexMk instead of LaTeX to compile documents. + =+cdlatex= Enable [[https://github.com/cdominik/cdlatex][cdlatex]] for fast math insertion. ++ =+lsp= Start LSP automatically in `tex-mode-hook`. This requires the =:tools + lsp= module. Supported servers are `digestif` and `TexLab`. + =+fold= Use TeX-fold (from auctex) to fold LaTeX macros to unicode, and make folding hook-based and less manual. diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 8d8f4e16b..31227ae65 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -70,7 +70,12 @@ If no viewers are found, `latex-preview-pane' is used.") (sp-local-pair modes open nil :actions :rem)) ;; And tweak these so that users can decide whether they want use latex ;; quotes or not, via `+latex-enable-plain-double-quotes' - (sp-local-pair modes "``" nil :unless '(:add sp-in-math-p))))) + (sp-local-pair modes "``" nil :unless '(:add sp-in-math-p)))) + ;; Hook lsp if enabled + (when (featurep! +lsp) + (add-hook! '(tex-mode-local-vars-hook + latex-mode-local-vars-hook) + #'lsp!))) (use-package! tex-fold @@ -209,6 +214,7 @@ is mostly for \\section etc." (add-to-list '+latex--company-backends #'company-auctex-environments nil #'eq) (add-to-list '+latex--company-backends #'company-auctex-macros nil #'eq)) + (use-package! company-math :when (featurep! :completion company) :defer t diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index ddce13f34..448710520 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -27,11 +27,17 @@ capture, the end position, and the output buffer.") markdown-gfm-additional-languages '("sh") markdown-make-gfm-checkboxes-buttons t - ;; Preview/compilation defaults + ;; `+markdown-compile' offers support for many transpilers (see + ;; `+markdown-compile-functions'), which it tries until one succeeds. markdown-command #'+markdown-compile + ;; This is set to `nil' by default, which causes a wrong-type-arg error + ;; when you use `markdown-open'. These are more sensible defaults. markdown-open-command (cond (IS-MAC "open") (IS-LINUX "xdg-open")) + + ;; A sensible and simple default preamble for markdown exports that + ;; takes after the github asthetic (plus highlightjs syntax coloring). markdown-content-type "application/xhtml+xml" markdown-css-paths '("https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.min.css" @@ -57,6 +63,7 @@ capture, the end position, and the output buffer.") (sp-local-pair '(markdown-mode gfm-mode) "`" "`" :unless '(:add sp-point-before-word-p sp-point-before-same-p)) + ;; Don't trigger autofill in code blocks (see `auto-fill-mode') (setq-hook! 'markdown-mode-hook fill-nobreak-predicate (cons #'markdown-code-block-at-point-p fill-nobreak-predicate)) @@ -70,6 +77,7 @@ capture, the end position, and the output buffer.") (map! :map markdown-mode-map :localleader + "'" #'markdown-edit-code-block "o" #'markdown-open "p" #'markdown-preview "e" #'markdown-export diff --git a/modules/lang/markdown/packages.el b/modules/lang/markdown/packages.el index 6f82df4ba..dfe2f4572 100644 --- a/modules/lang/markdown/packages.el +++ b/modules/lang/markdown/packages.el @@ -1,13 +1,14 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/markdown/packages.el -(package! markdown-mode :pin "e9dff50d57") -(package! markdown-toc :pin "7038f4f6d5") -(package! edit-indirect :pin "935ded353b") +(package! markdown-mode :pin "c927a114b1b23cf7538181d62fd14679cce7fa25") +(package! markdown-toc :pin "eda9650a1bf0015e52e9678bd92b0a8beb1d7d71") +(package! edit-indirect :pin "935ded353b9ed3da67bc61abf245c21b58d88864") (when (featurep! +grip) - (package! grip-mode :pin "9615c47747")) + (package! grip-mode :pin "9615c4774727a719d38313a679d70f2a2c6aca68")) (when (featurep! :editor evil +everywhere) (package! evil-markdown - :recipe (:host github :repo "Somelauw/evil-markdown") :pin "46cd81b379")) + :recipe (:host github :repo "Somelauw/evil-markdown") + :pin "46cd81b37991c4325fc24015a610f832b0ff995d")) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index ce39dbd09..5026a9b15 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/nix/packages.el -(package! nix-mode :pin "5b5961780f") -(package! nix-update :pin "fc6c39c2da") +(package! nix-mode :pin "5b5961780f3b1c1b62453d2087f775298980f10d") +(package! nix-update :pin "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7") (when (featurep! :completion company) - (package! company-nixos-options :pin "977b9a505f")) + (package! company-nixos-options :pin "977b9a505ffc8b33b70ec7742f90e469b3168297")) (when (featurep! :completion helm) - (package! helm-nixos-options :pin "977b9a505f")) + (package! helm-nixos-options :pin "977b9a505ffc8b33b70ec7742f90e469b3168297")) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index fa41685b2..dbe88739b 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -42,7 +42,7 @@ PATH (a string) can be an url, a local file path, or a base64 encoded datauri." (unless (eq major-mode 'org-mode) (user-error "Not in an org buffer")) (require 'org-download) - (condition-case ex + (condition-case-unless-debug e (let ((raw-uri (url-unhex-string path))) (cond ((string-match-p "^data:image/png;base64," path) (org-download-dnd-base64 path nil)) @@ -56,4 +56,4 @@ PATH (a string) can be an url, a local file path, or a base64 encoded datauri." ;; insert the link (org-download-insert-link raw-uri new-path))))) (error - (user-error "Failed to attach file: %s" (error-message-string ex))))) + (user-error "Failed to attach file: %s" (error-message-string e))))) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index d64372139..d4be3f097 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -50,7 +50,7 @@ you're done. This can be called from an external shell script." (with-selected-frame frame (require 'org-capture) (condition-case ex - (cl-letf (((symbol-function #'pop-to-buffer) #'switch-to-buffer)) + (letf! ((#'pop-to-buffer #'switch-to-buffer)) (switch-to-buffer (doom-fallback-buffer)) (let ((org-capture-initial initial-input) org-capture-entry) diff --git a/modules/lang/org/autoload/org-link.el b/modules/lang/org/autoload/org-link.el index bc4317183..59d6c477b 100644 --- a/modules/lang/org/autoload/org-link.el +++ b/modules/lang/org/autoload/org-link.el @@ -1,43 +1,72 @@ ;;; lang/org/autoload/org-link.el -*- lexical-binding: t; -*- -(defun +org--relpath (path root) +(defun +org--relative-path (path root) (if (and buffer-file-name (file-in-directory-p buffer-file-name root)) (file-relative-name path) path)) -;;;###autoload -(defun +org-def-link (key dir) - (org-link-set-parameters - key - :complete (lambda () (+org--relpath (+org-link-read-file key dir) dir)) - :follow (lambda (link) (find-file (expand-file-name link dir))) - :face (lambda (link) - (if (file-exists-p (expand-file-name link dir)) - 'org-link - 'error)))) +(defun +org--read-link-path (key dir &optional fn) + (let ((file (funcall (or fn #'read-file-name) (format "%s: " (capitalize key)) dir))) + (format "%s:%s" key (file-relative-name file dir)))) ;;;###autoload -(defun +org-link-read-file (key dir) - (let ((file (read-file-name (format "%s: " (capitalize key)) dir))) - (format "%s:%s" - key - (file-relative-name file dir)))) +(defun +org-define-basic-link (key dir-var &rest plist) + "Define a link with some basic completion & fontification. + +KEY is the name of the link type. DIR-VAR is the directory variable to resolve +links relative to. PLIST is passed to `org-link-set-parameters' verbatim. + +Links defined with this will be rendered in the `error' face if the file doesn't +exist, and `org-link' otherwise." + (declare (indent 2)) + (let ((requires (plist-get plist :requires)) + (dir-fn (if (functionp dir-var) + dir-var + (lambda () (symbol-value dir-var))))) + (apply #'org-link-set-parameters + key + :complete (lambda () + (if requires (mapc #'require (doom-enlist requires))) + (+org--relative-path (+org--read-link-path key (funcall dir-fn)) + (funcall dir-fn))) + :follow (lambda (link) + (org-link-open-as-file (expand-file-name link (funcall dir-fn)) nil)) + :face (lambda (link) + (if (file-exists-p (expand-file-name link (funcall dir-fn))) + 'org-link + 'error)) + (doom-plist-delete plist :requires)))) + + +;; +;;; Image data functions (for custom inline images) ;;;###autoload -(defun +org-link-read-directory (key dir) - (let ((file (read-directory-name (format "%s: " (capitalize key)) dir))) - (format "%s:%s" - key - (file-relative-name file dir)))) +(defun +org-image-file-data-fn (protocol link _description) + "Intepret LINK as an image file path and return its data." + (setq + link (expand-file-name + link + (pcase protocol + ("download" (or org-download-image-dir org-attach-id-dir default-directory)) + ("attachment" org-attach-id-dir) + (_ default-directory)))) + (when (and (file-exists-p link) + (image-type-from-file-name link)) + (with-temp-buffer + (set-buffer-multibyte nil) + (setq buffer-file-coding-system 'binary) + (insert-file-contents-literally link) + (buffer-substring-no-properties (point-min) (point-max))))) ;;;###autoload -(defun +org-inline-data-image (_protocol link _description) +(defun +org-inline-image-data-fn (_protocol link _description) "Interpret LINK as base64-encoded image data." (base64-decode-string link)) ;;;###autoload -(defun +org-image-link (protocol link _description) - "Interpret LINK as base64-encoded image data." +(defun +org-http-image-data-fn (protocol link _description) + "Interpret LINK as an URL to an image file." (when (image-type-from-file-name link) (if-let* ((buf (url-retrieve-synchronously (concat protocol ":" link)))) (with-current-buffer buf diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 15aa2c126..e817f6ec7 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -65,6 +65,12 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default ;; ;;; `org-load' hooks +(defun +org-init-org-directory-h () + (unless org-directory + (setq org-directory "~/org")) + (setq org-id-locations-file (expand-file-name ".orgids" org-directory))) + + (defun +org-init-agenda-h () (unless org-agenda-files (setq org-agenda-files (list org-directory))) @@ -88,14 +94,11 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default org-entities-user '(("flat" "\\flat" nil "" "" "266D" "♭") ("sharp" "\\sharp" nil "" "" "266F" "♯")) - org-fontify-done-headline t org-fontify-quote-and-verse-blocks t org-fontify-whole-heading-line t org-footnote-auto-label 'plain org-hide-leading-stars t - org-hide-leading-stars-before-indent-mode t org-image-actual-width nil - org-list-description-max-indent 4 org-priority-faces '((?A . error) (?B . warning) @@ -114,9 +117,6 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default org-refile-use-outline-path 'file org-outline-path-complete-in-steps nil) - ;; Fontify latex blocks and entities, but not natively -- that's too slow - (setq org-highlight-latex-and-related '(latex script entities)) - (plist-put org-format-latex-options :scale 1.5) ; larger previews (add-hook! 'doom-load-theme-hook (defun +org-refresh-latex-background-h () @@ -162,12 +162,11 @@ This forces it to read the background before rendering." ("HOLD" . +org-todo-onhold) ("PROJ" . +org-todo-project))) - (defadvice! +org-display-link-in-eldoc-a (orig-fn &rest args) + (defadvice! +org-display-link-in-eldoc-a (&rest args) "Display full link in minibuffer when cursor/mouse is over it." - :around #'org-eldoc-documentation-function - (or (when-let (link (org-element-property :raw-link (org-element-context))) - (format "Link: %s" link)) - (apply orig-fn args))) + :before-until #'org-eldoc-documentation-function + (when-let (link (org-element-property :raw-link (org-element-context))) + (format "Link: %s" link))) ;; Automatic indent detection in org files is meaningless (add-to-list 'doom-detect-indentation-excluded-modes 'org-mode) @@ -340,7 +339,7 @@ relative to `org-directory', unless it is an absolute path." (defadvice! +org--prevent-save-prompts-when-refiling-a (&rest _) "Fix #462: when refiling from org-capture, Emacs prompts to kill the underlying, modified buffer. This fixes that." - :after 'org-refile + :after #'org-refile (when (bound-and-true-p org-capture-is-refiling) (org-save-all-org-buffers))) @@ -366,14 +365,15 @@ underlying, modified buffer. This fixes that." (defun +org-init-attachments-h () "Sets up org's attachment system." + (setq org-attach-store-link-p t ; store link after attaching files + org-attach-use-inheritance t) ; inherit properties from parent nodes + ;; Centralized attachments directory - (setq org-attach-id-dir (doom-path org-directory org-attach-id-dir) - ;; Store a link to attachments when they are attached - org-attach-store-link-p t - ;; Inherit attachment properties from parent nodes - org-attach-use-inheritance t) - (after! projectile - (add-to-list 'projectile-globally-ignored-directories org-attach-id-dir))) + (after! org-attach + (unless org-attach-id-dir + (setq org-attach-id-dir (expand-file-name ".attach/" org-directory))) + (after! projectile + (add-to-list 'projectile-globally-ignored-directories org-attach-id-dir)))) (defun +org-init-custom-links-h () @@ -397,15 +397,15 @@ underlying, modified buffer. This fixes that." '("wolfram" . "https://wolframalpha.com/input/?i=%s") '("doom-repo" . "https://github.com/hlissner/doom-emacs/%s")) - (+org-def-link "org" org-directory) - (+org-def-link "doom" doom-emacs-dir) - (+org-def-link "doom-docs" doom-docs-dir) - (+org-def-link "doom-modules" doom-modules-dir) + (+org-define-basic-link "org" 'org-directory) + (+org-define-basic-link "doom" 'doom-emacs-dir) + (+org-define-basic-link "doom-docs" 'doom-docs-dir) + (+org-define-basic-link "doom-modules" 'doom-modules-dir) ;; Allow inline image previews of http(s)? urls or data uris - (org-link-set-parameters "http" :image-data-fun #'+org-image-link) - (org-link-set-parameters "https" :image-data-fun #'+org-image-link) - (org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image) + (org-link-set-parameters "http" :image-data-fun #'+org-http-image-data-fn) + (org-link-set-parameters "https" :image-data-fun #'+org-http-image-data-fn) + (org-link-set-parameters "img" :image-data-fun #'+org-inline-image-data-fn) ;; Add support for youtube links + previews (require 'org-yt nil t)) @@ -458,9 +458,9 @@ underlying, modified buffer. This fixes that." (defun +org-init-hacks-h () "Getting org to behave." - ;; Don't open separate windows + ;; Open file links in current window, rather than new ones (setf (alist-get 'file org-link-frame-setup) #'find-file) - ;; Open directory links in Emacs + ;; Open directory links in dired (add-to-list 'org-file-apps '(directory . emacs)) ;; When you create a sparse tree and `org-indent-mode' is enabled, the @@ -489,6 +489,13 @@ eldoc string." nil 'face `(:foreground ,(face-foreground face nil t) :weight bold))) width prefix separator)) + (after! org-eldoc + ;; HACK Fix #2972: infinite recursion when eldoc kicks in in 'org' or + ;; 'python' src blocks. + ;; TODO Should be reported upstream! + (puthash "org" #'ignore org-eldoc-local-functions-cache) + (puthash "python" #'python-eldoc-function org-eldoc-local-functions-cache)) + (defun +org--restart-mode-h () "Restart `org-mode', but only once." (quiet! (org-mode-restart)) @@ -529,11 +536,9 @@ current workspace (and clean them up)." ;; upstream (if ever). (defadvice! +org--fix-inline-images-for-imagemagick-users-a (orig-fn &rest args) :around #'org-display-inline-images - (cl-letf* ((old-create-image (symbol-function #'create-image)) - ((symbol-function #'create-image) - (lambda (file-or-data &optional type data-p &rest props) - (let ((type (if (plist-get props :width) type))) - (apply old-create-image file-or-data type data-p props))))) + (letf! (defun create-image (file-or-data &optional type data-p &rest props) + (let ((type (if (plist-get props :width) type))) + (apply create-image file-or-data type data-p props))) (apply orig-fn args))) (defadvice! +org--fix-inconsistent-uuidgen-case-a (uuid) @@ -568,6 +573,9 @@ between the two." "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images ;; textmate-esque newline insertion + "C-RET" #'+org/insert-item-below + "C-S-RET" #'+org/insert-item-above + "C-M-RET" #'org-insert-subheading [C-return] #'+org/insert-item-below [C-S-return] #'+org/insert-item-above [C-M-return] #'org-insert-subheading @@ -580,7 +588,10 @@ between the two." [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line :localleader + "#" #'org-update-statistics-cookies "'" #'org-edit-special + "*" #'org-ctrl-c-star + "+" #'org-ctrl-c-minus "," #'org-switchb "." #'org-goto (:when (featurep! :completion ivy) @@ -590,7 +601,6 @@ between the two." "." #'helm-org-in-buffer-headings "/" #'helm-org-agenda-files-headings) "A" #'org-archive-subtree - "d" #'org-deadline "e" #'org-export-dispatch "f" #'org-footnote-new "h" #'org-toggle-heading @@ -600,7 +610,6 @@ between the two." "o" #'org-set-property "p" #'org-priority "q" #'org-set-tags-command - "s" #'org-schedule "t" #'org-todo "T" #'org-todo-list (:prefix ("a" . "attachments") @@ -623,24 +632,38 @@ between the two." (:prefix ("b" . "tables") "-" #'org-table-insert-hline "a" #'org-table-align + "b" #'org-table-blank-field "c" #'org-table-create-or-convert-from-region + "dc" #'org-table-delete-column + "dr" #'org-table-kill-row "e" #'org-table-edit-field + "f" #'org-table-edit-formulas "h" #'org-table-field-info + "s" #'org-table-sort-lines + "r" #'org-table-recalculate + "R" #'org-table-recalculate-buffer-tables (:when (featurep! +gnuplot) "p" #'org-plot/gnuplot)) (:prefix ("c" . "clock") - "c" #'org-clock-in - "C" #'org-clock-out + "c" #'org-clock-cancel "d" #'org-clock-mark-default-task "e" #'org-clock-modify-effort-estimate "E" #'org-set-effort - "l" #'org-clock-in-last "g" #'org-clock-goto "G" (λ! (org-clock-goto 'select)) - "r" #'org-clock-report - "x" #'org-clock-cancel + "i" #'org-clock-in + "I" #'org-clock-in-last + "o" #'org-clock-out + "r" #'org-resolve-clocks + "R" #'org-clock-report + "t" #'org-evaluate-time-range "=" #'org-clock-timestamps-up "-" #'org-clock-timestamps-down) + (:prefix ("d" . "date/deadline") + "d" #'org-deadline + "s" #'org-schedule + "t" #'org-time-stamp + "T" #'org-time-stamp-inactive) (:prefix ("g" . "goto") "g" #'org-goto (:when (featurep! :completion ivy) @@ -657,12 +680,13 @@ between the two." "x" #'org-capture-goto-last-stored) (:prefix ("l" . "links") "c" #'org-cliplink + "d" #'+org/remove-link + "i" #'org-id-store-link "l" #'org-insert-link "L" #'org-insert-all-links "s" #'org-store-link "S" #'org-insert-last-stored-link - "i" #'org-id-store-link - "d" #'+org/remove-link) + "t" #'org-toggle-link-display) (:prefix ("r" . "refile") "." #'+org/refile-to-current-file "c" #'+org/refile-to-running-clock @@ -782,11 +806,14 @@ compelling reason, so..." (use-package! org-crypt ; built-in :commands org-encrypt-entries org-encrypt-entry org-decrypt-entries org-decrypt-entry :hook (org-reveal-start . org-decrypt-entry) - :config - (add-hook! 'org-mode-hook - (add-hook 'before-save-hook 'org-encrypt-entries nil t)) - (add-to-list 'org-tags-exclude-from-inheritance "crypt") - (setq org-crypt-key user-mail-address)) + :preface + ;; org-crypt falls back to CRYPTKEY property then `epa-file-encrypt-to', which + ;; is a better default than the empty string `org-crypt-key' defaults to. + (defvar org-crypt-key nil) + (after! org + (add-to-list 'org-tags-exclude-from-inheritance "crypt") + (add-hook! 'org-mode-hook + (add-hook 'before-save-hook 'org-encrypt-entries nil t)))) (use-package! org-clock ; built-in @@ -915,10 +942,12 @@ compelling reason, so..." org-list org-pcomplete org-src org-footnote org-macro ob org org-agenda org-capture :preface - ;; Change org defaults (should be set before org loads) - (setq org-directory "~/org/" - org-attach-id-dir ".attach/" - org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/") + ;; Set these to nil now so we can detect user changes to them later (and fall + ;; back on defaults otherwise) + (defvar org-directory nil) + (defvar org-attach-id-dir nil) + + (setq org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/") org-preview-latex-image-directory (concat doom-cache-dir "org-latex/")) ;; Make most of the default modules opt-in, because I sincerely doubt most @@ -960,6 +989,7 @@ compelling reason, so..." #'+org-unfold-to-2nd-level-or-point-h) (add-hook! 'org-load-hook + #'+org-init-org-directory-h #'+org-init-appearance-h #'+org-init-agenda-h #'+org-init-attachments-h @@ -993,7 +1023,6 @@ compelling reason, so..." ;; Global ID state means we can have ID links anywhere. This is required for ;; `org-brain', however. (setq org-id-track-globally t - org-id-locations-file (expand-file-name ".orgids" org-directory) org-id-locations-file-relative t) ;; HACK `org-id' doesn't check if `org-id-locations-file' exists or is diff --git a/modules/lang/org/contrib/dragndrop.el b/modules/lang/org/contrib/dragndrop.el index 84e2671e1..8d7b54699 100644 --- a/modules/lang/org/contrib/dragndrop.el +++ b/modules/lang/org/contrib/dragndrop.el @@ -16,62 +16,52 @@ (after! org ;; A shorter link to attachments - (+org-def-link "download" org-attach-id-dir) - (setf (alist-get "download" org-link-abbrev-alist nil nil #'equal) - (abbreviate-file-name org-attach-id-dir))) + (+org-define-basic-link "download" (lambda () (or org-download-image-dir org-attach-id-dir ".")) + :image-data-fun #'+org-image-file-data-fn + :requires 'org-download)) :config - (setq org-download-image-dir org-attach-id-dir - org-download-link-format "[[download:%s]]\n" - org-download-method 'attach - org-download-heading-lvl nil + (unless org-download-image-dir + (setq org-download-image-dir org-attach-id-dir)) + (setq org-download-method 'attach org-download-timestamp "_%Y%m%d_%H%M%S" org-download-screenshot-method (cond (IS-MAC "screencapture -i %s") (IS-LINUX (cond ((executable-find "maim") "maim -s %s") ((executable-find "scrot") "scrot -s %s") - ((executable-find "gnome-screenshot") "gnome-screenshot -a -f %s"))))) + ((executable-find "gnome-screenshot") "gnome-screenshot -a -f %s")))) - ;; Handle non-image files a little differently. Images should be inserted - ;; as-is, as image previews. Other files, like pdfs or zips, should be linked - ;; to, with an icon indicating the type of file. - (defadvice! +org--dragndrop-insert-link-a (_link filename) - "Produces and inserts a link to FILENAME into the document. + org-download-heading-lvl nil + org-download-link-format "[[download:%s]]\n" + org-download-annotate-function (lambda (_link) "") + org-download-link-format-function + (lambda (filename) + (if (eq org-download-method 'attach) + (format "[[attachment:%s]]\n" + (org-link-escape + (file-relative-name filename (org-attach-dir)))) + ;; Handle non-image files a little differently. Images should be + ;; inserted as normal with previews. Other files, like pdfs or zips, + ;; should be linked to, with an icon indicating the type of file. + (format (concat (unless (image-type-from-file-name filename) + (concat (+org-attach-icon-for filename) + " ")) + org-download-link-format) + (org-link-escape + (funcall org-download-abbreviate-filename-function filename))))) + org-download-abbreviate-filename-function + (lambda (path) + (if (file-in-directory-p path org-download-image-dir) + (file-relative-name path org-download-image-dir) + path))) -If FILENAME is an image, produce an attach:%s path, otherwise use file:%s (with -an file icon produced by `+org-attach-icon-for')." - :override #'org-download-insert-link - (if (looking-back "^[ \t]+" (line-beginning-position)) - (delete-region (match-beginning 0) (match-end 0)) - (newline)) - (cond ((image-type-from-file-name filename) - (insert - (concat - (if (= org-download-image-html-width 0) "" - (format "#+attr_html: :width %dpx\n" org-download-image-html-width)) - (if (= org-download-image-latex-width 0) "" - (format "#+attr_latex: :width %dcm\n" org-download-image-latex-width)) - (if (= org-download-image-org-width 0) "" - (format "#+attr_org: :width %dpx\n" org-download-image-org-width)) - (format org-download-link-format - (cond ((file-in-directory-p filename org-attach-id-dir) - (file-relative-name filename org-attach-id-dir)) - ((file-in-directory-p filename org-directory) - (file-relative-name filename org-directory)) - (filename))))) - (org-display-inline-images)) - ((insert - (format "%s [[./%s][%s]] " - (+org-attach-icon-for filename) - (file-relative-name filename (file-name-directory buffer-file-name)) - (file-name-nondirectory (directory-file-name filename))))))) - - (advice-add #'org-download--dir-2 :override #'ignore) - (defadvice! +org--dragndrop-download-fullname-a (path) - "Write PATH relative to current file." - :filter-return #'org-download--fullname - (let ((dir (or (if buffer-file-name (file-name-directory buffer-file-name)) - default-directory))) - (if (file-in-directory-p dir org-directory) - (file-relative-name path dir) - path)))) + (defadvice! +org--dragndrop-then-display-inline-images-a (_link filename) + :after #'org-download-insert-link + (when (image-type-from-file-name filename) + (save-excursion + (org-display-inline-images + t t + (progn (org-back-to-heading t) (point)) + (progn (org-end-of-subtree t t) + (when (and (org-at-heading-p) (not (eobp))) (backward-char 1)) + (point))))))) diff --git a/modules/lang/org/contrib/present.el b/modules/lang/org/contrib/present.el index a92ff6572..d05cf8985 100644 --- a/modules/lang/org/contrib/present.el +++ b/modules/lang/org/contrib/present.el @@ -41,20 +41,19 @@ (defadvice! +org-present--narrow-to-subtree-a (orig-fn &rest args) "Narrow to the target subtree when you start the presentation." :around #'org-tree-slide--display-tree-with-narrow - (cl-letf (((symbol-function #'org-narrow-to-subtree) - (lambda () - (save-excursion - (save-match-data - (org-with-limited-levels - (narrow-to-region - (progn - (when (org-before-first-heading-p) - (org-next-visible-heading 1)) - (ignore-errors (org-up-heading-all 99)) - (forward-line 1) - (point)) - (progn (org-end-of-subtree t t) - (when (and (org-at-heading-p) (not (eobp))) - (backward-char 1)) - (point))))))))) + (letf! ((defun org-narrow-to-subtree () + (save-excursion + (save-match-data + (org-with-limited-levels + (narrow-to-region + (progn + (when (org-before-first-heading-p) + (org-next-visible-heading 1)) + (ignore-errors (org-up-heading-all 99)) + (forward-line 1) + (point)) + (progn (org-end-of-subtree t t) + (when (and (org-at-heading-p) (not (eobp))) + (backward-char 1)) + (point)))))))) (apply orig-fn args)))) diff --git a/modules/lang/org/contrib/roam.el b/modules/lang/org/contrib/roam.el index a5dcc3e83..de0997afc 100644 --- a/modules/lang/org/contrib/roam.el +++ b/modules/lang/org/contrib/roam.el @@ -1,12 +1,19 @@ ;;; lang/org/contrib/roam.el -*- lexical-binding: t; -*- ;;;###if (featurep! +roam) +(defvar +org-roam-open-buffer-on-find-file t + "If non-nil, open the org-roam buffer when opening an org roam file.") + + +;; +;;; Packages + (use-package! org-roam :hook (org-load . org-roam-mode) :hook (org-roam-backlinks-mode . turn-on-visual-line-mode) :commands (org-roam-buffer-toggle-display org-roam-find-file - org-roam-graph-show + org-roam-graph org-roam-insert org-roam-switch-to-buffer org-roam-dailies-date @@ -24,7 +31,7 @@ :prefix ("m" . "org-roam") "b" #'org-roam-switch-to-buffer "f" #'org-roam-find-file - "g" #'org-roam-graph-show + "g" #'org-roam-graph "i" #'org-roam-insert "m" #'org-roam (:prefix ("d" . "by date") @@ -33,21 +40,32 @@ :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow :desc "Yesterday" "y" #'org-roam-dailies-yesterday)) :config - (setq org-roam-directory (expand-file-name (or org-roam-directory "") + (setq org-roam-directory (expand-file-name (or org-roam-directory "roam") org-directory) org-roam-verbose nil ; https://youtu.be/fn4jIlFwuLU + org-roam-buffer-no-delete-other-windows t ; make org-roam buffer sticky org-roam-completion-system (cond ((featurep! :completion helm) 'helm) ((featurep! :completion ivy) 'ivy) ((featurep! :completion ido) 'ido) ('default))) - ;; HACK Hide the mode line in the org-roam buffer, since it serves no purpose. - ;; This makes it easier to distinguish among other org buffers. - (defadvice! +org--hide-mode-line-a (&rest _) - :after #'org-roam-buffer--get-create - (with-current-buffer org-roam-buffer - (hide-mode-line-mode +1)))) + ;; Normally, the org-roam buffer doesn't open until you explicitly call + ;; `org-roam'. If `+org-roam-open-buffer-on-find-file' is non-nil, the + ;; org-roam buffer will be opened for you when you use `org-roam-find-file' + ;; (but not `find-file', to limit the scope of this behavior). + (add-hook! 'find-file-hook + (defun +org-roam-open-buffer-maybe-h () + (and +org-roam-open-buffer-on-find-file + (memq 'org-roam-buffer--update-maybe post-command-hook) + (not (window-parameter nil 'window-side)) ; don't proc for popups + (not (eq 'visible (org-roam-buffer--visibility))) + (with-current-buffer (window-buffer) + (org-roam-buffer--get-create))))) + + ;; Hide the mode line in the org-roam buffer, since it serves no purpose. This + ;; makes it easier to distinguish among other org buffers. + (add-hook 'org-roam-buffer-prepare-hook #'hide-mode-line-mode)) ;; Since the org module lazy loads org-protocol (waits until an org URL is diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 7ef518d73..64b725ff6 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -27,84 +27,84 @@ :recipe (:host github :repo "emacs-straight/org-mode" :files ("*.el" "lisp/*.el" "contrib/lisp/*.el")) - :pin "9994e8ee89") + :pin "e5eda0beeb3b6b0666550091bcc0df066d52c008") ;; ...And prevent other packages from pulling org; org-plus-contrib satisfies ;; the dependency already: https://github.com/raxod502/straight.el/issues/352 (package! org :recipe (:local-repo nil)) (package! avy) -(package! htmlize :pin "86f22f211e") -(package! org-superstar :pin "09ddc28383") +(package! htmlize :pin "86f22f211e9230857197c42a9823d3f05381deed") +(package! org-superstar :pin "09ddc28383d363a4b353348a433e24535b4af0e3") (package! org-yt :recipe (:host github :repo "TobiasZawada/org-yt") - :pin "40cc1ac76d") -(package! ox-clip :pin "bd36f9fb4e") -(package! toc-org :pin "5deaec41ed") -(package! org-cliplink :pin "82402cae7e") + :pin "40cc1ac76d741055cbefa13860d9f070a7ade001") +(package! ox-clip :pin "bd36f9fb4e3b1b9e8686b993b02ccd780ff75a96") +(package! toc-org :pin "5deaec41ed0e5c51715737d7f74c5ae1b3c00387") +(package! org-cliplink :pin "82402cae7e118d67de7328417fd018a18f95fac2") (when (featurep! :editor evil +everywhere) (package! evil-org :recipe (:host github :repo "hlissner/evil-org-mode") - :pin "4d44e9bbdc")) + :pin "9cf661af8ff8ea768ef1e55045be14d0468a90f5")) (when (featurep! :tools pdf) - (package! org-pdftools :pin "22d9a367ab")) + (package! org-pdftools :pin "8cc15bb8014ed1f047eecc0abd8bf447f86c0505")) (when (featurep! :tools magit) - (package! orgit :pin "e147f05577")) + (package! orgit :pin "e147f055772cc934fe1f1d8619059badeb647c93")) (when (featurep! +brain) - (package! org-brain :pin "3630eb88a3")) + (package! org-brain :pin "ae7fe0f628bd093526786ece6917f7a4310e5e4d")) (when (featurep! +dragndrop) - (package! org-download :pin "46417e2bd3")) + (package! org-download :pin "48d3952ad8ebc5ef5a6a77b8c6a4a0da61653036")) (when (featurep! +gnuplot) - (package! gnuplot :pin "f0001c3001") - (package! gnuplot-mode :pin "601f639298")) + (package! gnuplot :pin "f0001c30010b2899e36d7d89046322467e923088") + (package! gnuplot-mode :pin "601f6392986f0cba332c87678d31ae0d0a496ce7")) (when (featurep! +ipython) ; DEPRECATED - (package! ob-ipython :pin "7147455230")) + (package! ob-ipython :pin "7147455230841744fb5b95dcbe03320313a77124")) (when (featurep! +jupyter) - (package! jupyter :pin "62ad054001")) + (package! jupyter :pin "785edbbff65abb0c929dc2fbd8b8305c77fd529e")) (when (featurep! +journal) - (package! org-journal :pin "3fdb5b3036")) + (package! org-journal :pin "8bf06b28d6f14f52d4968123e2b4b91930c8f947")) +(when (featurep! +noter) + (package! org-noter :pin "9ead81d42dd4dd5074782d239b2efddf9b8b7b3d")) (when (featurep! +pomodoro) - (package! org-pomodoro :pin "aa07c11318")) + (package! org-pomodoro :pin "aa07c11318f91219336197e62c47bc7a3d090479")) (when (featurep! +present) (package! centered-window :recipe (:host github :repo "anler/centered-window-mode") - :pin "24f7c5be9d") - (package! org-tree-slide :pin "7bf09a02bd") - (package! org-re-reveal :pin "61549f4c00")) + :pin "f50859941ab5c7cbeaee410f2d38716252b552ac") + (package! org-tree-slide :pin "7bf09a02bd2d8f1ccfcb5209bfb18fbe02d1f44e") + (package! org-re-reveal :pin "61549f4c00284a30e34caa3d76001b233ea5d2ad")) (when (featurep! +roam) - (package! org-roam :pin "6175739b33") + (package! org-roam :pin "e698ed7f5378106da8a8fec4537658392157657c") (when (featurep! :completion company) - (package! company-org-roam :pin "0913d86f16"))) -(when (featurep! +noter) - (package! org-noter :pin "9ead81d42d")) + (package! company-org-roam :pin "0913d86f167164e18831206e611f44bb8e7297e3"))) ;;; Babel -(package! ob-async :pin "80a30b96a0") +(package! ob-async :pin "80a30b96a007d419ece12c976a81804ede340311") (when (featurep! :lang crystal) - (package! ob-crystal :pin "d84c1adee4")) + (package! ob-crystal :pin "d84c1adee4b269cdba06a97caedb8071561a09af")) (when (featurep! :lang go) - (package! ob-go :pin "2067ed55f4")) + (package! ob-go :pin "2067ed55f4c1d33a43cb3f6948609d240a8915f5")) (when (featurep! :lang hy) - (package! ob-hy :pin "a42ecaf440")) + (package! ob-hy :pin "a42ecaf440adc03e279afe43ee5ef6093ddd542a")) (when (featurep! :lang nim) - (package! ob-nim :pin "bf1642cb93")) + (package! ob-nim :pin "bf1642cb93f0a898804dc13fd9408d2964403bd2")) (when (featurep! :lang racket) (package! ob-racket :recipe (:host github :repo "DEADB17/ob-racket") - :pin "d8fd51bddb")) + :pin "d8fd51bddb019b0eb68755255f88fc800cfe03cb")) (when (featurep! :lang rest) - (package! ob-restclient :pin "f7449b2068")) + (package! ob-restclient :pin "f7449b2068498fe9d8ab9589e0a638148861533f")) (when (featurep! :lang rust) - (package! ob-rust :pin "6a82587598")) + (package! ob-rust :pin "6a82587598cd097e9642be916243c31f1231b24a")) (when (featurep! :lang scala) - (package! ob-ammonite :pin "39937dff39")) + (package! ob-ammonite :pin "39937dff395e70aff76a4224fa49cf2ec6c57cca")) ;;; Export (when (featurep! +pandoc) - (package! ox-pandoc :pin "aa37dc7e94")) + (package! ox-pandoc :pin "aa37dc7e94213d4ebedb85c384c1ba35007da18e")) (when (featurep! +hugo) (package! ox-hugo :recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t) - :pin "b6f4142de2")) + :pin "8f36181977377383cb54803651d93b24e370122d")) (when (featurep! :lang rst) - (package! ox-rst :pin "9158bfd180")) + (package! ox-rst :pin "9158bfd18096c559e0a225ae62ab683f1c98a547")) diff --git a/modules/lang/perl/config.el b/modules/lang/perl/config.el index 9301646b7..aa211f2bc 100644 --- a/modules/lang/perl/config.el +++ b/modules/lang/perl/config.el @@ -2,9 +2,15 @@ ;; There's also `perl-mode' for perl < 6, which is already set up. -(use-package! perl6-detect) + +(use-package! raku-mode + :defer t + :init + (defalias 'perl6-mode #'raku-mode) + :config + (set-repl-handler! 'raku-mode #'run-raku)) -(use-package! flycheck-perl6 +(use-package! flycheck-raku :when (featurep! :checkers syntax) - :after perl6-mode) + :after raku-mode) diff --git a/modules/lang/perl/packages.el b/modules/lang/perl/packages.el index 7c7adfd1d..5be816b9f 100644 --- a/modules/lang/perl/packages.el +++ b/modules/lang/perl/packages.el @@ -1,7 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/perl/packages.el -(package! perl6-mode :pin "88de065795") +(package! raku-mode :pin "d474216840251dc0efe4f4aa4f5c5f66ac26fa74") (when (featurep! :checkers syntax) - (package! flycheck-perl6 :pin "b804702305")) + (package! flycheck-raku + :recipe (:host github :repo "widefox/flycheck-raku") + :pin "046f35abe0c61967157e151126e4dd7ec5d1c004")) diff --git a/modules/lang/python/README.org b/modules/lang/python/README.org index 228ae963e..ebb303ac2 100644 --- a/modules/lang/python/README.org +++ b/modules/lang/python/README.org @@ -25,6 +25,8 @@ Adds Python support to Doom Emacs. + ~+lsp~ Language Server Protocol support + ~+pyenv~ Python virtual environment support via [[https://github.com/pyenv/pyenv][pyenv]] + ~+conda~ Python virtual environment support via [[https://conda.io/en/latest/][Conda]] ++ ~+poetry~ Python packaging, dependency management, and virtual environment + support via [[https://python-poetry.org/][Poetry]] + ~+cython~ Cython files support via [[https://github.com/cython/cython/blob/master/Tools/cython-mode.el][Cython-mode]] ** Plugins @@ -41,6 +43,8 @@ Adds Python support to Doom Emacs. + [[https://github.com/necaris/conda.el][conda]]* + ~+pyenv~ + [[https://github.com/pythonic-emacs/pyenv-mode][pyenv]]* ++ ~+poetry~ + + [[https://github.com/galaunay/poetry.el][poetry]]* + ~+lsp~ and ~:tools lsp~ + [[https://github.com/emacs-lsp/lsp-mode][lsp]] + [[https://github.com/emacs-lsp/lsp-python-ms][lsp-python-ms]]* @@ -67,6 +71,7 @@ This module has no direct prerequisites. Here are some of its soft dependencies. + Python virtual environments install instructions at: + [[https://github.com/pyenv/pyenv][pyenv]] + [[https://conda.io/en/latest/][Conda]] + + [[https://python-poetry.org/][Poetry]] + ~pipenv~ requires [[https://pipenv.readthedocs.io/en/latest/][pipenv]] diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 63a833029..8b3073e38 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -280,6 +280,11 @@ called.") 'append)) +(use-package! poetry + :when (featurep! +poetry) + :after python) + + (use-package! lsp-python-ms :when (featurep! +lsp) :after lsp-clients diff --git a/modules/lang/python/doctor.el b/modules/lang/python/doctor.el index e4979e5ea..588d3fb7a 100644 --- a/modules/lang/python/doctor.el +++ b/modules/lang/python/doctor.el @@ -20,6 +20,10 @@ (unless (executable-find "conda") (warn! "Couldn't find conda in your PATH"))) +(when (featurep! +poetry) + (if (not (executable-find "poetry")) + (warn! "Couldn't find poetry in your PATH"))) + (when (featurep! +cython) (unless (executable-find "cython") (warn! "Couldn't find cython. cython-mode will not work."))) diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index ee838e6fd..4788487d6 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -24,6 +24,8 @@ (package! pyenv-mode :pin "aec6f2aa28")) (when (featurep! +conda) (package! conda :pin "335474e409")) +(when (featurep! +poetry) + (package! poetry :pin "6dcc9d22ca")) ;; Testing frameworks (package! nose :pin "f852829751") diff --git a/modules/lang/racket/packages.el b/modules/lang/racket/packages.el index 341191184..2f2424156 100644 --- a/modules/lang/racket/packages.el +++ b/modules/lang/racket/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/racket/packages.el -(package! racket-mode :pin "202cc1b784") +(package! racket-mode :pin "8f3b214a5ea06e6a2a9492e7d20b19badd0c3bdf") diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0abd0522a..125891497 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -22,6 +22,7 @@ (add-hook 'ruby-mode-local-vars-hook #'lsp!)) (after! inf-ruby + (add-hook 'inf-ruby-mode-hook #'doom-mark-buffer-as-real-h) ;; switch to inf-ruby from compile if we detect a breakpoint has been hit (add-hook 'compilation-filter-hook #'inf-ruby-auto-enter)) @@ -173,6 +174,7 @@ (use-package! projectile-rails :when (featurep! +rails) :hook ((ruby-mode inf-ruby-mode projectile-rails-server-mode) . projectile-rails-mode) + :hook (projectile-rails-server-mode . doom-mark-buffer-as-real-h) :init (setq inf-ruby-console-environment "development") (when (featurep! :lang web) diff --git a/modules/lang/rust/packages.el b/modules/lang/rust/packages.el index 1c2945cc6..d533bb230 100644 --- a/modules/lang/rust/packages.el +++ b/modules/lang/rust/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/rust/packages.el -(package! rustic :pin "61032eacf0") +(package! rustic :pin "32a962ab2d3f87bde0e12c4e8975fe73d8ba8579") (unless (featurep! +lsp) - (package! racer :pin "a0bdf778f0")) + (package! racer :pin "a0bdf778f01e8c4b8a92591447257422ac0b455b")) diff --git a/modules/lang/scheme/autoload.el b/modules/lang/scheme/autoload.el index 91729cb0b..47338a66a 100644 --- a/modules/lang/scheme/autoload.el +++ b/modules/lang/scheme/autoload.el @@ -1,5 +1,54 @@ ;;; lang/scheme/autoload.el -*- lexical-binding: t; -*- +(defvar calculate-lisp-indent-last-sexp) + +;; Adapted from https://github.com/alezost/emacs-config/blob/master/utils/al-scheme.el#L76-L123 +;;;###autoload +(defun +scheme-scheme-indent-function-a (indent-point state) + "Advice to replace `scheme-indent-function'. + +This function is the same as `scheme-indent-function' except it indents property +lists properly and names starting with 'default'." + (let ((normal-indent (current-column))) + (goto-char (1+ (elt state 1))) + (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t) + (if (and (elt state 2) + ;; NOTE looking-at -> looking-at-p + (not (looking-at-p "\\sw\\|\\s_"))) + (progn + ;; NOTE (if (not ...) (progn ...)) -> (unless ... ...) + (unless (> (save-excursion (forward-line 1) (point)) + calculate-lisp-indent-last-sexp) + (goto-char calculate-lisp-indent-last-sexp) + (beginning-of-line) + (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)) + (backward-prefix-chars) + (current-column)) + (let* ((function (buffer-substring + (point) (progn (forward-sexp 1) (point)))) + ;; NOTE let -> let* & moved `method' def into let bindings + (method (or (get (intern-soft function) 'scheme-indent-function) + (get (intern-soft function) 'scheme-indent-hook)))) + (cond ((or (eq method 'defun) + (and (null method) + (> (length function) 3) + ;; NOTE string-match -> string-match-p + ;; NOTE The original regexp is "\\`def" but it will mess + ;; indentation with such names as 'default-...'. + (string-match-p "\\`def" function))) + (lisp-indent-defform state indent-point)) + ;; NOTE Added this clause to handle alignment of keyword symbols + ((and (null method) + (> (length function) 1) + ;; NOTE string-match -> string-match-p + (string-match-p "\\`:" function)) + (let ((lisp-body-indent 1)) + (lisp-indent-defform state indent-point))) + ((integerp method) + (lisp-indent-specform method state indent-point normal-indent)) + (method + (funcall method state indent-point normal-indent))))))) + ;;;###autoload (defun +scheme/open-repl (&optional arg) "Open the Scheme REPL." diff --git a/modules/lang/scheme/config.el b/modules/lang/scheme/config.el index 67e5bfd6a..995868f96 100644 --- a/modules/lang/scheme/config.el +++ b/modules/lang/scheme/config.el @@ -1,17 +1,20 @@ ;;; lang/scheme/config.el -*- lexical-binding: t; -*- -;;;###package scheme -(add-hook 'scheme-mode-hook #'rainbow-delimiters-mode) +(use-package! scheme + :hook (scheme-mode . rainbow-delimiters-mode) + :config (advice-add #'scheme-indent-function :override #'+scheme-scheme-indent-function-a)) (use-package! geiser - :defer t + :hook (scheme-mode . geiser-mode) :init - (setq geiser-active-implementations '(guile chicken mit chibi chez)) + (setq geiser-active-implementations '(guile chicken mit chibi chez) + geiser-mode-start-repl-p t + geiser-smart-tab-p t) (unless (featurep! :lang racket) (push 'racket geiser-active-implementations)) - (after! scheme ; built-in - (set-repl-handler! 'scheme-mode '+scheme/open-repl) + (after! scheme ; built-in + (set-repl-handler! 'scheme-mode #'+scheme/open-repl) (set-eval-handler! 'scheme-mode #'geiser-eval-region) (set-lookup-handlers! 'scheme-mode :definition #'geiser-edit-symbol-at-point @@ -22,24 +25,32 @@ ( "\\* [A-Za-z0-9_-]+ REPL \\*" :quit nil))) (map! :localleader :map scheme-mode-map - "'" #'geiser-mode-switch-to-repl - "s" #'geiser-set-scheme - + "'" #'geiser-mode-switch-to-repl + "\"" #'geiser-connect + "[" #'geiser-squarify + "\\" #'geiser-insert-lambda + "s" #'geiser-set-scheme (:prefix ("e" . "eval") "b" #'geiser-eval-buffer "B" #'geiser-eval-buffer-and-go - "e" #'geiser-eval-definition - "E" #'geiser-eval-definition-and-go + "e" #'geiser-eval-last-sexp + "d" #'geiser-eval-definition + "D" #'geiser-eval-definition-and-go "r" #'geiser-eval-region "R" #'geiser-eval-region-and-go) - (:prefix ("h" . "help") - "d" 'geiser-autodoc) - ;; TODO add more help keybindings - + "d" #'geiser-autodoc + "<" #'geiser-xref-callers + ">" #'geiser-xref-callees + "i" #'geiser-doc-look-up-manual) + (:prefix ("m" . "macro") + "r" #'geiser-expand-region + "d" #'geiser-expand-definition + "e" #'geiser-expand-last-sexp) (:prefix ("r" . "repl") "b" #'geiser-switch-to-repl "q" #'geiser-repl-exit + "l" #'geiser-load-current-buffer "r" #'geiser-restart-repl "R" #'geiser-reload "c" #'geiser-repl-clear-buffer))) diff --git a/modules/lang/sh/packages.el b/modules/lang/sh/packages.el index 152e813e5..02c841a71 100644 --- a/modules/lang/sh/packages.el +++ b/modules/lang/sh/packages.el @@ -2,7 +2,7 @@ ;;; lang/sh/packages.el (when (featurep! :completion company) - (package! company-shell :pin "52f3bf26b7")) + (package! company-shell :pin "52f3bf26b74adc30a275f5f4290a1fc72a6876ff")) (when (featurep! +fish) - (package! fish-mode :pin "db257db810")) + (package! fish-mode :pin "db257db81058b0b12f788c324c264cc59b9a5bf4")) diff --git a/modules/lang/solidity/packages.el b/modules/lang/solidity/packages.el index 2f7af778b..4e62183f6 100644 --- a/modules/lang/solidity/packages.el +++ b/modules/lang/solidity/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/solidity/packages.el -(package! solidity-mode :pin "b190993dcb") -(package! company-solidity :pin "b190993dcb") -(package! solidity-flycheck :pin "b190993dcb") +(package! solidity-mode :pin "022b3159832384a7dcdc2168809e698600826047") +(package! company-solidity) +(package! solidity-flycheck) diff --git a/modules/lang/swift/packages.el b/modules/lang/swift/packages.el index 4057cab08..186bbb800 100644 --- a/modules/lang/swift/packages.el +++ b/modules/lang/swift/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/swift/packages.el -(package! swift-mode :pin "1268425311") +(package! swift-mode :pin "2ab9ea1784a12a482ed9e3fb284b7a7658f40fff") (if (featurep! +lsp) - (package! lsp-sourcekit :pin "04d75b6a0b") + (package! lsp-sourcekit :pin "04d75b6a0be5894fea4a55fec0b2ccedf5b3be58") (when (featurep! :completion company) - (package! company-sourcekit :pin "abf9bc5a01")) + (package! company-sourcekit :pin "abf9bc5a0102eb666d3aa6d6bf22f6efcc852781")) (when (featurep! :checkers syntax) - (package! flycheck-swift :pin "4c5ad40125"))) + (package! flycheck-swift :pin "4c5ad401252400a78da395fd56a71e67ff8c2761"))) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 345521889..c3d73481c 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -12,7 +12,7 @@ :mode "\\.svelte\\'" :mode "\\.vue\\'" :mode "\\.twig\\'" - :mode "\\.jinja\\'" + :mode "\\.jinja2?\\'" :mode "wp-content/themes/.+/.+\\.php\\'" :mode "templates/.+\\.php\\'" ;; REVIEW We associate TSX files with `web-mode' because `typescript-mode' @@ -162,4 +162,6 @@ (when (featurep! +lsp) - (add-hook! '(html-mode-hook web-mode-hook) #'lsp!)) + (add-hook! '(html-mode-local-vars-hook + web-mode-local-vars-hook) + #'lsp!)) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index ac223e21b..bb6883894 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -2,23 +2,23 @@ ;;; lang/web/packages.el ;; +html.el -(package! emmet-mode :pin "1acb821e01") -(package! haml-mode :pin "bf5b6c11b1") -(package! pug-mode :pin "685fd3414d") -(package! slim-mode :pin "3636d18ab1") -(when (package! web-mode :pin "b0bb4ab82b") +(package! emmet-mode :pin "1acb821e0142136344ccf40c1e5fb664d7db2e70") +(package! haml-mode :pin "bf5b6c11b1206759d2b28af48765e04882dd1fc4") +(package! pug-mode :pin "685fd3414d89736bf232f5d1a6bed9e0353b98fe") +(package! slim-mode :pin "3636d18ab1c8b316eea71c4732eb44743e2ded87") +(when (package! web-mode :pin "6774c596a9b3988989d3bc96b6194e6f0df1d1b6") (when (featurep! :completion company) - (package! company-web :pin "f0cc9187c9"))) + (package! company-web :pin "f0cc9187c9c34f72ad71f5649a69c74f996bae9a"))) ;; +css.el (package! css-mode :built-in t) -(package! less-css-mode :built-in t :pin "c7fa3d56d8") +(package! less-css-mode :built-in t :pin "c7fa3d56d83206b28657f2e56439dc62280a2bf2") -(package! sass-mode :pin "247a0d4b50") -(package! stylus-mode :pin "4dbde92542") -(package! sws-mode :pin "4dbde92542") -(package! rainbow-mode :pin "3ef813d637") +(package! sass-mode :pin "247a0d4b509f10b28e4687cd8763492bca03599b") +(package! stylus-mode :pin "4dbde92542fc7ad61df38776980905a4721d642e") +(package! sws-mode :pin "4dbde92542fc7ad61df38776980905a4721d642e") +(package! rainbow-mode :pin "f780ddb18c2a73a666d093f606df92058e5601ea") (when (featurep! :completion ivy) - (package! counsel-css :pin "61a38c9d50")) + (package! counsel-css :pin "6427dfcbda0d2bbd81db03f9d6b56b06c260ac02")) (when (featurep! :completion helm) - (package! helm-css-scss :pin "48b996f73a")) + (package! helm-css-scss :pin "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3")) diff --git a/modules/lang/yaml/README.org b/modules/lang/yaml/README.org new file mode 100644 index 000000000..f036f5a24 --- /dev/null +++ b/modules/lang/yaml/README.org @@ -0,0 +1,38 @@ +#+TITLE: lang/yaml +#+DATE: April 23, 2020 +#+SINCE: v3.0.0 +#+STARTUP: inlineimages nofold + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#maintainers][Maintainers]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] +- [[#prerequisites][Prerequisites]] +- [[#features][Features]] +- [[#configuration][Configuration]] +- [[#troubleshooting][Troubleshooting]] + +* Description +This module provides support for the [[https://yaml.org/][YAML file format]]. + +** Maintainers +This module has no dedicated maintainers. + +** Module Flags ++ =+lsp= Enables integration with LSP servers. Requires the =:tools lsp= module to be enabled. + +** Plugins ++ [[https://github.com/yoshiki/yaml-mode][yaml-mode]] + +* Prerequisites +This module has no prereqisites. + +* TODO Features +# An in-depth list of features, how to use them, and their dependencies. + +* TODO Configuration +# How to configure this module, including common problems and how to address them. + +* TODO Troubleshooting +# Common issues and their solution, or places to look for help. diff --git a/modules/lang/yaml/config.el b/modules/lang/yaml/config.el new file mode 100644 index 000000000..f9f081b57 --- /dev/null +++ b/modules/lang/yaml/config.el @@ -0,0 +1,9 @@ +;;; lang/yaml/config.el -*- lexical-binding: t; -*- + +(use-package! yaml-mode + :mode "Procfile\\'" + :init + (when (featurep! +lsp) + (add-hook 'yaml-mode-local-vars-hook #'lsp!)) + :config + (setq-hook! 'yaml-mode-hook tab-width yaml-indent-offset)) diff --git a/modules/lang/yaml/packages.el b/modules/lang/yaml/packages.el new file mode 100644 index 000000000..6e0f161f3 --- /dev/null +++ b/modules/lang/yaml/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/yaml/packages.el + +(package! yaml-mode :pin "cecf4b106b") diff --git a/modules/term/eshell/autoload/evil.el b/modules/term/eshell/autoload/evil.el index a3326e322..04e45d377 100644 --- a/modules/term/eshell/autoload/evil.el +++ b/modules/term/eshell/autoload/evil.el @@ -6,7 +6,7 @@ "TODO" (interactive "") (let ((buffer (+eshell-last-buffer)) - (command (+evil-resolve-vim-path-a command))) + (command (+evil-replace-filename-modifiers-a command))) (cond (buffer (select-window (get-buffer-window buffer)) (+eshell-run-command command buffer)) diff --git a/modules/term/eshell/config.el b/modules/term/eshell/config.el index 412d69bdc..217fa6ff4 100644 --- a/modules/term/eshell/config.el +++ b/modules/term/eshell/config.el @@ -48,7 +48,7 @@ You should use `set-eshell-alias!' to change this.") ;; -;; Packages +;;; Packages (after! eshell ; built-in (setq eshell-banner-message diff --git a/modules/term/eshell/packages.el b/modules/term/eshell/packages.el index 82a18ed14..3744666cb 100644 --- a/modules/term/eshell/packages.el +++ b/modules/term/eshell/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; term/eshell/packages.el -(package! eshell-up :pin "9c100bae5c") -(package! eshell-z :pin "337cb241e1") -(package! shrink-path :pin "c14882c859") -(package! esh-help :pin "417673ed18") +(package! eshell-up :pin "9c100bae5c3020e8d9307e4332d3b64e7dc28519") +(package! eshell-z :pin "337cb241e17bd472bd3677ff166a0800f684213c") +(package! shrink-path :pin "c14882c8599aec79a6e8ef2d06454254bb3e1e41") +(package! esh-help :pin "417673ed18a983930a66a6692dbfb288a995cb80") (when (featurep! :completion company) - (package! fish-completion :pin "1038488181") - (package! bash-completion :pin "96ce14af96")) + (package! fish-completion :pin "10384881817b5ae38cf6197a077a663420090d2c") + (package! bash-completion :pin "96ce14af9674f3e605bacca87abc0c23b8f13cd5")) diff --git a/modules/term/term/packages.el b/modules/term/term/packages.el index f98aec986..b55cfc41c 100644 --- a/modules/term/term/packages.el +++ b/modules/term/term/packages.el @@ -2,4 +2,4 @@ ;;; term/term/packages.el (package! term :built-in t) -(package! multi-term :pin "7307ddd456") +(package! multi-term :pin "7307ddd456db44045206253e5a905d3d8c143d5c") diff --git a/modules/term/vterm/README.org b/modules/term/vterm/README.org index 2eab1af61..019fc5882 100644 --- a/modules/term/vterm/README.org +++ b/modules/term/vterm/README.org @@ -88,6 +88,13 @@ There are several ways to manually install the module: 1. You can use =M-x vterm-module-compile= to let emacs automatically compile and install the module. + Modify ~vterm-module-cmake-args~ to pass arguments to the cmake build script. + e.g. To use a local build of libvterm instead of the included one. + + #+BEGIN_SRC elisp + (setq vterm-module-cmake-args "-DUSE_SYSTEM_LIBVTERM=yes") + #+END_SRC + *WARNING*: Emacs will hang during the compilation. It may take a while. 2. You can compile and install the module yourself. Go to the vterm installation diff --git a/modules/term/vterm/config.el b/modules/term/vterm/config.el index 18938206c..e21b7a60a 100644 --- a/modules/term/vterm/config.el +++ b/modules/term/vterm/config.el @@ -2,25 +2,26 @@ (use-package! vterm :when (bound-and-true-p module-file-suffix) - :commands (vterm vterm-mode) - :preface (setq vterm-install t) + :commands vterm vterm-mode + :preface (setq vterm-install t) ; compile the package when you load vterm + :hook (vterm-mode . doom-mark-buffer-as-real-h) + :hook (vterm-mode . hide-mode-line-mode) ; modeline serves no purpose in vterm :config (set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0) + ;; Once vterm is dead, the vterm buffer is useless. Why keep it around? We can + ;; spawn another if want one. + (setq vterm-kill-buffer-on-exit t) + (setq-hook! 'vterm-mode-hook - ;; Don't prompt about processes when killing vterm + ;; Don't prompt about dying processes when killing vterm confirm-kill-processes nil ;; Prevent premature horizontal scrolling hscroll-margin 0) - (setq vterm-kill-buffer-on-exit t) - + ;; Restore the point's location when leaving and re-entering insert mode. (when (featurep! :editor evil) (add-hook! 'vterm-mode-hook (defun +vterm-init-remember-point-h () (add-hook 'evil-insert-state-exit-hook #'+vterm-remember-insert-point-h nil t) - (add-hook 'evil-insert-state-entry-hook #'+vterm-goto-insert-point-h nil t)))) - - (add-hook 'vterm-mode-hook #'doom-mark-buffer-as-real-h) - ;; Modeline serves no purpose in vterm - (add-hook 'vterm-mode-hook #'hide-mode-line-mode)) + (add-hook 'evil-insert-state-entry-hook #'+vterm-goto-insert-point-h nil t))))) diff --git a/modules/term/vterm/packages.el b/modules/term/vterm/packages.el index de92a1673..e048a3b01 100644 --- a/modules/term/vterm/packages.el +++ b/modules/term/vterm/packages.el @@ -3,4 +3,4 @@ (package! vterm :built-in 'prefer - :pin "aa512b8351") + :pin "e63bd65eece7c5de3a534b7e2fdbe58256ec2da0") diff --git a/modules/tools/ansible/packages.el b/modules/tools/ansible/packages.el index 6ec7c4341..3378a9076 100644 --- a/modules/tools/ansible/packages.el +++ b/modules/tools/ansible/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/ansible/packages.el -(package! ansible :recipe (:nonrecursive t) :pin "c6532e5216") -(package! ansible-doc :pin "86083a7bb2") -(package! jinja2-mode :pin "cfaa7bbe7b") -(package! yaml-mode :pin "cecf4b106b") +(package! ansible :recipe (:nonrecursive t) :pin "c6532e52161a381ed3dddfeaa7c92ae636d3f052") +(package! ansible-doc :pin "86083a7bb2ed0468ca64e52076b06441a2f8e9e0") +(package! jinja2-mode :pin "cfaa7bbe7bb290cc500440124ce89686f3e26f86") +(package! yaml-mode :pin "cecf4b106b0c4236931b14919fdf87ff3546e2c9") (when (featurep! :completion company) - (package! company-ansible :pin "79dd421b16")) + (package! company-ansible :pin "79dd421b161efa49fbdffad57fa40edb41f484a3")) diff --git a/modules/tools/debugger/packages.el b/modules/tools/debugger/packages.el index 9321e25fb..c94117531 100644 --- a/modules/tools/debugger/packages.el +++ b/modules/tools/debugger/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/debugger/packages.el -(when (package! realgud :pin "b854e040e0") +(when (package! realgud :pin "e03446f54c7ee0b4ed3ec7300597046cf1de2bb8") (when (featurep! :lang javascript) - (package! realgud-trepan-ni :pin "6e9cac5e80"))) + (package! realgud-trepan-ni :pin "6e9cac5e8097018aadf41c88de541168036cc227"))) (when (featurep! +lsp) - (package! dap-mode :pin "0b9c8f28ad") - (package! posframe :pin "e62e584268")) + (package! dap-mode :pin "04d7e967f21a0ab1e2223e528baf55fe5b663882") + (package! posframe :pin "093b29a53cbeda6d637ccc9ef4dfc47123e79b9e")) diff --git a/modules/tools/direnv/packages.el b/modules/tools/direnv/packages.el index ff4716f38..1424dc52c 100644 --- a/modules/tools/direnv/packages.el +++ b/modules/tools/direnv/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/direnv/packages.el -(package! direnv :pin "1daf479b9b") +(package! direnv :pin "1daf479b9b7600ce9681f2a980deae7fcb2f3d59") diff --git a/modules/tools/docker/packages.el b/modules/tools/docker/packages.el index a40c377f1..f7bab25dd 100644 --- a/modules/tools/docker/packages.el +++ b/modules/tools/docker/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/docker/packages.el -(package! docker :pin "a2092b3b17") -(package! docker-tramp :pin "8e2b671eff") -(package! dockerfile-mode :pin "d31f7685eb") +(package! docker :pin "08745207332d940130a2357eb5c5e00fd88bd6af") +(package! docker-tramp :pin "8e2b671eff7a81af43b76d9dfcf94ddaa8333a23") +(package! dockerfile-mode :pin "d31f7685ebc5832d957e25070a930aa42984327d") diff --git a/modules/tools/editorconfig/packages.el b/modules/tools/editorconfig/packages.el index a1d8ad9ff..0d35f6195 100644 --- a/modules/tools/editorconfig/packages.el +++ b/modules/tools/editorconfig/packages.el @@ -3,4 +3,4 @@ (package! editorconfig :recipe (:nonrecursive t) - :pin "19de0ec1ba") + :pin "19de0ec1bac67c5a76a4dd3d8ffe6c5411ace1af") diff --git a/modules/tools/ein/packages.el b/modules/tools/ein/packages.el index 0e53a4f1d..a9a9325b4 100644 --- a/modules/tools/ein/packages.el +++ b/modules/tools/ein/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/ein/packages.el -(package! ein :pin "1322d8c7f8") +(package! ein :pin "42134adf3c95b7768e2d725bab39ddb98feafa09") diff --git a/modules/tools/eval/packages.el b/modules/tools/eval/packages.el index aed6e4482..dfdbc665b 100644 --- a/modules/tools/eval/packages.el +++ b/modules/tools/eval/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/eval/packages.el -(package! quickrun :pin "50e07e7698") +(package! quickrun :pin "2e37ce9e4b13359344dbd67fbfd7e39d46b2c6b6") (when (featurep! +overlay) - (package! eros :pin "dd89102792")) + (package! eros :pin "dd8910279226259e100dab798b073a52f9b4233a")) diff --git a/modules/tools/gist/packages.el b/modules/tools/gist/packages.el index 44680cb30..f8a971d9f 100644 --- a/modules/tools/gist/packages.el +++ b/modules/tools/gist/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/gist/packages.el -(package! gist :pin "314fe6ab80") +(package! gist :pin "314fe6ab80fae35b95f0734eceb82f72813b6f41") diff --git a/modules/tools/lookup/README.org b/modules/tools/lookup/README.org index b69d6b25e..5c51aeb78 100644 --- a/modules/tools/lookup/README.org +++ b/modules/tools/lookup/README.org @@ -25,13 +25,14 @@ - [[#commands][Commands]] * Description -Integrates with code navigation and documentation tools to help you quickly look -up definitions, references and documentation. +This module adds code navigation and documentation lookup tools to help you +quickly look up definitions, references, documentation, dictionary definitions +or synonyms. + Jump-to-definition and find-references implementations that just work. + Powerful xref integration for languages that support it. -+ Documentation lookup for a variety of online sources (like devdocs.io, - stackoverflow or youtube). ++ Search online providers like devdocs.io, stackoverflow, google, duckduckgo or + youtube (duckduckgo and google have live suggestions). + Integration with Dash.app docsets. + Support for online (and offline) dictionaries and thesauruses. @@ -43,14 +44,27 @@ up definitions, references and documentation. ** Plugins + [[https://github.com/jacktasia/dumb-jump][dumb-jump]] + [[https://github.com/alexmurray/ivy-xref][ivy-xref]] or [[https://github.com/brotzeit/helm-xref][helm-xref]] -+ [[https://github.com/nathankot/counsel-dash][counsel-dash]] or [[https://github.com/areina/helm-dash][helm-dash]] ++ [[https://github.com/tkf/emacs-request][request]] ++ =+docsets= + + [[https://github.com/dash-docs-el/dash-docs][dash-docs]] + + [[https://github.com/nathankot/counsel-dash][counsel-dash]] or [[https://github.com/areina/helm-dash][helm-dash]] ++ =+dictionary= + + if macOS + + [[https://github.com/xuchunyang/osx-dictionary.el][osx-dictionary]]* (on macOS) + + else + + [[https://github.com/abo-abo/define-word][define-word]] + + [[https://github.com/maxchaos/emacs-powerthesaurus][powerthesaurus]] + + =+offline= + + [[https://github.com/gromnitsky/wordnut][wordnut]] + + [[https://github.com/hpdeifel/synosaurus][synosaurus]] * Prerequisites This module has several soft dependencies: + ~ripgrep~ as a last-resort fallback for jump-to-definition/find-references. -+ ~sqlite3~ for Dash docset support. -+ ~wordnet~ for offline dictionary and thesaurus support. ++ ~sqlite3~ for Dash docset support (if you have =+docsets= enabled) ++ ~wordnet~ for offline dictionary and thesaurus support (if you have + =+dictionary +offline= enabled). ** MacOS #+BEGIN_SRC sh diff --git a/modules/tools/lookup/config.el b/modules/tools/lookup/config.el index 35179e360..6381956a2 100644 --- a/modules/tools/lookup/config.el +++ b/modules/tools/lookup/config.el @@ -104,6 +104,7 @@ Dictionary.app behind the scenes to get definitions.") :commands dumb-jump-result-follow :config (setq dumb-jump-default-project doom-emacs-dir + dumb-jump-prefer-searcher 'rg dumb-jump-aggressive nil dumb-jump-selector (cond ((featurep! :completion ivy) 'ivy) @@ -136,12 +137,17 @@ Dictionary.app behind the scenes to get definitions.") (use-package! ivy-xref :when (featurep! :completion ivy) :config - (setq xref-show-xrefs-function #'ivy-xref-show-xrefs) - (set-popup-rule! "^\\*xref\\*$" :ignore t)) + (set-popup-rule! "^\\*xref\\*$" :ignore t) + ;; xref initialization is different in Emacs 27 - there are two different + ;; variables which can be set rather than just one + (when EMACS27+ + (setq xref-show-definitions-function #'ivy-xref-show-defs)) + ;; Necessary in Emacs <27. In Emacs 27 it will affect all xref-based + ;; commands other than xref-find-definitions too (eg project-find-regexp) + (setq xref-show-xrefs-function #'ivy-xref-show-xrefs)) (use-package! helm-xref - :when (featurep! :completion helm) - :config (setq xref-show-xrefs-function (if EMACS27+ #'helm-xref-show-xrefs-27 #'helm-xref-show-xrefs)))) + :when (featurep! :completion helm))) ;; @@ -172,11 +178,10 @@ See https://github.com/magit/ghub/issues/81" (let ((gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")) (funcall orig-fn url))) - (use-package! helm-dash - :when (featurep! :completion helm)) - - (use-package! counsel-dash - :when (featurep! :completion ivy))) + (cond ((featurep! :completion helm) + (require 'helm-dash nil t)) + ((featurep! :completion ivy) + (require 'counsel-dash nil t)))) ;; diff --git a/modules/tools/lookup/packages.el b/modules/tools/lookup/packages.el index f5f4d7d62..e42c7449d 100644 --- a/modules/tools/lookup/packages.el +++ b/modules/tools/lookup/packages.el @@ -8,27 +8,32 @@ (package! helm)) ;; -(package! dumb-jump :pin "73b2b48fda") +(package! dumb-jump :pin "d760aa880fc1052570ab0fd7e586eeffb7636af6") (when (featurep! :completion ivy) - (package! ivy-xref :pin "3d4c35fe2b")) + (package! ivy-xref :pin "3d4c35fe2b243d948d8fe02a1f0d76a249d63de9")) (when (featurep! :completion helm) - (package! helm-xref :pin "6b4a8bd91f")) + (package! helm-xref :pin "6b4a8bd91f5eaf82f51bd31b03f6587387fe6983")) ;; For dictionary and online lookup -(package! request :pin "216d570a58") +(package! request :pin "216d570a58d05ef1307edb63d2539bafa5f688c6") (when (featurep! +docsets) - (package! dash-docs :pin "111fd9b970") + (package! dash-docs :pin "111fd9b97001f1ad887b45e5308a14ddd68ce70a") (when (featurep! :completion helm) - (package! helm-dash :pin "7f853bd34d")) + (package! helm-dash :pin "7f853bd34da666f0e9a883011c80f451b06f6c59")) (when (featurep! :completion ivy) - (package! counsel-dash :pin "370d5f6f14"))) + (package! counsel-dash :pin "370d5f6f14b5294d0eb717f7b2a6a8e93df1ed24"))) (when (featurep! +dictionary) (if IS-MAC - (package! osx-dictionary :pin "1b79ff64c7") - (package! define-word :pin "d8c76d503b") - (package! powerthesaurus :pin "81a262ec0c") + (package! osx-dictionary :pin "1b79ff64c72485cb078db9ab7ee3256b11a99f4b") + (package! define-word :pin "08c71b1ff4fd07bf0c78d1fcf77efeaafc8f7443") + ;; HACK Fix #2945: the main package is broken (see + ;; SavchenkoValeriy/emacs-powerthesaurus). We use this fork until it is + ;; merged. + (package! powerthesaurus + :recipe (:host github :repo "maxchaos/emacs-powerthesaurus" :branch "pt-api-change") + :pin "4a834782a394f2dc70fc02d68b6962b44d87f0cf") (when (featurep! +offline) - (package! wordnut :pin "feac531404") - (package! synosaurus :pin "14d34fc92a")))) + (package! wordnut :pin "feac531404041855312c1a046bde7ea18c674915") + (package! synosaurus :pin "14d34fc92a77c3a916b4d58400424c44ae99cd81")))) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index fcc3e1e37..b7d7f5a1e 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -1,21 +1,5 @@ ;;; tools/lsp/config.el -*- lexical-binding: t; -*- -(defvar +lsp-company-backend 'company-lsp - "What backend to use for lsp-driven autocompletion. - -This can be overridden by `+lsp-capf-blacklist'. - -While `company-capf' does not require the `company-lsp' package and should offer -better performance, it has been integrated into lsp only recently and as of -02/25/2020 is known to cause issues with some language servers. If you wish to -use `company-capf' in general but fall back to `company-lsp' for specific -language servers, set `+lsp-company-backend' to `company-capf' and add the -excluded servers' identifiers to `+lsp-capf-blacklist'.") - -(defvar +lsp-capf-blacklist '(ts-ls gopls) - "Language servers listed here will always use the `company-lsp' backend, -irrespective of what `+lsp-company-backend' is set to.") - (defvar +lsp-defer-shutdown 3 "If non-nil, defer shutdown of LSP servers for this many seconds after last workspace buffer is closed. @@ -40,7 +24,6 @@ working on that project after closing the last buffer.") (setq lsp-flycheck-live-reporting nil) ;; For `lsp-clients' (setq lsp-server-install-dir (concat doom-etc-dir "lsp/") - lsp-groovy-server-install-dir (concat lsp-server-install-dir "lsp-groovy/") lsp-intelephense-storage-path (concat doom-cache-dir "lsp-intelephense/")) ;; Let doom bind the LSP keymap. (setq lsp-keymap-prefix nil) @@ -60,7 +43,9 @@ working on that project after closing the last buffer.") lsp-enable-semantic-highlighting nil ;; Don't modify our code without our permission lsp-enable-indentation nil - lsp-enable-on-type-formatting nil) + lsp-enable-on-type-formatting nil + ;; capf is the preferred completion mechanism for lsp-mode now + lsp-prefer-capf t) :config (set-popup-rule! "^\\*lsp-help" :size 0.35 :quit t :select t) @@ -124,26 +109,11 @@ This also logs the resolved project root, if found, so we know where we are." (defun +lsp-init-company-h () (if (not (bound-and-true-p company-mode)) (add-hook 'company-mode-hook #'+lsp-init-company-h t t) - (let ((preferred-backend +lsp-company-backend)) - (lsp-foreach-workspace - (when (memq (lsp--client-server-id (lsp--workspace-client lsp--cur-workspace)) - +lsp-capf-blacklist) - (setq preferred-backend 'company-lsp))) - (if (eq 'company-capf preferred-backend) - ;; use capf backend - (progn - (setq-local lsp-enable-completion-at-point t) - (setq-local lsp-prefer-capf t) - (setq-local company-backends - (cons 'company-capf (remq 'company-capf company-backends)))) - ;; use company-lsp backend (may need to be loaded first) - (require 'company-lsp) - (setq-local lsp-enable-completion-at-point nil) - (setq-local lsp-prefer-capf nil) - (setq-local company-backends - (cons 'company-lsp (remq 'company-capf company-backends))) - (setq-default company-lsp-cache-candidates 'auto)) - (remove-hook 'company-mode-hook #'+lsp-init-company-h t)))) + ;; Ensure `company-capf' is at the front of `company-backends' + (setq-local company-backends + (cons 'company-capf + (remq 'company-capf company-backends))) + (remove-hook 'company-mode-hook #'+lsp-init-company-h t))) (defun +lsp-init-flycheck-or-flymake-h () "Set up flycheck-mode or flymake-mode, depending on `lsp-diagnostic-package'." (pcase lsp-diagnostic-package diff --git a/modules/tools/lsp/packages.el b/modules/tools/lsp/packages.el index 70e65dead..095d2c798 100644 --- a/modules/tools/lsp/packages.el +++ b/modules/tools/lsp/packages.el @@ -1,11 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/lsp/packages.el -(package! lsp-mode :pin "e8e52fd4b1") -(package! lsp-ui :pin "242dfe859c") -(when (featurep! :completion company) - (package! company-lsp :pin "f921ffa0cd")) +(package! lsp-mode :pin "941e6062a5b407675e13ba471e9878f4a2dbd10e") +(package! lsp-ui :pin "43f71e3837b07f377444ad631b12f8198c495aa7") (when (featurep! :completion ivy) - (package! lsp-ivy :pin "a6b7841e08")) + (package! lsp-ivy :pin "81e81ced99829358674c5a6bbe2c3e15cecd4ed8")) (when (featurep! :completion helm) - (package! helm-lsp :pin "46a72f5af1")) + (package! helm-lsp :pin "6b5ce182d7c94c62b55b8f7d0c7e643b2c30e560")) diff --git a/modules/tools/magit/README.org b/modules/tools/magit/README.org new file mode 100644 index 000000000..2be927280 --- /dev/null +++ b/modules/tools/magit/README.org @@ -0,0 +1,60 @@ +#+TITLE: tools/magit +#+DATE: March 14, 2018 +#+SINCE: v2.0.0 +#+STARTUP: inlineimages nofold + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#maintainers][Maintainers]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] + - [[#hacks][Hacks]] +- [[#prerequisites][Prerequisites]] +- [[#features][Features]] +- [[#configuration][Configuration]] +- [[#troubleshooting][Troubleshooting]] + +* Description +This module provides Magit, an interface to the Git version control system. + +If you are new to Magit, see the [[https://github.com/magit/magit#getting-started][Getting Started]] section of its project readme. + +** Maintainers +This module has no dedicated maintainers. + +** Module Flags ++ =+forge= Enable Forge; a porcelain for managing issues and PRs from within + Emacs. Will take a while on first run to build emacsql-sqlite. + +** Plugins ++ [[https://github.com/magit/magit][magit]] ++ [[https://github.com/magit/forge][forge]]* (=+forge=) ++ [[https://github.com/jtatarik/magit-gitflow][magit-gitflow]] ++ [[https://github.com/alphapapa/magit-todos][magit-todos]] ++ [[https://github.com/charignon/github-review][github-review]] ++ [[https://github.com/emacs-evil/evil-magit][evil-magit]]* (=:editor evil +everywhere=) + +** Hacks ++ =forge= was modified to defer compilation of emacsql-sqlite until you try to + use forge, rather than when magit first loads (which could be as soon as + startup). ++ =magit= has been modified to recognize + =$XDG_CACHE_HOME/git/credential/socket=. ++ =magit= has been modified to invalidate the projectile cache when you check + out a new branch or commit. ++ =magit= has been modified to revert repo buffers (e.g. after changing + branches) when you later switch to them, rather than all at once. + +* Prerequisites +This module requires ~git~. + +Forge will require [[https://magit.vc/manual/forge/Token-Creation.html#Token-Creation][a Github API token]] the first time you run =forge-pull=. + +* TODO Features +# An in-depth list of features, how to use them, and their dependencies. + +* TODO Configuration +# How to configure this module, including common problems and how to address them. + +* TODO Troubleshooting +# Common issues and their solution, or places to look for help. diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 9bb3d8767..ce2c785f2 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -1,8 +1,5 @@ ;;; tools/magit/config.el -*- lexical-binding: t; -*- -;; -;;; Packages - (use-package! magit :commands magit-file-delete :defer-incrementally (dash f s with-editor git-commit package eieio lv transient) @@ -92,11 +89,12 @@ (use-package! forge + :when (featurep! +forge) ;; We defer loading even further because forge's dependencies will try to ;; compile emacsql, which is a slow and blocking operation. :after-call magit-status :commands forge-create-pullreq forge-create-issue - :init + :preface (setq forge-database-file (concat doom-etc-dir "forge/forge-database.sqlite")) :config ;; All forge list modes are derived from `forge-topic-list-mode' @@ -123,8 +121,8 @@ ensure it is built when we actually use Forge." (message (concat "Failed to build emacsql; forge may not work correctly.\n" "See *Compile-Log* buffer for details")) ;; HACK Due to changes upstream, forge doesn't initialize completely if - ;; it doesn't find `emacsql-sqlite-executable', so we have to do it - ;; manually after installing it. + ;; it doesn't find `emacsql-sqlite-executable', so we have to do it + ;; manually after installing it. (setq forge--sqlite-available-p t) (magit-add-section-hook 'magit-status-sections-hook 'forge-insert-pullreqs nil t) (magit-add-section-hook 'magit-status-sections-hook 'forge-insert-issues nil t) @@ -164,7 +162,7 @@ ensure it is built when we actually use Forge." (setq evil-magit-state 'normal evil-magit-use-z-for-folds t) :config - (unmap! magit-mode-map + (undefine-key! magit-mode-map ;; Replaced by z1, z2, z3, etc "M-1" "M-2" "M-3" "M-4" "1" "2" "3" "4" diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index de80bc93d..f1bd7253d 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -1,10 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/magit/packages.el -(when (package! magit :pin "0f1234e785") - (package! forge :pin "2e2d26cf42") - (package! magit-gitflow :pin "cc41b561ec") - (package! magit-todos :pin "a0e5d1f3c7") - (package! github-review :pin "50c6bcc7cf") +(when (package! magit :pin "d27d6e467857ed4a78c7cf7d609561df789e2a6c") + (when (featurep! +forge) + (package! forge :pin "e2da80660a0550f613400ce3b238025589800417")) + (package! magit-gitflow :pin "cc41b561ec6eea947fe9a176349fb4f771ed865b") + (package! magit-todos :pin "a0e5d1f3c7dfcb4f18c1b0d57f1746a4872df5c6") + (package! github-review :pin "50c6bcc7cf4d7193577b3f74eea4dd72f2b7795b") (when (featurep! :editor evil +everywhere) - (package! evil-magit :pin "253c644807"))) + (package! evil-magit :pin "253c644807013fe92429acdef418748794b8f254"))) diff --git a/modules/tools/make/packages.el b/modules/tools/make/packages.el index d389186b5..815c945d3 100644 --- a/modules/tools/make/packages.el +++ b/modules/tools/make/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/make/packages.el -(package! makefile-executor :pin "9a7d78f814") +(package! makefile-executor :pin "9a7d78f814a4b372d8f8179819cb1b37b83b1973") diff --git a/modules/tools/pass/packages.el b/modules/tools/pass/packages.el index f998eb0e1..6f9dea011 100644 --- a/modules/tools/pass/packages.el +++ b/modules/tools/pass/packages.el @@ -1,17 +1,17 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/pass/packages.el -(package! pass :pin "919d8e3826") -(package! password-store :pin "88936b11af") -(package! password-store-otp :pin "04998c8578") +(package! pass :pin "919d8e3826d556433ab67d4ee21a509d209d1baa") +(package! password-store :pin "07b169ec32ad6961ed8625a0b932a663abcb01d2") +(package! password-store-otp :pin "04998c8578a060ab4a4e8f46f2ee0aafad4ab4d5") ;; an older version of `auto-source-pass' is built into Emacs 26+, so we must ;; install the new version directly from the source and with a psuedonym. (package! auth-source-pass :recipe (:host github :repo "DamienCassou/auth-password-store") - :pin "ff4940c647") + :pin "ff4940c647786914b3cbef69103d96a4ea334111") (when (featurep! :completion ivy) - (package! ivy-pass :pin "5b523de115")) + (package! ivy-pass :pin "5b523de1151f2109fdd6a8114d0af12eef83d3c5")) (when (featurep! :completion helm) - (package! helm-pass :pin "ed5798f2d8")) + (package! helm-pass :pin "ed5798f2d83937575e8f23fde33323bca9e85131")) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index a5047ec41..b1c74e782 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -1,6 +1,6 @@ ;;; tools/pdf/config.el -*- lexical-binding: t; -*- -(use-package! pdf-tools +(use-package! pdf-view :mode ("\\.[pP][dD][fF]\\'" . pdf-view-mode) :magic ("%PDF" . pdf-view-mode) :init @@ -20,9 +20,10 @@ :config (map! :map pdf-view-mode-map :gn "q" #'kill-current-buffer) - (setq-default pdf-view-display-size 'fit-page - pdf-view-use-scaling t - pdf-view-use-imagemagick nil) + (setq-default pdf-view-display-size 'fit-page) + ;; Enable hiDPI support, but at the cost of memory! See politza/pdf-tools#51 + (setq pdf-view-use-scaling t + pdf-view-use-imagemagick nil) ;; Add retina support for MacOS users (when IS-MAC @@ -32,12 +33,10 @@ :around '(pdf-annot-show-annotation pdf-isearch-hl-matches pdf-view-display-region) - (cl-letf* ((old-create-image (symbol-function #'create-image)) - ((symbol-function #'create-image) - (lambda (file-or-data &optional type data-p &rest props) - (apply old-create-image file-or-data type data-p - :width (car (pdf-view-image-size)) - props)))) + (letf! (defun create-image (file-or-data &optional type data-p &rest props) + (apply create-image file-or-data type data-p + :width (car (pdf-view-image-size)) + props)) (apply orig-fn args)))) ;; Handle PDF-tools related popups better @@ -52,6 +51,7 @@ (setq-hook! 'pdf-view-mode-hook evil-normal-state-cursor (list nil)) ;; Install epdfinfo binary if needed, blocking until it is finished + (require 'pdf-tools) (unless (file-executable-p pdf-info-epdfinfo-program) (let ((wconf (current-window-configuration))) (pdf-tools-install) diff --git a/modules/tools/pdf/packages.el b/modules/tools/pdf/packages.el index 06ef963d3..046c2ea84 100644 --- a/modules/tools/pdf/packages.el +++ b/modules/tools/pdf/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/pdf/packages.el -(package! pdf-tools :pin "0159cb1ab3") +(package! pdf-tools :pin "d9712989fc4715443f674459199bdffa987054ac") diff --git a/modules/tools/prodigy/packages.el b/modules/tools/prodigy/packages.el index edb10f54c..57dc56a4f 100644 --- a/modules/tools/prodigy/packages.el +++ b/modules/tools/prodigy/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/prodigy/packages.el -(package! prodigy :pin "6ae71f27b0") +(package! prodigy :pin "6ae71f27b09b172f03fb55b9eeef001206baacd3") diff --git a/modules/tools/rgb/packages.el b/modules/tools/rgb/packages.el index 22b018737..d916da671 100644 --- a/modules/tools/rgb/packages.el +++ b/modules/tools/rgb/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/rgb/packages.el -(package! rainbow-mode :pin "3ef813d637") -(package! kurecolor :pin "3fc84840cb") +(package! rainbow-mode :pin "f780ddb18c2a73a666d093f606df92058e5601ea") +(package! kurecolor :pin "3fc84840cbbd75e646cafa2fd3a00004b55e37ec") diff --git a/modules/tools/terraform/packages.el b/modules/tools/terraform/packages.el index 25156c92e..a7452abef 100644 --- a/modules/tools/terraform/packages.el +++ b/modules/tools/terraform/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/terraform/packages.el -(package! terraform-mode :pin "2967e7bdc0") +(package! terraform-mode :pin "2967e7bdc05d15617e121052f6e43c61439b9070") (when (featurep! :completion company) - (package! company-terraform :pin "2d11a21fee")) + (package! company-terraform :pin "2d11a21fee2f298e48968e479ddcaeda4d736e12")) diff --git a/modules/tools/tmux/autoload/tmux.el b/modules/tools/tmux/autoload/tmux.el index 63f51156e..46e066318 100644 --- a/modules/tools/tmux/autoload/tmux.el +++ b/modules/tools/tmux/autoload/tmux.el @@ -104,7 +104,7 @@ but do not execute them." (if-let* ((lines (+tmux (format "list-windows %s -F '#{window_id};#{session_id};#{window_active};#{window_name};#{window_activity_flag}'" (if session - (concat "-t " (car session)) + (concat "-t " (shell-quote-argument (car session))) "-a"))))) (cl-loop for line in (split-string lines "\n" t) collect (let ((window (split-string line ";"))) @@ -122,7 +122,7 @@ but do not execute them." (if sess-or-win (concat (if (string-prefix-p "$" (car sess-or-win)) "-s ") "-t " - (car sess-or-win)) + (shell-quote-argument (car sess-or-win))) "-a"))))) (cl-loop for line in (split-string lines "\n" t) collect (let ((pane (split-string line ";"))) diff --git a/modules/tools/upload/packages.el b/modules/tools/upload/packages.el index 4925d1306..d26bd9346 100644 --- a/modules/tools/upload/packages.el +++ b/modules/tools/upload/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/upload/packages.el -(package! ssh-deploy :pin "1bb2f821d4") +(package! ssh-deploy :pin "1bb2f821d4a78d483c147759348a29531486cdc4") diff --git a/modules/ui/deft/packages.el b/modules/ui/deft/packages.el index 18bf7ee99..aa7be392e 100644 --- a/modules/ui/deft/packages.el +++ b/modules/ui/deft/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/deft/packages.el -(package! deft :pin "f54e8a65a7") +(package! deft :pin "f54e8a65a7e75a029657364055420374df45656d") diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 5b2d0688d..adbb35714 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -24,27 +24,31 @@ (use-package! solaire-mode :when (or (daemonp) (display-graphic-p)) - :defer t - :init - (add-hook! 'doom-load-theme-hook :append - (defun +doom-solaire-mode-swap-bg-maybe-h () - (when (string-prefix-p "doom-" (symbol-name doom-theme)) - (require 'solaire-mode) - (solaire-mode-swap-bg)))) + :hook (doom-load-theme . solaire-global-mode) :config - ;; fringe can become unstyled when deleting or focusing frames - (add-hook 'focus-in-hook #'solaire-mode-reset) - ;; Prevent color glitches when reloading either DOOM or loading a new theme - (add-hook! '(doom-load-theme-hook doom-reload-hook) :append - #'solaire-mode-reset) + (when (daemonp) + (add-hook! 'doom-switch-frame-hook + (defun +doom-disable-solaire-mode-maybe-h () + (if (display-graphic-p) + (unless solaire-global-mode + (solaire-global-mode +1)) + (when solaire-global-mode + (solaire-global-mode -1)))))) + + (add-hook! 'solaire-global-mode-hook + (defun +doom-solaire-swap-bg-faces-maybe-h () + (and solaire-global-mode + (string-prefix-p "doom-" (symbol-name doom-theme)) + (solaire-mode-swap-bg)))) + ;; org-capture takes an org buffer and narrows it. The result is erroneously ;; considered an unreal buffer, so solaire-mode must be restored. (add-hook 'org-capture-mode-hook #'turn-on-solaire-mode) - ;; On Emacs 26+, when point is on the last line and solaire-mode is remapping - ;; the hl-line face, hl-line's highlight bleeds into the rest of the window - ;; after eob. On Emacs 27 this no longer happens. (unless EMACS27+ + ;; On Emacs <=26, when point is on the last line and solaire-mode is + ;; remapping the hl-line face, hl-line's highlight bleeds into the rest of + ;; the window after eob. On Emacs 27 this no longer happens. (defun +doom--line-range-fn () (let ((bol (line-beginning-position)) (eol (line-end-position)) @@ -57,21 +61,27 @@ (= eol pmax)) eol) ((line-beginning-position 2)))))) - (setq hl-line-range-function #'+doom--line-range-fn)) + (setq hl-line-range-function #'+doom--line-range-fn) - ;; Because fringes can't be given a buffer-local face, they can look odd, so - ;; we remove them in the minibuffer and which-key popups (they serve no - ;; purpose there anyway). - (add-hook! 'solaire-mode-hook - (defun +doom-disable-fringes-in-minibuffer-h (&rest _) - (set-window-fringes (minibuffer-window) 0 0 nil))) + ;; HACK The fringe cannot have a buffer-local remapping on Emacs <= 26, so + ;; we jump through hoops to reset it (globally) whenever it is likely + ;; that the fringe will have lost its background color. + + ;; Prevent color glitches when reloading either DOOM or loading a new theme + (add-hook! '(doom-load-theme-hook doom-reload-hook) :append + #'solaire-mode-reset) - (defadvice! +doom--no-fringes-in-which-key-buffer-a (&rest _) - :after 'which-key--show-buffer-side-window - (+doom-disable-fringes-in-minibuffer-h) - (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) + ;; fringe can become unstyled when deleting or focusing frames + (add-hook 'focus-in-hook #'solaire-mode-reset) - (add-hook! '(minibuffer-setup-hook window-configuration-change-hook) - #'+doom-disable-fringes-in-minibuffer-h) - - (solaire-global-mode +1)) + ;; A global fringe color means the minibuffer (with its fringes) will always + ;; stand out, so we remove them (in which-key popups too). + (add-hook! 'solaire-mode-hook + (defun +doom-disable-fringes-in-minibuffer-h (&rest _) + (set-window-fringes (minibuffer-window) 0 0 nil))) + (defadvice! +doom--no-fringes-in-which-key-buffer-a (&rest _) + :after 'which-key--show-buffer-side-window + (+doom-disable-fringes-in-minibuffer-h) + (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) + (add-hook! '(minibuffer-setup-hook window-configuration-change-hook) + #'+doom-disable-fringes-in-minibuffer-h))) diff --git a/modules/ui/doom/packages.el b/modules/ui/doom/packages.el index 0893eebed..b6e2ac273 100644 --- a/modules/ui/doom/packages.el +++ b/modules/ui/doom/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/doom/packages.el -(package! doom-themes :pin "8d5ddbbb72") -(package! solaire-mode :pin "4ac324ccb0") +(package! doom-themes :pin "254d476dd6790eaa6b563c5a4da286321ff75d38") +(package! solaire-mode :pin "adc8c0c60d914f6395eba0bee78feedda128b30b") diff --git a/modules/ui/fill-column/packages.el b/modules/ui/fill-column/packages.el index 24adf3078..75c23a2ef 100644 --- a/modules/ui/fill-column/packages.el +++ b/modules/ui/fill-column/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/fill-column/packages.el -(package! hl-fill-column :pin "43cb3c35a9") +(package! hl-fill-column :pin "43cb3c35a92c912b7205b8a36f1ad0ec0a5b4a22") diff --git a/modules/ui/hl-todo/packages.el b/modules/ui/hl-todo/packages.el index 05ef85835..d83551c7d 100644 --- a/modules/ui/hl-todo/packages.el +++ b/modules/ui/hl-todo/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/hl-todo/packages.el -(package! hl-todo :pin "3bba4591c5") +(package! hl-todo :pin "3bba4591c54951d2abab113ec5e58a6319808ca9") diff --git a/modules/ui/hydra/packages.el b/modules/ui/hydra/packages.el index 539cf3928..782bde9a5 100644 --- a/modules/ui/hydra/packages.el +++ b/modules/ui/hydra/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/hydra/packages.el -(package! hydra :pin "16fa8d109e") +(package! hydra :pin "16fa8d109ec5799931a793b2e866ea9d593bee84") diff --git a/modules/ui/indent-guides/packages.el b/modules/ui/indent-guides/packages.el index 3bf737416..dab8cc821 100644 --- a/modules/ui/indent-guides/packages.el +++ b/modules/ui/indent-guides/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/indent-guides/packages.el -(package! highlight-indent-guides :pin "0b10f38c54") +(package! highlight-indent-guides :pin "1b12c7b440ff988c7237936187c1375ac4ddc7f4") diff --git a/modules/ui/modeline/autoload.el b/modules/ui/modeline/autoload.el index 58ecd562b..437390db3 100644 --- a/modules/ui/modeline/autoload.el +++ b/modules/ui/modeline/autoload.el @@ -1,15 +1,5 @@ ;;; ui/modeline/autoload/modeline.el -*- lexical-binding: t; -*- -;;;###autodef -(defalias 'def-modeline-format! #'doom-modeline-def-modeline) - -;;;###autodef -(defalias 'def-modeline-segment! #'doom-modeline-def-segment) - -;;;###autodef -(defalias 'set-modeline! #'doom-modeline-set-modeline) - - (defvar +modeline--old-bar-height nil) ;;;###autoload (defun +modeline-resize-for-font-h () @@ -31,14 +21,16 @@ Meant for `doom-change-font-size-hook'." "Update version strings in all buffers." (dolist (window (window-list)) (with-selected-window window - (doom-modeline-update-env) + (when (fboundp 'doom-modeline-update-env) + (doom-modeline-update-env)) (force-mode-line-update)))) ;;;###autoload (defun +modeline-clear-env-in-all-windows-h (&rest _) "Blank out version strings in all buffers." - (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (setq doom-modeline-env--version - (bound-and-true-p doom-modeline-load-string)))) + (unless (featurep! +light) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (setq doom-modeline-env--version + (bound-and-true-p doom-modeline-load-string))))) (force-mode-line-update t)) diff --git a/modules/ui/modeline/packages.el b/modules/ui/modeline/packages.el index 4a8eae288..8e843630b 100644 --- a/modules/ui/modeline/packages.el +++ b/modules/ui/modeline/packages.el @@ -2,7 +2,7 @@ ;;; ui/modeline/packages.el (unless (featurep! +light) - (package! doom-modeline :pin "0ce0acd7bc")) -(package! anzu :pin "3e34fb3df5") + (package! doom-modeline :pin "c177959bbfa7fa6f199b1145c6986e55f462f1c1")) +(package! anzu :pin "3e34fb3df53c0c68e842fa179c327a7395d1901d") (when (featurep! :editor evil) - (package! evil-anzu :pin "9bca6ca14d")) + (package! evil-anzu :pin "9bca6ca14d865e7e005bc02a28a09b4ae74facc9")) diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index 862be30d2..5bfdd2747 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -37,4 +37,5 @@ (advice-add #'what-cursor-position :after #'+nav-flash-blink-cursor-a) :config - (if EMACS27+ (set-face-extend 'nav-flash-face t))) + (when (fboundp 'set-face-extend) + (set-face-extend 'nav-flash-face t))) diff --git a/modules/ui/nav-flash/packages.el b/modules/ui/nav-flash/packages.el index 12e2a5a1f..3cc02ee6e 100644 --- a/modules/ui/nav-flash/packages.el +++ b/modules/ui/nav-flash/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/nav-flash/packages.el -(package! nav-flash :pin "dbb9121663") +(package! nav-flash :pin "dbb91216637e0a1e8bfd59aa883c75d45db70daf") diff --git a/modules/ui/neotree/packages.el b/modules/ui/neotree/packages.el index 7cf6041ab..77fc8ff45 100644 --- a/modules/ui/neotree/packages.el +++ b/modules/ui/neotree/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/neotree/packages.el -(package! neotree :pin "98fe21334a") +(package! neotree :pin "5e1271655170f4cdc6849258e383c548a4e6e3d0") diff --git a/modules/ui/ophints/packages.el b/modules/ui/ophints/packages.el index 000154257..3070cc9fb 100644 --- a/modules/ui/ophints/packages.el +++ b/modules/ui/ophints/packages.el @@ -2,5 +2,5 @@ ;;; ui/ophints/packages.el (if (featurep! :editor evil) - (package! evil-goggles :pin "08a22058fd") - (package! volatile-highlights :pin "9a20091f0c")) + (package! evil-goggles :pin "08a22058fd6a167f9f1b684c649008caef571459") + (package! volatile-highlights :pin "9a20091f0ce7fc0a6b3e641a6a46d5f3ac4d8392")) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index d6cd059c3..7cc0573c7 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -195,20 +195,18 @@ the command buffer." ;; Fix #897: "cannot open side window" error when TAB-completing file links (defadvice! +popup--helm-hide-org-links-popup-a (orig-fn &rest args) :around #'org-insert-link - (cl-letf* ((old-org-completing-read (symbol-function 'org-completing-read)) - ((symbol-function 'org-completing-read) - (lambda (&rest args) - (when-let (win (get-buffer-window "*Org Links*")) - ;; While helm is opened as a popup, it will mistaken the - ;; *Org Links* popup for the "originated window", and will - ;; target it for actions invoked by the user. However, since - ;; *Org Links* is a popup too (they're dedicated side - ;; windows), Emacs complains about being unable to split a - ;; side window. The simple fix: get rid of *Org Links*! - (delete-window win) - ;; But it must exist for org to clean up later. - (get-buffer-create "*Org Links*")) - (apply old-org-completing-read args)))) + (letf! ((defun org-completing-read (&rest args) + (when-let (win (get-buffer-window "*Org Links*")) + ;; While helm is opened as a popup, it will mistaken the *Org + ;; Links* popup for the "originated window", and will target it + ;; for actions invoked by the user. However, since *Org Links* + ;; is a popup too (they're dedicated side windows), Emacs + ;; complains about being unable to split a side window. The + ;; simple fix: get rid of *Org Links*! + (delete-window win) + ;; ...but it must exist for org to clean up later. + (get-buffer-create "*Org Links*")) + (apply org-completing-read args))) (apply #'funcall-interactively orig-fn args))) ;; Fix left-over popup window when closing persistent help for `helm-M-x' @@ -228,7 +226,6 @@ the command buffer." (when (+popup-window-p win) (select-window win)))) - ;;;###package org (after! org ;; Org has a scorched-earth window management policy I'm not fond of. i.e. it @@ -242,10 +239,8 @@ the command buffer." org-fast-tag-selection org-fast-todo-selection) (if +popup-mode - (cl-letf (((symbol-function #'delete-other-windows) - (symbol-function #'ignore)) - ((symbol-function #'delete-window) - (symbol-function #'ignore))) + (letf! ((#'delete-other-windows #'ignore) + (#'delete-window #'ignore)) (apply orig-fn args)) (apply orig-fn args))) @@ -256,16 +251,14 @@ Ugh, such an ugly hack." :around '(org-fast-tag-selection org-fast-todo-selection) (if +popup-mode - (cl-letf* ((old-fit-buffer-fn (symbol-function #'org-fit-window-to-buffer)) - ((symbol-function #'org-fit-window-to-buffer) - (lambda (&optional window max-height min-height shrink-only) - (when-let (buf (window-buffer window)) - (delete-window window) - (select-window - (setq window (display-buffer-at-bottom buf nil))) - (with-current-buffer buf - (setq mode-line-format nil))) - (funcall old-fit-buffer-fn window max-height min-height shrink-only)))) + (letf! ((defun org-fit-window-to-buffer (&optional window max-height min-height shrink-only) + (when-let (buf (window-buffer window)) + (delete-window window) + (select-window + (setq window (display-buffer-at-bottom buf nil))) + (with-current-buffer buf + (setq mode-line-format nil))) + (funcall org-fit-window-to-buffer window max-height min-height shrink-only))) (apply orig-fn args)) (apply orig-fn args))) @@ -284,8 +277,7 @@ Ugh, such an ugly hack." ;; _then_ hand off the buffer to the pop up manager. (defadvice! +popup--org-src-switch-to-buffer-a (orig-fn &rest args) :around #'org-src-switch-to-buffer - (cl-letf (((symbol-function #'pop-to-buffer-same-window) - (symbol-function #'switch-to-buffer))) + (letf! ((#'pop-to-buffer-same-window #'switch-to-buffer)) (apply orig-fn args)))) @@ -316,8 +308,7 @@ Ugh, such an ugly hack." ;;;###package profiler (defadvice! +popup--profiler-report-find-entry-in-other-window-a (orig-fn function) :around #'profiler-report-find-entry - (cl-letf (((symbol-function 'find-function) - (symbol-function 'find-function-other-window))) + (letf! ((#'find-function #'find-function-other-window)) (funcall orig-fn function))) @@ -337,10 +328,9 @@ Ugh, such an ugly hack." which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window which-key-custom-show-popup-function (lambda (act-popup-dim) - (cl-letf (((symbol-function 'display-buffer-in-side-window) - (lambda (buffer alist) - (+popup-display-buffer-stacked-side-window-fn - buffer (append '((vslot . -9999)) alist))))) + (letf! ((defun display-buffer-in-side-window (buffer alist) + (+popup-display-buffer-stacked-side-window-fn + buffer (append '((vslot . -9999)) alist)))) ;; HACK Fix #2219 where the which-key popup would get cut off. (setcar act-popup-dim (1+ (car act-popup-dim))) (which-key--show-buffer-side-window act-popup-dim)))))) @@ -351,9 +341,8 @@ Ugh, such an ugly hack." (defadvice! +popup--ignore-window-parameters-a (orig-fn &rest args) "Allow *interactive* window moving commands to traverse popups." :around '(windmove-up windmove-down windmove-left windmove-right) - (cl-letf (((symbol-function #'windmove-find-other-window) - (lambda (dir &optional arg window) - (window-in-direction - (pcase dir (`up 'above) (`down 'below) (_ dir)) - window (bound-and-true-p +popup-mode) arg windmove-wrap-around t)))) + (letf! ((defun windmove-find-other-window (dir &optional arg window) + (window-in-direction + (pcase dir (`up 'above) (`down 'below) (_ dir)) + window (bound-and-true-p +popup-mode) arg windmove-wrap-around t))) (apply orig-fn args))) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 34279daea..aeb35884e 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -436,13 +436,14 @@ window and return that window." (defun +popup/diagnose () "Reveal what popup rule will be used for the current buffer." (interactive) - (or (cl-loop with bname = (buffer-name) - for (pred . action) in display-buffer-alist - if (and (functionp pred) (funcall pred bname action)) - return (cons pred action) - else if (and (stringp pred) (string-match-p pred bname)) - return (cons pred action)) - (message "No popup rule for this buffer"))) + (if-let (rule (cl-loop with bname = (buffer-name) + for (pred . action) in display-buffer-alist + if (and (functionp pred) (funcall pred bname action)) + return (cons pred action) + else if (and (stringp pred) (string-match-p pred bname)) + return (cons pred action))) + (message "Rule matches: %s" rule) + (message "No popup rule for this buffer"))) ;; diff --git a/modules/ui/pretty-code/+fira.el b/modules/ui/pretty-code/+fira.el index f1983a99d..b92f30f3c 100644 --- a/modules/ui/pretty-code/+fira.el +++ b/modules/ui/pretty-code/+fira.el @@ -118,7 +118,7 @@ ("*" . #Xe16f))) (defun +pretty-code-setup-fira-ligatures-h () - (set-fontset-font t '(#Xe100 . #Xe16f) +pretty-code-fira-code-font-name) + (set-fontset-font t '(#Xe100 . #Xe16f) +pretty-code-fira-code-font-name nil 'prepend) (setq-default prettify-symbols-alist (append prettify-symbols-alist (mapcar #'+pretty-code--correct-symbol-bounds diff --git a/modules/ui/pretty-code/+hasklig.el b/modules/ui/pretty-code/+hasklig.el index 7b2136ca6..e9d040704 100644 --- a/modules/ui/pretty-code/+hasklig.el +++ b/modules/ui/pretty-code/+hasklig.el @@ -49,7 +49,7 @@ (defun +pretty-code-setup-hasklig-ligatures-h () - (set-fontset-font t '(#Xe100 . #Xe129) +pretty-code-hasklig-font-name) + (set-fontset-font t '(#Xe100 . #Xe129) +pretty-code-hasklig-font-name nil 'prepend) (setq-default prettify-symbols-alist (append prettify-symbols-alist (mapcar #'+pretty-code--correct-symbol-bounds diff --git a/modules/ui/pretty-code/+iosevka.el b/modules/ui/pretty-code/+iosevka.el index 315dbd754..9d52fd818 100644 --- a/modules/ui/pretty-code/+iosevka.el +++ b/modules/ui/pretty-code/+iosevka.el @@ -224,7 +224,7 @@ "Defines the character mappings for ligatures for Iosevka.") (defun +pretty-code-setup-iosevka-ligatures-h () - (set-fontset-font t '(#Xe100 . #Xe1cc) +pretty-code-iosevka-font-name) + (set-fontset-font t '(#Xe100 . #Xe1cc) +pretty-code-iosevka-font-name nil 'prepend) (setq-default prettify-symbols-alist (append prettify-symbols-alist +pretty-code-iosevka-font-ligatures))) diff --git a/modules/ui/pretty-code/README.org b/modules/ui/pretty-code/README.org index d22e506f7..ef04c37d9 100644 --- a/modules/ui/pretty-code/README.org +++ b/modules/ui/pretty-code/README.org @@ -7,9 +7,15 @@ - [[#description][Description]] - [[#maintainers][Maintainers]] - [[#module-flags][Module Flags]] + - [[#font-ligatures-module-flags][Font ligatures module flags]] - [[#plugins][Plugins]] - [[#prerequisites][Prerequisites]] + - [[#ligatures][Ligatures]] + - [[#emacs-mac-port-or-emacs-28][Emacs-mac port or Emacs 28+]] + - [[#not-emacs-mac-and-emacs--27][Not Emacs-mac and Emacs <= 27]] - [[#features][Features]] + - [[#mathematical-symbols-replacement][Mathematical symbols replacement]] + - [[#coding-ligatures][Coding ligatures]] - [[#configuration][Configuration]] - [[#set-pretty-symbols][~set-pretty-symbols!~]] - [[#troubleshooting][Troubleshooting]] @@ -22,6 +28,11 @@ This module enables ligatures and/or arbitrary symbol substitutions with This module has no dedicated maintainers. ** Module Flags +*** Font ligatures module flags +Those flags are ignored on emacs-mac and on other platforms if running emacs 28+ +with harfbuzz feature. In those cases, ligatures are handled without needing the +extra configuration provided by those flags. + + =+fira= Enables =Fira Code= ligatures. This requires Fira Code Symbol and a patched version of Fira Code (see below). + =+hasklig= Enable =Hasklig= ligatures. This requires a patched version of the @@ -35,8 +46,19 @@ This module has no dedicated maintainers. This module installs no packages. * Prerequisites -For ligatures to work, you must: +** Ligatures +For ligatures to work, you must either: +- Have a recent enough version of Emacs which will compose ligatures + automatically, or +- Use one of our font-specific configurations. + +*** Emacs-mac port or Emacs 28+ +Ligatures are handled without needing additional configuration. If this doesn't +work, report a bug with your current version of emacs and the ligatures which +aren't working. + +*** Not Emacs-mac and Emacs <= 27 1. Enable one of the four ligature font flags: =+fira=, =+hasklig=, =+iosevka= or =+pragmata-pro=. 2. Install the patched version of the associated font with ~M-x @@ -46,6 +68,32 @@ For ligatures to work, you must: * TODO Features # An in-depth list of features, how to use them, and their dependencies. +** TODO Mathematical symbols replacement +** Coding ligatures +This module includes configuration to compose combinations like =->= or =::= +into prettier glyphs (called a ligature). Depending on the current version of +emacs, this is implemented in two different ways : + +- prettify-symbols-mode method :: this is the "legacy" method. It uses a font + which haves the ligatures as separate unicode symbols, and using + prettify-symbols-mode, =->=-like combinations are manually listed and replaced + with the correct symbol. The mapping between =->=-like sequences and unicode + values in the font are font-specific ; therefore =+fira=, =+iosevka=... files + and specific fonts are necessary for it to work. +- composition-function-table method :: regexes are used to match all the usual + sequences which are composed into ligatures. These regexes are passed to emacs + directly, which asks Harfbuzz to shape it. Ligatures are obtained + automatically depending on the capabilities of the font, and no font-specific + configuration is necessary. + +Emacs-mac port implements the /composition-function-table/ method in its code, +nothing is necessary on Doom side; otherwise, Doom implements the +/composition-function-table/ for emacs 28+ built with Harfbuzz support, and the +/prettify-symbols-mode/ method otherwise. + +Even though harfbuzz has been included in emacs 27, there is currently a [[https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-04/msg01121.html][bug +(#40864)]] which prevents a safe usage of /composition-function-table/ method in +emacs 27. * TODO Configuration # How to configure this module, including common problems and how to address them. diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el index 6622c8fef..89a1a698b 100644 --- a/modules/ui/pretty-code/config.el +++ b/modules/ui/pretty-code/config.el @@ -49,17 +49,54 @@ besides what is listed.") "An alist containing a mapping of major modes to its value for `prettify-symbols-alist'.") +;;; Automatic font-specific ligatures +(defvar +prog-ligatures-alist + (eval-when-compile + `((?! . ,(regexp-opt '("!!" "!=" "!=="))) + (?# . ,(regexp-opt '("##" "###" "####" "#(" "#:" "#=" "#?" "#[" "#_" "#_(" "#{"))) + (?$ . ,(regexp-opt '("$>" "$>>"))) + (?% . ,(regexp-opt '("%%" "%%%"))) + (?& . ,(regexp-opt '("&&" "&&&"))) + (?* . ,(regexp-opt '("*" "**" "***" "**/" "*/" "*>"))) + (?+ . ,(regexp-opt '("+" "++" "+++" "+>"))) + (?- . ,(regexp-opt '("--" "---" "-->" "-<" "-<<" "->" "->>" "-}" "-~"))) + (?. . ,(regexp-opt '(".-" ".." "..." "..<" ".="))) + (?/ . ,(regexp-opt '("/*" "/**" "//" "///" "/=" "/==" "/>"))) + (?: . ,(regexp-opt '(":" "::" ":::" ":=" ":<" ":=" ":>"))) + (?0 . "0\\(?:\\(x[a-fA-F0-9]\\).?\\)") ; Tries to match the x in 0xDEADBEEF + ;; (?x . ,(regexp-opt '("x"))) ; Also tries to match the x in 0xDEADBEEF + (?\; . ,(regexp-opt '(";;"))) + (?< . ,(regexp-opt '("