Merge branch 'develop' into eshell-improvements

This commit is contained in:
Steven vanZyl 2020-04-28 09:33:56 -04:00
commit 73de701073
112 changed files with 1431 additions and 978 deletions

370
README.md
View file

@ -1,185 +1,253 @@
<a href="http://doomemacs.org"> <div align="center">
<img src="https://img.shields.io/github/tag/hlissner/doom-emacs.svg?label=release&color=orange&style=for-the-badge" alt="Made with Doom Emacs">
</a> # Doom Emacs
<a href="https://emacs.org">
<img src="https://img.shields.io/badge/Supports-26.1_--_27.0.50-blueviolet.svg?style=for-the-badge&logo=GNU%20Emacs&logoColor=white" alt="Supports Emacs 26.x - 27.0.50"> [Install](#install) • [Documentation] • [FAQ] • [Screenshots] • [Contribute](#contribute)
</a>
<a href="https://github.com/hlissner/doom-emacs/actions"> ![Made with Doom Emacs](https://img.shields.io/github/tag/hlissner/doom-emacs.svg?style=flat-square&label=release&color=58839b)
<img src="https://github.com/hlissner/doom-emacs/workflows/CI/badge.svg" alt="Build status: develop"> ![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)
</a> ![Latest commit](https://img.shields.io/github/last-commit/hlissner/doom-emacs/develop?style=flat-square)
<a href="https://discord.gg/qvGgnVx"> ![Build status: develop](https://img.shields.io/github/workflow/status/hlissner/doom-emacs/CI/develop?style=flat-square)
<img src="https://img.shields.io/badge/Discord-blue.svg?logo=discord&label=join&style=for-the-badge" alt="Join our discord server" align="right"> [![Discord Server](https://img.shields.io/discord/406534637242810369?color=blue&label=Discord%20Chat&logo=discord&logoColor=white&style=flat-square)][Discord]
</a>
<br><br>
![Doom Emacs Screenshot](https://raw.githubusercontent.com/hlissner/doom-emacs/screenshots/main.png) ![Doom Emacs Screenshot](https://raw.githubusercontent.com/hlissner/doom-emacs/screenshots/main.png)
<p align="center"> </div>
<b><a href="/../../tree/screenshots">Screenshots</a></b>
|
<b><a href="docs/getting_started.org">Get started</a></b>
|
<b><a href="docs/contributing.org">Contribute</a></b>
|
<b><a href="docs/index.org">Documentation</a></b>
|
<b><a href="docs/faq.org">FAQ</a></b>
</p>
--- ---
**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
<a href="http://ultravioletbat.deviantart.com/art/Yay-Evil-111710573"> <a href="http://ultravioletbat.deviantart.com/art/Yay-Evil-111710573">
<img src="https://github.com/hlissner/doom-emacs/raw/screenshots/cacochan.png" align="right" /> <img src="https://raw.githubusercontent.com/hlissner/doom-emacs/screenshots/cacochan.png" align="right" />
</a> </a>
It is a story as old as time. A stubborn, shell-dwelling, and melodramatic > 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 > vimmer—envious of the features of modern text editors—spirals into
before succumbing to the [dark side][url:evil-mode]. This is his config. > despair before he succumbs to the [dark side][evil-mode]. This is his config.
Doom is a configuration framework for [GNU Doom is a configuration framework for [GNU Emacs] tailored for Emacs bankruptcy
Emacs](https://www.gnu.org/software/emacs/) tailored for Emacs bankruptcy veterans who want less framework in their frameworks, a modicum of stability
veterans who want less framework in their frameworks and the performance of a (and reproducibility) from their package manager, and the performance of a hand
hand rolled config (or better). It can be a foundation for your own config or a 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. 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 + **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! beyond by modifying packages to be snappier and load lazier.
- **Close to metal.** There's less between you and vanilla Emacs by design. + **Close to metal.** There's less between you and vanilla Emacs by design.
There's less to grok, on top of Emacs. That's less to grok and less to work around when you tinker. Internals ought
- **Readability counts.** Internals ought to be written as if reading them were to be written as if reading them were part of Doom's UX, and it is!
part of the user experience, and it is! Modules should be syntactically sweet. + **Opinionated, but not stubborn.** Doom is about reasonable defaults and
Backend logic should be functional (as much as elisp permits), abstraction curated opinions, but use as little or as much of it as you like.
light and (hopefully) documented. + **Your system, your rules.** You know better. At least, Doom hopes so! It
- **Opinionated, but not stubborn.** Doom is a bundle of reasonable defaults and won't *automatically* install system dependencies (and will force plugins not
curated opinions, but all of it should be optional. Use as little or as much to either). Rely on `doom doctor` to tell you what's missing.
of it as you like. + **Nix/Guix was a great idea!** The Emacs ecosystem is temperamental. Things
- **Your system, your rules.** There are more ways to set up your development break and they break often. Disaster recovery should be a priority! Doom's
environment than there are dislikes on Youtube Rewind '18, so Doom leaves it package management should be declarative and your private config reproducible,
to you. Doom will not *automatically* install system dependencies (and will and comes with a means to roll back releases and updates (still a WIP).
coerce its plugins not to do so either). Use `doom doctor` to figure out
what's missing. Check out [the FAQ][FAQ] for answers to common questions about the project.
## Features
# Features
- Minimalistic good looks inspired by modern editors. - 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. - 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, - Support for *many* programming languages. Includes syntax highlighting,
linters/checker integration, inline code evaluation, code completion (where linters/checker integration, inline code evaluation, code completion (where
possible), REPLs, documentation lookups, snippets, and more! possible), REPLs, documentation lookups, snippets, and more!
- Support for *many* tools, like docker, pass, ansible, terraform, and more. - Support for *many* tools, like docker, pass, ansible, terraform, and more.
- A Spacemacs-esque [keybinding scheme][doom:bindings], centered around leader - A Spacemacs-esque [keybinding scheme][bindings], centered around leader
and localleader prefix keys (<kbd>SPC</kbd> and <kbd>SPC</kbd><kbd>m</kbd>, by and localleader prefix keys (<kbd>SPC</kbd> and <kbd>SPC</kbd><kbd>m</kbd> for
default). evil users, <kbd>C-c</kbd> and <kbd>C-c l</kbd> for vanilla users).
- A rule-based [popup management system][doom:popups] to control how temporary - A rule-based [popup manager][popup-system] to control how temporary buffers
or disposable buffers are displayed (and disposed of). are displayed (and disposed of).
- Automatic indentation detection and [editorconfig][url:editorconfig] - Per-file indentation style detection and [editorconfig] integration. Let
integration. Let someone else argue about tabs vs **\_\***spaces**\*\_**. someone else can argue about tabs vs **_spaces_**.
- Project-management tools and framework-specific minor modes with their own - Project-management tools and framework-specific minor modes with their own
snippets libraries. 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). - Isolated and persistent workspaces (also substitutes for vim tabs).
- An envvar file generator that captures a snapshot of your shell environment - Support for Chinese and Japanese input systems.
for Doom to load at startup. No more struggling to get Emacs to inherit your - Save a snapshot of your shell environment to a file for Emacs to load at
`PATH`, among other things. 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 Then [read our Getting Started guide][getting-started] to be walked through
report: installing, configuring and maintaining Doom Emacs.
- Run `bin/doom sync`. This ensures Doom is properly set up and its autoloads It's a good idea to add `~/.emacs.d/bin` to your `PATH`! Other `bin/doom`
files are up-to-date. commands you should know about:
- 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 + `doom sync` to synchronize your private config with Doom. Installs new
config. It makes your job harder. packages, removes orphaned packages and regenerates caches. Run this whenever
- Run `bin/doom doctor` to detect common issues in your development environment you modify your private `init.el` or `packages.el`, or install/remove an Emacs
and missing third party dependencies. package through your OS package manager (e.g. mu4e or agda).
- Search [Doom's issue tracker][github:issues] in case your issue was already + `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: <kbd>SPC h f</kbd> or <kbd>C-h f</kbd>
+ For variables: <kbd>SPC h v</kbd> or <kbd>C-h v</kbd>
+ For a keybind: <kbd>SPC h k</kbd> or <kbd>C-h k</kbd>
+ To search available keybinds: <kbd>SPC h b b</kbd> or <kbd>C-h b b</kbd>
+ 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. reported.
- [Visit our FAQ][docs:faq] to see if your issue is listed. + 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.
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.
[docs:wiki]: docs/index.org # Contribute
[docs:wiki-quickstart]: docs/getting_started.org [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[docs:wiki-modules]: docs/index.org#Module%20List [![Elisp styleguide](https://img.shields.io/badge/elisp-style%20guide-purple?style=flat-square)](https://github.com/bbatsov/emacs-lisp-style-guide)
[docs:wiki-customization]: docs/getting_started.org#Customize [![Donate on liberapay](https://img.shields.io/badge/liberapay-donate-1.svg?style=flat-square&logo=liberapay&color=blue)][liberapay]
[docs:contributing]: docs/contributing.org [![Donate on paypal](https://img.shields.io/badge/paypal-donate-1?style=flat-square&logo=paypal&color=blue)][paypal]
[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 Doom is a labor of love and incurable madness, but I'm only one guy. Doom
[github:new-issue]: https://github.com/hlissner/doom-emacs/issues/new wouldn't be where it is today without your help. I welcome contributions of any
[github:issues]: https://github.com/hlissner/doom-emacs/issues kind!
[doom:bindings]: modules/config/default/+evil-bindings.el
[doom:packages]: core/autoload/packages.el + I :heart: pull requests and bug reports (see the [Contributing
[doom:popups]: modules/ui/popup/README.org Guidelines][contribute])!
[url:discord]: https://discord.gg/qvGgnVx + Don't hesitate to [tell me my Elisp-fu
[url:liberapay]: https://liberapay.com/hlissner/donate sucks](https://github.com/hlissner/doom-emacs/issues/new), but please tell me
[url:paypal]: https://paypal.me/henriklissner/10 why.
[url:editorconfig]: http://editorconfig.org/ + Hop on [our Discord server][Discord] and say hi! Help others, hang out or talk
[url:evil-mode]: https://github.com/emacs-evil/evil to me about Emacs, gamedev, programming, physics, pixel art, anime, gaming --
[url:ripgrep]: https://github.com/BurntSushi/ripgrep anything you like. Nourish this lonely soul.
[url:straight]: https://github.com/raxod502/straight.el + 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

View file

@ -76,7 +76,7 @@ Runs `doom-reload-hook' afterwards."
(interactive) (interactive)
(require 'core-cli) (require 'core-cli)
(when (and IS-WINDOWS (file-exists-p doom-env-file)) (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, ;; In case doom/reload is run before incrementally loaded packages are loaded,
;; which could cause odd load order issues. ;; which could cause odd load order issues.
(mapc #'require (cdr doom-incremental-packages)) (mapc #'require (cdr doom-incremental-packages))

View file

@ -203,52 +203,29 @@ single file or nested compound statement of `and' and `or' statements."
;; ;;
;;; Helpers ;;; Helpers
(defun doom--forget-file (path) (defun doom--update-files (&rest files)
"Ensure `recentf', `projectile' and `save-place' forget OLD-PATH." "Ensure FILES are updated in `recentf', `magit' and `save-place'."
(when (bound-and-true-p recentf-mode) (let (toplevels)
(recentf-remove-if-non-kept path)) (dolist (file files)
(when (and (bound-and-true-p projectile-mode) (when (featurep 'vc)
(doom-project-p) (vc-file-clearprops file)
(projectile-file-cached-p path (doom-project-root))) (when-let (buffer (get-file-buffer file))
(projectile-purge-file-from-cache path)) (with-current-buffer buffer
(when (bound-and-true-p save-place-mode) (vc-refresh-state))))
(save-place-forget-unreadable-files))) (when (featurep 'magit)
(when-let (default-directory (magit-toplevel (file-name-directory file)))
(defun doom--update-file (path) (cl-pushnew default-directory toplevels)))
(when (featurep 'vc) (unless (file-readable-p file)
(vc-file-clearprops path) (when (bound-and-true-p recentf-mode)
(vc-resynch-buffer path nil t)) (recentf-remove-if-non-kept file))
(when (featurep 'magit) (when (and (bound-and-true-p projectile-mode)
(when-let (default-directory (magit-toplevel (file-name-directory path))) (doom-project-p)
(magit-refresh)))) (projectile-file-cached-p file (doom-project-root)))
(projectile-purge-file-from-cache file))))
(defun doom--copy-file (old-path new-path &optional force-p) (dolist (default-directory toplevels)
(let* ((new-path (expand-file-name new-path)) (magit-refresh))
(old-path (file-truename old-path)) (when (bound-and-true-p save-place-mode)
(new-path (apply #'expand-file-name (save-place-forget-unreadable-files))))
(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))))
;; ;;
@ -256,73 +233,67 @@ single file or nested compound statement of `and' and `or' statements."
;;;###autoload ;;;###autoload
(defun doom/delete-this-file (&optional path force-p) (defun doom/delete-this-file (&optional path force-p)
"Delete FILENAME (defaults to the file associated with current buffer) and "Delete PATH, kill its buffers and expunge it from vc/magit cache.
kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)."
If PATH is not specified, default to the current buffer's file.
If FORCE-P, delete without confirmation."
(interactive (interactive
(list (file-truename (buffer-file-name)) (list (buffer-file-name (buffer-base-buffer))
current-prefix-arg)) current-prefix-arg))
(let* ((fbase (file-name-sans-extension (file-name-nondirectory path))) (let* ((path (or path (buffer-file-name (buffer-base-buffer))))
(buf (current-buffer))) (short-path (abbreviate-file-name path)))
(cond ((not (file-exists-p path)) (unless (and path (file-exists-p path))
(error "File doesn't exist: %s" path)) (user-error "Buffer is not visiting any file"))
((not (or force-p (y-or-n-p (format "Really delete %s?" fbase)))) (unless (file-exists-p path)
(message "Aborted") (error "File doesn't exist: %s" path))
nil) (unless (or force-p (y-or-n-p (format "Really delete %S?" short-path)))
((unwind-protect (user-error "Aborted"))
(progn (delete-file path) t) (let ((buf (current-buffer)))
(let ((short-path (file-relative-name path (doom-project-root)))) (unwind-protect
(if (file-exists-p path) (progn (delete-file path) t)
(error "Failed to delete %s" short-path) (if (file-exists-p path)
;; Ensures that windows displaying this buffer will be switched (error "Failed to delete %S" short-path)
;; to real buffers (`doom-real-buffer-p') ;; Ensures that windows displaying this buffer will be switched to
(doom/kill-this-buffer-in-all-windows buf t) ;; real buffers (`doom-real-buffer-p')
(doom--forget-file path) (doom/kill-this-buffer-in-all-windows buf t)
(doom--update-file path) (doom--update-files path)
(message "Successfully deleted %s" short-path)))))))) (message "Deleted %S" short-path))))))
;;;###autoload ;;;###autoload
(defun doom/copy-this-file (new-path &optional force-p) (defun doom/copy-this-file (new-path &optional force-p)
"Copy current buffer's file to NEW-PATH. If FORCE-P, overwrite the destination "Copy current buffer's file to NEW-PATH.
file if it exists, without confirmation."
If FORCE-P, overwrite the destination file if it exists, without confirmation."
(interactive (interactive
(list (read-file-name "Copy file to: ") (list (read-file-name "Copy file to: ")
current-prefix-arg)) current-prefix-arg))
(pcase (catch 'status (unless (and buffer-file-name (file-exists-p buffer-file-name))
(when-let (dest (doom--copy-file (buffer-file-name) new-path force-p)) (user-error "Buffer is not visiting any file"))
(doom--update-file new-path) (let ((old-path (buffer-file-name (buffer-base-buffer)))
(message "File successfully copied to %s" dest))) (new-path (expand-file-name new-path)))
(`overwrite-self (error "Cannot overwrite self")) (make-directory (file-name-directory new-path) 't)
(`aborted (message "Aborted")) (copy-file old-path new-path (or force-p 1))
(_ t))) (doom--update-files old-path new-path)
(message "File copied to %S" (abbreviate-file-name new-path))))
;;;###autoload ;;;###autoload
(defun doom/move-this-file (new-path &optional force-p) (defun doom/move-this-file (new-path &optional force-p)
"Move current buffer's file to NEW-PATH. If FORCE-P, overwrite the destination "Move current buffer's file to NEW-PATH.
file if it exists, without confirmation."
If FORCE-P, overwrite the destination file if it exists, without confirmation."
(interactive (interactive
(list (read-file-name "Move file to: ") (list (read-file-name "Move file to: ")
current-prefix-arg)) current-prefix-arg))
(pcase (catch 'status (unless (and buffer-file-name (file-exists-p buffer-file-name))
(let ((old-path (buffer-file-name)) (user-error "Buffer is not visiting any file"))
(new-path (expand-file-name new-path))) (let ((old-path (buffer-file-name (buffer-base-buffer)))
(when-let (dest (doom--copy-file old-path new-path force-p)) (new-path (expand-file-name new-path)))
(doom--forget-file old-path) (make-directory (file-name-directory new-path) 't)
(when (file-exists-p old-path) (rename-file old-path new-path (or force-p 1))
(delete-file old-path)) (set-visited-file-name new-path t t)
(mapc #'doom--update-file (doom--update-files old-path new-path)
(delq (message "File moved to %S" (abbreviate-file-name new-path))))
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)))
(defun doom--sudo-file-path (file) (defun doom--sudo-file-path (file)
(let ((host (or (file-remote-p file 'host) "localhost"))) (let ((host (or (file-remote-p file 'host) "localhost")))

View file

@ -3,9 +3,6 @@
(defvar doom--help-major-mode-module-alist (defvar doom--help-major-mode-module-alist
'((dockerfile-mode :tools docker) '((dockerfile-mode :tools docker)
(agda2-mode :lang agda) (agda2-mode :lang agda)
(haxor-mode :lang assembly)
(mips-mode :lang assembly)
(nasm-mode :lang assembly)
(c-mode :lang cc) (c-mode :lang cc)
(c++-mode :lang cc) (c++-mode :lang cc)
(objc++-mode :lang cc) (objc++-mode :lang cc)

View file

@ -90,7 +90,6 @@ one wants that.")
(defun doom-cli--byte-compile-file (file) (defun doom-cli--byte-compile-file (file)
(condition-case-unless-debug e (condition-case-unless-debug e
(let ((byte-compile-warnings (if doom-debug-mode byte-compile-warnings)) (let ((byte-compile-warnings (if doom-debug-mode byte-compile-warnings))
(byte-compile-dynamic t)
(byte-compile-dynamic-docstrings t)) (byte-compile-dynamic-docstrings t))
(when (byte-compile-file file) (when (byte-compile-file file)
(unless doom-interactive-mode (unless doom-interactive-mode

View file

@ -123,11 +123,8 @@ in."
"both is rarely intentional; you should one or the other.")) "both is rarely intentional; you should one or the other."))
;; Check for fonts ;; Check for fonts
(if (not (fboundp 'find-font)) (if (not (executable-find "fc-list"))
(progn (warn! "Warning: unable to detect fonts because fontconfig isn't installed")
(warn! "Warning: unable to detect font")
(explain! "The `find-font' function is missing. This could indicate the incorrect "
"version of Emacs is being used!"))
;; all-the-icons fonts ;; all-the-icons fonts
(when (and (pcase system-type (when (and (pcase system-type
(`gnu/linux (concat (or (getenv "XDG_DATA_HOME") (`gnu/linux (concat (or (getenv "XDG_DATA_HOME")

View file

@ -174,6 +174,8 @@ possible."
(push '("/LICENSE\\'" . text-mode) auto-mode-alist) (push '("/LICENSE\\'" . text-mode) auto-mode-alist)
(push '("\\.log\\'" . 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)
;; ;;
@ -383,8 +385,6 @@ files, so we replace calls to `pp' with the much faster `prin1'."
;; Reduced from the default of 5000 for slightly faster analysis ;; Reduced from the default of 5000 for slightly faster analysis
(setq dtrt-indent-max-lines 2000) (setq dtrt-indent-max-lines 2000)
;; Add support for more languages
(add-to-list 'dtrt-indent-hook-mapping-list '(typescript-mode javascript typescript-indent-level))
;; always keep tab-width up-to-date ;; always keep tab-width up-to-date
(push '(t tab-width) dtrt-indent-hook-generic-mapping-list) (push '(t tab-width) dtrt-indent-hook-generic-mapping-list)

View file

@ -77,7 +77,8 @@ all hooks after it are ignored.")
:init :init
;; Convenience aliases ;; Convenience aliases
(defalias 'define-key! #'general-def) (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 ;; HACK `map!' uses this instead of `define-leader-key!' because it consumes
;; 20-30% more startup time, so we reimplement it ourselves. ;; 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) (general--concat t doom-leader-key ,key)
,desc)))))))) ,desc))))))))
(macroexp-progn (macroexp-progn
(cons `(after! which-key ,@(nreverse wkforms)) (append (and wkforms `((after! which-key ,@(nreverse wkforms))))
(nreverse forms))))) (nreverse forms)))))
(defmacro define-leader-key! (&rest args) (defmacro define-leader-key! (&rest args)
"Define <leader> keys. "Define <leader> keys.

View file

@ -481,39 +481,6 @@ WARNINGS:
(lambda () ,@body) (lambda () ,@body)
'append))) '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) (defmacro featurep! (category &optional module flag)
"Returns t if CATEGORY MODULE is enabled. "Returns t if CATEGORY MODULE is enabled.
@ -538,18 +505,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))))) (memq category (doom-module-get (car module) (cdr module) :flags)))))
t)) 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) (provide 'core-modules)
;;; core-modules.el ends here ;;; core-modules.el ends here

View file

@ -94,7 +94,7 @@ missing) and shouldn't be deleted.")
;;; Straight ;;; Straight
(setq straight-base-dir doom-local-dir (setq straight-base-dir doom-local-dir
straight-repository-branch "develop" straight-repository-branch "master"
straight-cache-autoloads nil ; we already do this, and better. straight-cache-autoloads nil ; we already do this, and better.
;; Doom doesn't encourage you to modify packages in place. Disabling this ;; Doom doesn't encourage you to modify packages in place. Disabling this
;; makes 'doom sync' instant (once everything set up), which is much nicer ;; makes 'doom sync' instant (once everything set up), which is much nicer

View file

@ -15,9 +15,6 @@ Emacs.")
"fd") "fd")
"name of `fd-find' executable binary") "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 ;;; Packages
@ -43,6 +40,16 @@ Emacs.")
:config :config
(projectile-mode +1) (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! '(after-change-major-mode-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 runs four functions to determine the root (in this order):
;; ;;
;; + `projectile-root-local' -> checks the `projectile-project-root' variable ;; + `projectile-root-local' -> checks the `projectile-project-root' variable

View file

@ -138,10 +138,11 @@ size.")
e.g. If you indent with spaces by default, tabs will be highlighted. If you e.g. If you indent with spaces by default, tabs will be highlighted. If you
indent with tabs, spaces at BOL are highlighted. indent with tabs, spaces at BOL are highlighted.
Does nothing if `whitespace-mode' is already active or the current buffer is Does nothing if `whitespace-mode' or 'global-whitespace-mode' is already
read-only or not file-visiting." active or if the current buffer is read-only or not file-visiting."
(unless (or (eq major-mode 'fundamental-mode) (unless (or (eq major-mode 'fundamental-mode)
buffer-read-only buffer-read-only
(bound-and-true-p global-whitespace-mode)
(null buffer-file-name)) (null buffer-file-name))
(require 'whitespace) (require 'whitespace)
(set (make-local-variable 'whitespace-style) (set (make-local-variable 'whitespace-style)
@ -277,9 +278,6 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
(setq indicate-buffer-boundaries nil (setq indicate-buffer-boundaries nil
indicate-empty-lines nil) indicate-empty-lines nil)
;; remove continuation arrow on right fringe
(delq! 'continuation fringe-indicator-alist 'assq)
;; ;;
;;; Windows/frames ;;; Windows/frames
@ -421,7 +419,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original
(use-package! hl-line (use-package! hl-line
;; Highlights the current 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 :config
;; Not having to render the hl-line overlay in multiple buffers offers a tiny ;; 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. ;; performance boost. I also don't need to see it in other buffers.
@ -597,20 +595,25 @@ 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 (let ((doom--prefer-theme-elc t)) ; DEPRECATED in Emacs 27
(load-theme doom-theme t))))) (load-theme doom-theme t)))))
(defadvice! doom--run-load-theme-hooks-a (theme &optional _no-confirm no-enable) (defadvice! doom--load-theme-a (orig-fn theme &optional no-confirm no-enable)
"Set up `doom-load-theme-hook' to run after `load-theme' is called." "Run `doom-load-theme-hook' on `load-theme' and fix its issues.
:after-while #'load-theme
(unless no-enable
(setq doom-theme theme
doom-init-theme-p t)
(run-hooks 'doom-load-theme-hook)))
(defadvice! doom--disable-enabled-themes-a (theme &optional _no-confirm no-enable) 1. Disable previously enabled themes.
"Disable previously enabled themes before loading a new one. 2. Don't let face-remapping screw up loading the new theme
Otherwise, themes can conflict with each other." (*cough*`mixed-pitch-mode').
:after-while #'load-theme 3. Record the current theme in `doom-theme'."
(unless no-enable :around #'load-theme
(mapc #'disable-theme (remq theme custom-enabled-themes)))) ;; 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)
(mapc #'disable-theme (remq theme custom-enabled-themes))
(run-hooks 'doom-load-theme-hook))
result)))
(unless EMACS27+ (unless EMACS27+
;; DEPRECATED Not needed in Emacs 27 ;; DEPRECATED Not needed in Emacs 27

View file

@ -8,6 +8,7 @@
"Current version of Doom Emacs.") "Current version of Doom Emacs.")
(defconst EMACS27+ (> emacs-major-version 26)) (defconst EMACS27+ (> emacs-major-version 26))
(defconst EMACS28+ (> emacs-major-version 27))
(defconst IS-MAC (eq system-type 'darwin)) (defconst IS-MAC (eq system-type 'darwin))
(defconst IS-LINUX (eq system-type 'gnu/linux)) (defconst IS-LINUX (eq system-type 'gnu/linux))
(defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) (defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos)))
@ -196,11 +197,12 @@ users).")
(setq gnutls-verify-error (not (getenv "INSECURE")) (setq gnutls-verify-error (not (getenv "INSECURE"))
gnutls-algorithm-priority gnutls-algorithm-priority
(when (boundp 'libgnutls-version) (when (boundp 'libgnutls-version)
(concat "SECURE128:+SECURE192:-VERS-ALL:+VERS-TLS1.2" (concat "SECURE128:+SECURE192:-VERS-ALL"
(if (and (not IS-WINDOWS) (if (and (not IS-WINDOWS)
(not (version< emacs-version "26.3")) (not (version< emacs-version "26.3"))
(>= libgnutls-version 30605)) (>= libgnutls-version 30605))
":+VERS-TLS1.3"))) ":+VERS-TLS1.3")
":+VERS-TLS1.2"))
;; `gnutls-min-prime-bits' is set based on recommendations from ;; `gnutls-min-prime-bits' is set based on recommendations from
;; https://www.keylength.com/en/4/ ;; https://www.keylength.com/en/4/
gnutls-min-prime-bits 3072 gnutls-min-prime-bits 3072
@ -272,6 +274,11 @@ users).")
;; quickly self-correct. ;; quickly self-correct.
(setq fast-but-imprecise-scrolling t) (setq fast-but-imprecise-scrolling t)
;; Font locking is the source of much slowness in Emacs. jit-lock-mode tries to
;; defer fontification until the user is idle. This should help... in theory.
(setq jit-lock-defer-time 0 ; only defer while processing input
jit-lock-stealth-time 2) ; fontify the rest of the buffer after a delay
;; Resizing the Emacs frame can be a terribly expensive part of changing the ;; Resizing the Emacs frame can be a terribly expensive part of changing the
;; font. By inhibiting this, we halve startup times, particularly when we use ;; font. By inhibiting this, we halve startup times, particularly when we use
;; fonts that are larger than the system default (which would resize the frame). ;; fonts that are larger than the system default (which would resize the frame).

View file

@ -910,7 +910,7 @@ also be helpful for debugging.
+ define-key + define-key
+ global-set-key + global-set-key
+ map! + map!
+ unmap! + undefine-key!
+ define-key! + define-key!
** Writing your own modules ** Writing your own modules

View file

@ -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. Modules that bring support for a language or group of languages to Emacs.
+ [[file:../modules/lang/agda/README.org][agda]] - TODO + [[file:../modules/lang/agda/README.org][agda]] - TODO
+ assembly - TODO
+ [[file:../modules/lang/cc/README.org][cc]] =+lsp= - TODO + [[file:../modules/lang/cc/README.org][cc]] =+lsp= - TODO
+ [[file:../modules/lang/clojure/README.org][clojure]] =+lsp= - TODO + [[file:../modules/lang/clojure/README.org][clojure]] =+lsp= - TODO
+ common-lisp - 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 + [[file:../modules/lang/haskell/README.org][haskell]] =+dante +ghcide +lsp= - TODO
+ hy - TODO + hy - TODO
+ [[file:../modules/lang/idris/README.org][idris]] - TODO + [[file:../modules/lang/idris/README.org][idris]] - TODO
+ [[file:../modules/lang/json/README.org][json]] =+lsp= - TODO
+ java =+meghanada +lsp= - TODO + java =+meghanada +lsp= - TODO
+ [[file:../modules/lang/javascript/README.org][javascript]] =+lsp= - JavaScript, TypeScript, and CoffeeScript support + [[file:../modules/lang/javascript/README.org][javascript]] =+lsp= - JavaScript, TypeScript, and CoffeeScript support
+ julia =+lsp= - TODO + julia =+lsp= - TODO
+ kotlin =+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 + lean - TODO
+ [[file:../modules/lang/ledger/README.org][ledger]] - TODO + [[file:../modules/lang/ledger/README.org][ledger]] - TODO
+ lua =+moonscript= - 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 + [[file:../modules/lang/php/README.org][php]] =+lsp= - TODO
+ plantuml - TODO + plantuml - TODO
+ purescript - 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 + qt - TODO
+ racket - TODO + racket - TODO
+ [[file:../modules/lang/rest/README.org][rest]] - 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 + swift =+lsp= - TODO
+ terra - TODO + terra - TODO
+ web =+lsp= - HTML and CSS (SCSS/SASS/LESS/Stylus) support. + web =+lsp= - HTML and CSS (SCSS/SASS/LESS/Stylus) support.
+ [[file:../modules/lang/yaml/README.org][yaml]] =+lsp= - TODO
* :term * :term
Modules that offer terminal emulation. Modules that offer terminal emulation.
@ -156,7 +157,7 @@ Modules that offer terminal emulation.
Small modules that give Emacs access to external tools & services. Small modules that give Emacs access to external tools & services.
+ ansible - TODO + ansible - TODO
+ debugger - A (nigh-)universal debugger in Emacs + debugger =+lsp= - A (nigh-)universal debugger in Emacs
+ [[file:../modules/tools/direnv/README.org][direnv]] - TODO + [[file:../modules/tools/direnv/README.org][direnv]] - TODO
+ [[file:../modules/tools/docker/README.org][docker]] =+lsp= - TODO + [[file:../modules/tools/docker/README.org][docker]] =+lsp= - TODO
+ [[file:../modules/tools/editorconfig/README.org][editorconfig]] - TODO + [[file:../modules/tools/editorconfig/README.org][editorconfig]] - TODO
@ -167,7 +168,7 @@ Small modules that give Emacs access to external tools & services.
backend backend
+ [[file:../modules/tools/lsp/README.org][lsp]] =+peek= - TODO + [[file:../modules/tools/lsp/README.org][lsp]] =+peek= - TODO
+ macos - TODO + macos - TODO
+ magit - TODO + [[file:../modules/tools/magit/README.org][magit]] =+forge= - TODO
+ make - TODO + make - TODO
+ pass - TODO + pass - TODO
+ pdf - TODO + pdf - TODO

View file

@ -1,11 +1,11 @@
;;; init.el -*- lexical-binding: t; -*- ;;; init.el -*- lexical-binding: t; -*-
;; This file controls what Doom modules are enabled and what order they load in. ;; This file controls what Doom modules are enabled and what order they load
;; Remember to run 'doom sync' after modifying it! ;; 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 ;; 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 ;; documentation. There you'll find information about all of Doom's
;; and what flags they support. ;; modules and what flags they support.
;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or ;; 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 ;; 'C-c g k' for non-vim users) to view its documentation. This works on
@ -34,7 +34,7 @@
;;hydra ;;hydra
;;indent-guides ; highlighted indent columns ;;indent-guides ; highlighted indent columns
modeline ; snazzy, Atom-inspired modeline, plus API 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 ;;neotree ; a project drawer, like NERDTree for vim
ophints ; highlight the region an operation acts on ophints ; highlight the region an operation acts on
(popup +defaults) ; tame sudden yet inevitable temporary windows (popup +defaults) ; tame sudden yet inevitable temporary windows
@ -44,7 +44,7 @@
;;unicode ; extended unicode support for various languages ;;unicode ; extended unicode support for various languages
vc-gutter ; vcs diff in the fringe vc-gutter ; vcs diff in the fringe
vi-tilde-fringe ; fringe tildes to mark beyond EOB 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 workspaces ; tab emulation, persistence & separate workspaces
;;zen ; distraction-free coding or writing ;;zen ; distraction-free coding or writing
@ -104,14 +104,13 @@
:lang :lang
;;agda ; types of types of types of types... ;;agda ; types of types of types of types...
;;assembly ; assembly for fun or debugging
;;cc ; C/C++/Obj-C madness ;;cc ; C/C++/Obj-C madness
;;clojure ; java with a lisp ;;clojure ; java with a lisp
;;common-lisp ; if you've seen one lisp, you've seen them all ;;common-lisp ; if you've seen one lisp, you've seen them all
;;coq ; proofs-as-programs ;;coq ; proofs-as-programs
;;crystal ; ruby at the speed of c ;;crystal ; ruby at the speed of c
;;csharp ; unity, .NET, and mono shenanigans ;;csharp ; unity, .NET, and mono shenanigans
data ; config/data formats ;;data ; config/data formats
;;(dart +flutter) ; paint ui and not much else ;;(dart +flutter) ; paint ui and not much else
;;elixir ; erlang done right ;;elixir ; erlang done right
;;elm ; care for a cup of TEA? ;;elm ; care for a cup of TEA?
@ -121,10 +120,11 @@
;;faust ; dsp, but you get to keep your soul ;;faust ; dsp, but you get to keep your soul
;;fsharp ; ML stands for Microsoft's Language ;;fsharp ; ML stands for Microsoft's Language
;;fstar ; (dependent) types and (monadic) effects and Z3 ;;fstar ; (dependent) types and (monadic) effects and Z3
;;go ; the hipster dialect ;;(go +lsp) ; the hipster dialect
;;(haskell +dante) ; a language that's lazier than I am ;;(haskell +dante) ; a language that's lazier than I am
;;hy ; readability of scheme w/ speed of python ;;hy ; readability of scheme w/ speed of python
;;idris ; ;;idris ;
;;json ; At least it ain't XML
;;(java +meghanada) ; the poster child for carpal tunnel syndrome ;;(java +meghanada) ; the poster child for carpal tunnel syndrome
;;javascript ; all(hope(abandon(ye(who(enter(here)))))) ;;javascript ; all(hope(abandon(ye(who(enter(here))))))
;;julia ; a better, faster MATLAB ;;julia ; a better, faster MATLAB
@ -158,6 +158,7 @@
;;swift ; who asked for emoji variables? ;;swift ; who asked for emoji variables?
;;terra ; Earth and Moon in alignment for performance. ;;terra ; Earth and Moon in alignment for performance.
;;web ; the tubes ;;web ; the tubes
;;yaml ; JSON, but readable
:email :email
;;(mu4e +gmail) ;;(mu4e +gmail)

View file

@ -12,7 +12,12 @@
;; Check only when saving or opening files. Newline & idle checks are a mote ;; Check only when saving or opening files. Newline & idle checks are a mote
;; excessive and can catch code in an incomplete state, producing false ;; excessive and can catch code in an incomplete state, producing false
;; positives, so we removed them. ;; positives, so we removed them.
(setq flycheck-check-syntax-automatically '(save mode-enabled)) (setq flycheck-check-syntax-automatically '(save mode-enabled idle-buffer-switch))
;; For the above functionality, check syntax in a buffer that you switched to
;; only briefly. This allows "refreshing" the syntax check state for several
;; buffers quickly after e.g. changing a config file.
(setq flycheck-buffer-switch-check-intermediate-buffers t)
;; Display errors a little quicker (default is 0.9s) ;; Display errors a little quicker (default is 0.9s)
(setq flycheck-display-errors-delay 0.25) (setq flycheck-display-errors-delay 0.25)

View file

@ -101,14 +101,7 @@ be negative.")
:config :config
(set-popup-rule! "^\\*helm" :vslot -100 :size 0.22 :ttl nil) (set-popup-rule! "^\\*helm" :vslot -100 :size 0.22 :ttl nil)
;; HACK Doom doesn't support these commands, which invite the user to install ;; Hide the modeline in helm windows as it serves little purpose.
;; 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
(defun +helm--hide-mode-line (&rest _) (defun +helm--hide-mode-line (&rest _)
(with-current-buffer (helm-buffer-get) (with-current-buffer (helm-buffer-get)
(unless helm-mode-line-string (unless helm-mode-line-string

View file

@ -136,7 +136,7 @@ These keybindings are available while a search is active:
| =C-c C-o= | Open a buffer with your search results | | =C-c C-o= | Open a buffer with your search results |
| =C-c C-e= | Open a writable buffer of your search results | | =C-c C-e= | Open a writable buffer of your search results |
| =C-SPC= | Preview the current candidate | | =C-SPC= | Preview the current candidate |
| =M-RET= | Open the selected candidate in other-window | | =C-RET= | Open the selected candidate in other-window |
Changes to the resulting wgrep buffer (opened by =C-c C-e=) can be committed Changes to the resulting wgrep buffer (opened by =C-c C-e=) can be committed
with =C-c C-c= and aborted with =C-c C-k= (alternatively =ZZ= and =ZQ=, for evil with =C-c C-c= and aborted with =C-c C-k= (alternatively =ZZ= and =ZQ=, for evil

View file

@ -262,7 +262,10 @@ evil-ex-specific constructs, so we disable it solely in evil-ex."
(cond ((executable-find doom-projectile-fd-binary) (cond ((executable-find doom-projectile-fd-binary)
(cons doom-projectile-fd-binary (list "-t" "f" "-E" ".git"))) (cons doom-projectile-fd-binary (list "-t" "f" "-E" ".git")))
((executable-find "rg") ((executable-find "rg")
(split-string (format counsel-rg-base-command "--files --no-messages") " " t)) (append (list "rg" "--files" "--color=never" "--hidden" "--no-messages")
(cl-loop for dir in projectile-globally-ignored-directories
collect "--glob" and collect (concat "!" dir))
(if IS-WINDOWS (list "--path-separator" "/"))))
((cons find-program args))) ((cons find-program args)))
(unless (listp args) (unless (listp args)
(user-error "`counsel-file-jump-args' is a list now, please customize accordingly.")) (user-error "`counsel-file-jump-args' is a list now, please customize accordingly."))
@ -328,7 +331,9 @@ evil-ex-specific constructs, so we disable it solely in evil-ex."
;; posframe. ;; posframe.
(dolist (fn '(swiper counsel-rg counsel-grep counsel-git-grep)) (dolist (fn '(swiper counsel-rg counsel-grep counsel-git-grep))
(setf (alist-get fn ivy-posframe-display-functions-alist) (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 (use-package! flx

View file

@ -129,6 +129,12 @@
(cond ((featurep! :completion ivy) #'ivy-bibtex) (cond ((featurep! :completion ivy) #'ivy-bibtex)
((featurep! :completion helm) #'helm-bibtex))) ((featurep! :completion helm) #'helm-bibtex)))
:desc "Toggle org-clock" "c" #'+org/toggle-clock
:desc "Cancel org-clock" "C" #'org-clock-cancel
:desc "Open deft" "d" #'deft
(:when (featurep! :lang org +noter)
:desc "Org noter" "e" #'org-noter)
:desc "Find file in notes" "f" #'+default/find-in-notes :desc "Find file in notes" "f" #'+default/find-in-notes
:desc "Browse notes" "F" #'+default/browse-notes :desc "Browse notes" "F" #'+default/browse-notes
:desc "Org store link" "l" #'org-store-link :desc "Org store link" "l" #'org-store-link
@ -151,14 +157,14 @@
:desc "Switch to buffer" "b" #'org-roam-switch-to-buffer :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer
:desc "Org Roam Capture" "c" #'org-roam-capture :desc "Org Roam Capture" "c" #'org-roam-capture
:desc "Find file" "f" #'org-roam-find-file :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 "Insert" "i" #'org-roam-insert
:desc "Org Roam" "r" #'org-roam :desc "Org Roam" "r" #'org-roam
(:prefix ("d" . "by date") (:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-date :desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-today :desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-tomorrow :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-yesterday)))) :desc "Yesterday" "y" #'org-roam-dailies-yesterday))))
;;; <leader> o --- open ;;; <leader> o --- open
"o" nil ; we need to unbind it first as Org claims this prefix "o" nil ; we need to unbind it first as Org claims this prefix
@ -535,14 +541,4 @@
;;; treemacs ;;; treemacs
(:when (featurep! :ui treemacs) (:when (featurep! :ui treemacs)
"<f9>" #'+treemacs/toggle "<f9>" #'+treemacs/toggle
"<C-f9>" #'+treemacs/find-file) "<C-f9>" #'+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
"<S-tab>" #'yas-prev-field
"<M-backspace>" #'+snippets/delete-to-start-of-field
[backspace] #'+snippets/delete-backward-char
[delete] #'+snippets/delete-forward-char-or-field))

View file

@ -4,9 +4,12 @@
;; NOTE SPC u replaces C-u as the universal argument. ;; NOTE SPC u replaces C-u as the universal argument.
;; Minibuffer ;; 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-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 (define-key! :keymaps +default-minibuffer-maps
[escape] #'abort-recursive-edit [escape] #'abort-recursive-edit
@ -15,16 +18,17 @@
"C-u" #'evil-delete-back-to-indentation "C-u" #'evil-delete-back-to-indentation
"C-v" #'yank "C-v" #'yank
"C-w" #'doom/delete-backward-word "C-w" #'doom/delete-backward-word
"C-z" (λ! (ignore-errors (call-interactively #'undo))) "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)
(define-key! read-expression-map (when (featurep! :editor evil +everywhere)
"C-j" #'next-line-or-history-element (define-key! :keymaps +default-minibuffer-maps
"C-k" #'previous-line-or-history-element)) "C-j" #'next-line
"C-k" #'previous-line
"C-S-j" #'scroll-up-command
"C-S-k" #'scroll-down-command)
(define-key! read-expression-map
"C-j" #'next-line-or-history-element
"C-k" #'previous-line-or-history-element)))
;; ;;
@ -186,9 +190,9 @@
;;; :ui ;;; :ui
(map! (:when (featurep! :ui popup) (map! (:when (featurep! :ui popup)
:n "C-`" #'+popup/toggle "C-`" #'+popup/toggle
:n "C-~" #'+popup/raise "C-~" #'+popup/raise
:g "C-x p" #'+popup/other) "C-x p" #'+popup/other)
(:when (featurep! :ui workspaces) (:when (featurep! :ui workspaces)
:n "C-t" #'+workspace/new :n "C-t" #'+workspace/new
@ -464,11 +468,15 @@
:desc "Toggle org-clock" "c" #'+org/toggle-clock :desc "Toggle org-clock" "c" #'+org/toggle-clock
:desc "Cancel org-clock" "C" #'org-clock-cancel :desc "Cancel org-clock" "C" #'org-clock-cancel
:desc "Open deft" "d" #'deft :desc "Open deft" "d" #'deft
(:when (featurep! :lang org +noter)
:desc "Org noter" "e" #'org-noter)
:desc "Find file in notes" "f" #'+default/find-in-notes :desc "Find file in notes" "f" #'+default/find-in-notes
:desc "Browse notes" "F" #'+default/browse-notes :desc "Browse notes" "F" #'+default/browse-notes
:desc "Org store link" "l" #'org-store-link :desc "Org store link" "l" #'org-store-link
:desc "Tags search" "m" #'org-tags-view :desc "Tags search" "m" #'org-tags-view
:desc "Org capture" "n" #'org-capture :desc "Org capture" "n" #'org-capture
:desc "Goto capture" "N" #'org-capture-goto-target
:desc "Active org-clock" "o" #'org-clock-goto :desc "Active org-clock" "o" #'org-clock-goto
:desc "Todo list" "t" #'org-todo-list :desc "Todo list" "t" #'org-todo-list
:desc "Search notes" "s" #'+default/org-notes-search :desc "Search notes" "s" #'+default/org-notes-search
@ -482,14 +490,14 @@
:desc "Switch to buffer" "b" #'org-roam-switch-to-buffer :desc "Switch to buffer" "b" #'org-roam-switch-to-buffer
:desc "Org Roam Capture" "c" #'org-roam-capture :desc "Org Roam Capture" "c" #'org-roam-capture
:desc "Find file" "f" #'org-roam-find-file :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 "Insert" "i" #'org-roam-insert
:desc "Org Roam" "r" #'org-roam :desc "Org Roam" "r" #'org-roam
(:prefix ("d" . "by date") (:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-date :desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-today :desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-tomorrow :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-yesterday))) :desc "Yesterday" "y" #'org-roam-dailies-yesterday)))
(:when (featurep! :lang org +journal) (:when (featurep! :lang org +journal)
(:prefix ("j" . "journal") (:prefix ("j" . "journal")

View file

@ -27,11 +27,15 @@
;;;###autoload ;;;###autoload
(defun +default/browse-notes () (defun +default/browse-notes ()
"Browse files from `org-directory'." "Browse files from `org-directory'."
(interactive) (doom-project-browse org-directory)) (interactive)
(require 'org)
(doom-project-browse org-directory))
;;;###autoload ;;;###autoload
(defun +default/find-in-notes () (defun +default/find-in-notes ()
"Find a file under `org-directory', recursively." "Find a file under `org-directory', recursively."
(interactive) (doom-project-find-file org-directory)) (interactive)
(require 'org)
(doom-project-find-file org-directory))
;;;###autoload ;;;###autoload
(defun +default/find-file-under-here () (defun +default/find-file-under-here ()

View file

@ -31,7 +31,10 @@
(after! epa (after! epa
;; With GPG 2.1+, this forces gpg-agent to use the Emacs minibuffer to prompt ;; With GPG 2.1+, this forces gpg-agent to use the Emacs minibuffer to prompt
;; for the key passphrase. ;; 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. ;; Default to the first secret key available in your keyring.
(setq-default (setq-default
epa-file-encrypt-to epa-file-encrypt-to

View file

@ -47,9 +47,9 @@
(evil-ex-define-cmd "k[ill]m" #'+evil:kill-matching-buffers) (evil-ex-define-cmd "k[ill]m" #'+evil:kill-matching-buffers)
(evil-ex-define-cmd "k[ill]o" #'doom/kill-other-buffers) (evil-ex-define-cmd "k[ill]o" #'doom/kill-other-buffers)
(evil-ex-define-cmd "k[ill]b" #'doom/kill-buried-buffers) (evil-ex-define-cmd "k[ill]b" #'doom/kill-buried-buffers)
(evil-ex-define-cmd "l[ast]" #'doom/popup-restore) (evil-ex-define-cmd "l[ast]" #'+popup/restore)
(evil-ex-define-cmd "messages" #'view-echo-area-messages) (evil-ex-define-cmd "messages" #'view-echo-area-messages)
(evil-ex-define-cmd "pop[up]" #'doom/popup-this-buffer) (evil-ex-define-cmd "pop[up]" #'+popup/buffer)
;;; Project navigation ;;; Project navigation
(evil-ex-define-cmd "a" #'projectile-find-other-file) (evil-ex-define-cmd "a" #'projectile-find-other-file)
@ -98,4 +98,8 @@
(evil-ex-define-cmd "tabsave" #'+workspace:save) (evil-ex-define-cmd "tabsave" #'+workspace:save)
;;; Org-mode ;;; Org-mode
(evil-ex-define-cmd "cap" #'org-capture) (evil-ex-define-cmd "cap[ture]" #'org-capture)
;;; ibuffer
(when (featurep! :emacs ibuffer)
(evil-ex-define-cmd "buffers" #'ibuffer))

View file

@ -71,6 +71,7 @@ The following vim plugins have been ported to evil:
| vim-lion | evil-lion | omap =gl= / =gL= | | vim-lion | evil-lion | omap =gl= / =gL= |
| vim-seek or vim-sneak | evil-snipe | mmap =s= / =S=, omap =z= / =Z= & =x= / =X= | | 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-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. This module has also ported vim-unimpaired keybinds to Emacs.

View file

@ -7,7 +7,7 @@
(call-interactively #'doom/escape))) (call-interactively #'doom/escape)))
;;;###autoload ;;;###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 "Take a path and resolve any vim-like filename modifiers in it. This adds
support for most vim file modifiers, as well as: 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 See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for
more information on modifiers." more information on modifiers."
(let (case-fold-search) (let ((origin-buffer (current-buffer))
case-fold-search)
(with-temp-buffer (with-temp-buffer
(save-excursion (insert file-name)) (let ((buffer-file-name (buffer-file-name origin-buffer)))
(while (re-search-forward "\\(^\\|[^\\\\]\\)\\(\\([%#]\\)\\(:\\([PphtreS~.]\\|g?s\\)\\)*\\)" nil t) (save-excursion (insert file-name))
(catch 'continue (while (re-search-forward "\\(^\\|[^\\\\]\\)\\(\\([%#]\\)\\(:\\([PphtreS~.]\\|g?s\\)\\)*\\)" nil t)
(unless buffer-file-name (if (null buffer-file-name)
(replace-match (match-string 1) t t nil 2) (replace-match (match-string 1) t t nil 2)
(throw 'continue t)) (let ((beg (match-beginning 2))
(let ((beg (match-beginning 2)) (end (match-end 3))
(end (match-end 3)) (path (pcase (match-string 3)
(path (pcase (match-string 3) ("%" (file-relative-name buffer-file-name default-directory))
("%" (file-relative-name buffer-file-name)) ("#" (and (other-buffer origin-buffer)
("#" (and (other-buffer) (buffer-file-name (other-buffer origin-buffer)))))))
(buffer-file-name (other-buffer))))))) (save-match-data
(save-match-data (goto-char beg)
(goto-char beg) (while (re-search-forward ":\\([PphtreS~.]\\|g?s\\)" (+ (point) 3) t)
(while (re-search-forward ":\\([PphtreS~.]\\|g?s\\)" (+ (point) 3) t) (let* ((modifier (match-string 1))
(let* ((modifier (match-string 1)) (global (string-prefix-p "gs" modifier)))
(global (string-prefix-p "gs" modifier))) (when global
(when global (setq modifier (substring modifier 1)))
(setq modifier (substring modifier 1))) (setq end (match-end 1)
(setq end (match-end 1) path
path (pcase (and path (substring modifier 0 1))
(or (when path (`nil "")
(pcase (substring modifier 0 1) ("p" (expand-file-name path))
("p" (expand-file-name path)) ("~" (concat "~/" (file-relative-name path "~")))
("~" (concat "~/" (file-relative-name path "~"))) ("." (file-relative-name path))
("." (file-relative-name path default-directory)) ("t" (file-name-nondirectory (directory-file-name path)))
("t" (file-name-nondirectory (directory-file-name path))) ("r" (file-name-sans-extension path))
("r" (file-name-sans-extension path)) ("e" (file-name-extension path))
("e" (file-name-extension path)) ("S" (shell-quote-argument path))
("S" (shell-quote-argument path)) ("h"
("h" (let ((parent (file-name-directory (expand-file-name path))))
(let ((parent (file-name-directory (expand-file-name path)))) (unless (file-equal-p path parent)
(unless (file-equal-p path parent) (if (file-name-absolute-p path)
(if (file-name-absolute-p path) (directory-file-name parent)
(directory-file-name parent) (file-relative-name parent)))))
(file-relative-name parent))))) ("s"
("s" (if (featurep 'evil)
(if (featurep 'evil) (when-let (args (evil-delimited-arguments (substring modifier 1) 2))
(when-let (args (evil-delimited-arguments (substring modifier 1) 2)) (let ((pattern (evil-transform-vim-style-regexp (car args)))
(let ((pattern (evil-transform-vim-style-regexp (car args))) (replace (cadr args)))
(replace (cadr args))) (replace-regexp-in-string
(replace-regexp-in-string (if global pattern (concat "\\(" pattern "\\).*\\'"))
(if global pattern (concat "\\(" pattern "\\).*\\'")) (evil-transform-vim-style-regexp replace) path t t
(evil-transform-vim-style-regexp replace) path t t (unless global 1))))
(unless global 1)))) path))
path)) ("P"
("P" (let ((project-root (doom-project-root (file-name-directory (expand-file-name path)))))
(let ((project-root (doom-project-root (file-name-directory (expand-file-name path))))) (unless project-root
(unless project-root (user-error "Not in a project"))
(user-error "Not in a project")) (abbreviate-file-name project-root)))))
(abbreviate-file-name project-root))))) ;; strip trailing slash, if applicable
"")) (or (string-empty-p path)
;; strip trailing slash, if applicable (not (equal (substring path -1) "/"))
(or (string-empty-p path) (setq path (substring path 0 -1))))))
(not (equal (substring path -1) "/")) (replace-match path t t nil 2))))
(setq path (substring path 0 -1)))))) (replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" (buffer-string) t)))))
(replace-match path t t nil 2))))
(replace-regexp-in-string "\\\\\\([#%]\\)" "\\1" (buffer-string) t))))
(defun +evil--insert-newline (&optional above _noextranewline) (defun +evil--insert-newline (&optional above _noextranewline)
(let ((pos (save-excursion (beginning-of-line-text) (point))) (let ((pos (save-excursion (beginning-of-line-text) (point)))

View file

@ -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 is non-nil, open compilation output in a comint buffer.
If BANG, then run ARGUMENTS as a full command. This command understands vim file 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 "<sh><!>") (interactive "<sh><!>")
(let ((compile-command "make")) (let ((compile-command "make"))
(+evil:compile (if (stringp arguments) (+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. If BANG is non-nil, open compilation output in a comint buffer.
This command understands vim file modifiers (like %:p:h). See 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 "<sh><!>") (interactive "<sh><!>")
(compile (evil-ex-replace-special-filenames (compile (evil-ex-replace-special-filenames
(format "%s %s" (format "%s %s"

View file

@ -6,8 +6,7 @@
kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)."
:repeat nil :repeat nil
(interactive "<f><!>") (interactive "<f><!>")
(doom/delete-this-file (or filename (file-truename buffer-file-name)) (doom/delete-this-file filename force-p))
force-p))
;;;###autoload (autoload '+evil:move-this-file "editor/evil/autoload/files" nil t) ;;;###autoload (autoload '+evil:move-this-file "editor/evil/autoload/files" nil t)
(evil-define-command +evil:move-this-file (new-path &optional force-p) (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)) (when (or (not new-path) (string-empty-p new-path))
(user-error "No new path was specified")) (user-error "No new path was specified"))
(doom/copy-this-file new-path force-p)) (doom/copy-this-file new-path force-p))

View file

@ -144,13 +144,22 @@ directives. By default, this only recognizes C directives.")
(when (eq major-mode 'fundamental-mode) (when (eq major-mode 'fundamental-mode)
(hack-local-variables))) (hack-local-variables)))
;; HACK Invoking helpful from evil-ex throws a "No recursive edit is in
;; progress" error because, between evil-ex and helpful,
;; `abort-recursive-edit' gets called one time too many.
(defadvice! +evil--fix-helpful-key-in-evil-ex-a (key-sequence)
:before #'helpful-key
(when (evil-ex-p)
(run-at-time 0.1 nil #'helpful-key key-sequence)
(abort-recursive-edit)))
;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'.
(advice-add #'evil-force-normal-state :after #'+evil-escape-a) (advice-add #'evil-force-normal-state :after #'+evil-escape-a)
;; monkey patch `evil-ex-replace-special-filenames' to improve support for ;; 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, ;; file modifiers like %:p:h. This adds support for most of vim's modifiers,
;; and one custom one: %:P (expand to the project root). ;; 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 ;; make `try-expand-dabbrev' (from `hippie-expand') work in minibuffer
(add-hook 'minibuffer-inactive-mode-hook #'+evil--fix-dabbrev-in-minibuffer-h) (add-hook 'minibuffer-inactive-mode-hook #'+evil--fix-dabbrev-in-minibuffer-h)

View file

@ -258,6 +258,9 @@ and complains if a module is loaded too early (during startup)."
(+evil-collection-init 'elisp-mode)) (+evil-collection-init 'elisp-mode))
(add-transient-hook! 'occur-mode (add-transient-hook! 'occur-mode
(+evil-collection-init '(occur replace))) (+evil-collection-init '(occur replace)))
(add-transient-hook! 'minibuffer-setup-hook
(when evil-collection-setup-minibuffer
(+evil-collection-init 'minibuffer)))
;; HACK Do this ourselves because evil-collection break's `eval-after-load' ;; HACK Do this ourselves because evil-collection break's `eval-after-load'
;; load order by loading their target plugin before applying keys. This ;; load order by loading their target plugin before applying keys. This

View file

@ -9,10 +9,10 @@
(load! "../autoload/evil") (load! "../autoload/evil")
(before-each (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))) (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" (describe "file modifiers"
(it "supports basic vim file modifiers" (it "supports basic vim file modifiers"
(let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el")

View file

@ -7,7 +7,7 @@
(match-string 2 buffer-file-name)) (match-string 2 buffer-file-name))
"")`} "")`}
#+DATE: `(format (format-time-string "%B %%s, %Y") (string-to-number (format-time-string "%d")))` #+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:<replace with next tagged release version>}
#+STARTUP: inlineimages nofold #+STARTUP: inlineimages nofold
* Table of Contents :TOC_3:noexport: * Table of Contents :TOC_3:noexport:

View file

@ -5,7 +5,7 @@
;; ;;
;; Packages ;;; Packages
(use-package! yasnippet (use-package! yasnippet
:defer-incrementally eldoc easymenu help-mode :defer-incrementally eldoc easymenu help-mode
@ -20,9 +20,11 @@
;; Remove default ~/.emacs.d/snippets ;; Remove default ~/.emacs.d/snippets
(defvar yas-snippet-dirs nil) (defvar yas-snippet-dirs nil)
;; Ensure `yas-reload-all' is called as late as possible. Other modules could (unless (daemonp)
;; have additional configuration for yasnippet. For example, file-templates. ;; Ensure `yas-reload-all' is called as late as possible. Other modules
(add-transient-hook! 'yas-minor-mode-hook (yas-reload-all)) ;; could have additional configuration for yasnippet. For example,
;; file-templates.
(add-transient-hook! 'yas-minor-mode-hook (yas-reload-all)))
(add-hook! '(text-mode-hook (add-hook! '(text-mode-hook
prog-mode-hook prog-mode-hook
@ -31,24 +33,28 @@
#'yas-minor-mode-on) #'yas-minor-mode-on)
:config :config
(setq yas-verbosity (if doom-debug-mode 3 0)
yas-also-auto-indent-first-line t)
(add-to-list 'load-path +snippets-dir)
;; default snippets library, if available
(require 'doom-snippets nil t)
;; Allow private snippets in DOOMDIR/snippets ;; Allow private snippets in DOOMDIR/snippets
(add-to-list 'yas-snippet-dirs '+snippets-dir) (add-to-list 'yas-snippet-dirs '+snippets-dir)
;; In case `+snippets-dir' and `doom-snippets-dir' are the same ;; Reduce verbosity. 3 is too chatty about initializing yasnippet. 2 is just
;; right (only shows errors).
(setq yas-verbosity (if doom-debug-mode 3 0))
;; Ensure the snippet is properly indented
(setq yas-also-auto-indent-first-line t)
;; default snippets library, if available
(add-to-list 'load-path +snippets-dir)
(require 'doom-snippets nil t)
;; HACK In case `+snippets-dir' and `doom-snippets-dir' are the same, or
;; duplicates exist in `yas-snippet-dirs'.
(advice-add #'yas-snippet-dirs :filter-return #'delete-dups) (advice-add #'yas-snippet-dirs :filter-return #'delete-dups)
;; Remove GUI dropdown prompt (prefer ivy/helm) ;; Remove GUI dropdown prompt (prefer ivy/helm)
(delq! 'yas-dropdown-prompt yas-prompt-functions) (delq! 'yas-dropdown-prompt yas-prompt-functions)
;; Prioritize private snippets in `+snippets-dir' over built-in ones if there ;; Prioritize private snippets in `+snippets-dir' over built-in ones if there
;; are multiple choices. ;; are multiple choices.
(add-to-list 'yas-prompt-functions #'+snippets-prompt-private nil #'eq) (add-to-list 'yas-prompt-functions #'+snippets-prompt-private)
;; Register `def-project-mode!' modes with yasnippet. This enables project ;; Register `def-project-mode!' modes with yasnippet. This enables project
;; specific snippet libraries (e.g. for Laravel, React or Jekyll projects). ;; specific snippet libraries (e.g. for Laravel, React or Jekyll projects).
@ -61,22 +67,14 @@
;; tell smartparens overlays not to interfere with yasnippet keybinds ;; tell smartparens overlays not to interfere with yasnippet keybinds
(advice-add #'yas-expand :before #'sp-remove-active-pair-overlay)) (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay))
;; Enable `read-only-mode' for built-in snippets (in `doom-local-dir')
(add-hook 'snippet-mode-hook #'+snippets-read-only-maybe-h)
;; (Evil only) fix off-by-one issue with line-wise visual selections in ;; (Evil only) fix off-by-one issue with line-wise visual selections in
;; `yas-insert-snippet', and switches to insert mode afterwards. ;; `yas-insert-snippet', and switches to insert mode afterwards.
(advice-add #'yas-insert-snippet :around #'+snippets-expand-on-region-a) (advice-add #'yas-insert-snippet :around #'+snippets-expand-on-region-a)
(define-key! snippet-mode-map ;; Show keybind hints in snippet header-line
"C-c C-k" #'+snippet--abort
"C-c C-e" #'+snippet--edit)
(add-hook 'snippet-mode-hook #'+snippets-show-hints-in-header-line-h) (add-hook 'snippet-mode-hook #'+snippets-show-hints-in-header-line-h)
;; Enable `read-only-mode' for built-in snippets (in `doom-local-dir')
;; Replace commands with superior alternatives (add-hook 'snippet-mode-hook #'+snippets-read-only-maybe-h)
(define-key! yas-minor-mode-map
[remap yas-new-snippet] #'+snippets/new
[remap yas-visit-snippet-file] #'+snippets/edit)
(map! :map yas-keymap (map! :map yas-keymap
"C-e" #'+snippets/goto-end-of-field "C-e" #'+snippets/goto-end-of-field
@ -85,7 +83,14 @@
[M-left] #'+snippets/goto-start-of-field [M-left] #'+snippets/goto-start-of-field
[M-backspace] #'+snippets/delete-to-start-of-field [M-backspace] #'+snippets/delete-to-start-of-field
[backspace] #'+snippets/delete-backward-char [backspace] #'+snippets/delete-backward-char
[delete] #'+snippets/delete-forward-char-or-field)) [delete] #'+snippets/delete-forward-char-or-field
;; Replace commands with superior alternatives
:map yas-minor-mode-map
[remap yas-new-snippet] #'+snippets/new
[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 (use-package! auto-yasnippet

View file

@ -1,10 +1,10 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; editor/snippets/packages.el ;;; editor/snippets/packages.el
(package! yasnippet :pin "ac03c2f192") (package! yasnippet :pin "5b1217ab08")
(package! auto-yasnippet :pin "db9e0dd433") (package! auto-yasnippet :pin "db9e0dd433")
(package! doom-snippets (package! doom-snippets
:recipe (:host github :recipe (:host github
:repo "hlissner/doom-snippets" :repo "hlissner/doom-snippets"
:files ("*.el" "*")) :files ("*.el" "*"))
:pin "2a0c3cf901") :pin "feaedeb550")

View file

@ -12,13 +12,15 @@
- [[#arch-linux][Arch Linux]] - [[#arch-linux][Arch Linux]]
- [[#nixos][NixOS]] - [[#nixos][NixOS]]
- [[#opensuse][openSUSE]] - [[#opensuse][openSUSE]]
- [[Debian/Ubuntu]] - [[#debianubuntu][Debian/Ubuntu]]
- [[#features][Features]] - [[#features][Features]]
- [[#configuration][Configuration]] - [[#configuration][Configuration]]
- [[#offlineimap][offlineimap]] - [[#offlineimap][offlineimap]]
- [[#mbsync][mbsync]] - [[#mbsync][mbsync]]
- [[#mu-and-mu4e][mu and mu4e]]
- [[#troubleshooting][Troubleshooting]] - [[#troubleshooting][Troubleshooting]]
- [[#no-such-file-or-directory-mu4e][=No such file or directory, mu4e=]] - [[#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]]
* Description * Description
This module makes Emacs an email client, using ~mu4e~. This module makes Emacs an email client, using ~mu4e~.
@ -36,13 +38,13 @@ via IMAP) and ~mu~ (to index my mail into a format ~mu4e~ can understand).
+ ~+gmail~ Enables gmail-specific configuration. + ~+gmail~ Enables gmail-specific configuration.
** Plugins ** Plugins
+ [[https://github.com/agpchil/mu4e-maildirs-extension][mu4e-maildirs-extension]] This module install no plugins.
* Prerequisites * Prerequisites
This module requires: This module requires:
+ Either ~mbsync~ (default) or ~offlineimap~ (to sync mail with) + 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 ** MacOS
#+BEGIN_SRC sh #+BEGIN_SRC sh
@ -104,20 +106,53 @@ sudo apt-get install maildir-utils # mu
* Configuration * Configuration
** offlineimap ** 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 #+BEGIN_SRC emacs-lisp
(setq +mu4e-backend 'offlineimap) (setq +mu4e-backend 'offlineimap)
#+END_SRC #+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 Next you can download your email with ~offlineimap -o~. This may take a while,
is configured to download mail to ~\~/.mail~. I use [[https://www.passwordstore.org/][unix pass]] to securely especially if you have thousands of mails.
store my login credentials. You can find a *very* detailed configuration
[[https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf][here]]. You can now proceed with the [[*mu and mu4e][mu and mu4e]] section.
2. Download your email: ~offlineimap -o~ (may take a while)
3. Index it with mu: ~mu index --maildir ~/.mail~ ** 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: Then configure Emacs to use your email address:
@ -129,13 +164,20 @@ Then configure Emacs to use your email address:
(mu4e-trash-folder . "/Lissner.net/Trash") (mu4e-trash-folder . "/Lissner.net/Trash")
(mu4e-refile-folder . "/Lissner.net/All Mail") (mu4e-refile-folder . "/Lissner.net/All Mail")
(smtpmail-smtp-user . "henrik@lissner.net") (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")) (mu4e-compose-signature . "---\nHenrik Lissner"))
t) t)
#+END_SRC #+END_SRC
** TODO mbsync
* Troubleshooting * Troubleshooting
** =No such file or directory, mu4e= ** =No such file or directory, mu4e=
You will get =No such file or directory, mu4e= errors if you don't run ~doom You will get =No such file or directory, mu4e= errors if you don't run ~doom
sync~ after installing =mu= through your package manager. sync~ after installing =mu= through your package manager.
** ~(void-function org-time-add)~ error on Gentoo
Gentoo users will see this error because [[https://gitweb.gentoo.org/repo/gentoo.git/tree/net-mail/mu/files/70mu-gentoo.el#n2][the =net-mail/mu= package eagerly loads
=mu4e= (which pulls in =org=) much too early]]; before Emacs reads =~/.emacs.d=.
So early, that it loads the built-in version of org-mode, rather than the newer
version that Doom installs.
Later versions of the =net-mail/mu= package have [[https://gitweb.gentoo.org/repo/gentoo.git/commit/net-mail/mu?id=770e1fccb119fbce8ba6d16021a3598123f212ff][fixed this issue]], but you may
need to switch to the unstable build of =net-mail/mu= to see it.

View file

@ -6,7 +6,7 @@
list of cons cells (VARIABLE . VALUE) -- you may want to modify: list of cons cells (VARIABLE . VALUE) -- you may want to modify:
+ `user-full-name' (this or the global `user-full-name' is required) + `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) + `smtpmail-smtp-user' (required for sending mail from Emacs)
OPTIONAL: OPTIONAL:
@ -19,8 +19,9 @@ OPTIONAL:
DEFAULT-P is a boolean. If non-nil, it marks that email account as the DEFAULT-P is a boolean. If non-nil, it marks that email account as the
default/fallback account." default/fallback account."
(after! mu4e (after! mu4e
(when-let (address (cdr (assq 'user-mail-address letvars))) (when (version< mu4e-mu-version "1.4")
(add-to-list 'mu4e-user-mail-address-list address)) (when-let (address (cdr (assq 'user-mail-address letvars)))
(add-to-list 'mu4e-user-mail-address-list address)))
(setq mu4e-contexts (setq mu4e-contexts
(cl-loop for context in mu4e-contexts (cl-loop for context in mu4e-contexts
unless (string= (mu4e-context-name context) label) unless (string= (mu4e-context-name context) label)

View file

@ -14,9 +14,11 @@
:commands mu4e mu4e-compose-new :commands mu4e mu4e-compose-new
:init :init
(provide 'html2text) ; disable obsolete package (provide 'html2text) ; disable obsolete package
(setq mu4e-maildir "~/.mail" (when (or (not (require 'mu4e-meta nil t))
mu4e-attachment-dir "~/.mail/.attachments" (version< mu4e-mu-version "1.4"))
mu4e-user-mail-address-list nil) (setq mu4e-maildir "~/.mail"
mu4e-user-mail-address-list nil))
(setq mu4e-attachment-dir "~/.mail/.attachments")
:config :config
(pcase +mu4e-backend (pcase +mu4e-backend
(`mbsync (`mbsync
@ -104,13 +106,13 @@
(use-package! org-mu4e (use-package! org-mu4e
:hook (mu4e-compose-mode . org-mu4e-compose-org-mode) :hook (mu4e-compose-mode . org-mu4e-compose-org-mode)
:config :config
(setq org-mu4e-link-query-in-headers-mode nil (setq org-mu4e-convert-to-html t)
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, ;; Only render to html once. If the first send fails for whatever reason,
;; org-mu4e would do so each time you try again. ;; org-mu4e would do so each time you try again.
(add-hook! 'message-send-hook (setq-hook! 'message-send-hook org-mu4e-convert-to-html nil))
(setq-local org-mu4e-convert-to-html nil)))
;; ;;

View file

@ -2,9 +2,10 @@
(use-package! pyim (use-package! pyim
:after-call after-find-file pre-command-hook :after-call after-find-file pre-command-hook
:init
(setq pyim-dcache-directory (concat doom-cache-dir "pyim/"))
:config :config
(setq pyim-dcache-directory (concat doom-cache-dir "pyim/") (setq pyim-page-tooltip t
pyim-page-tooltip t
default-input-method "pyim")) default-input-method "pyim"))

View file

@ -1,4 +0,0 @@
;;; lang/assembly/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.hax\\'" . haxor-mode))

View file

@ -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")

View file

@ -11,21 +11,22 @@
;; ;;
;;; Packages ;;; Packages
;;;###package clojure-mode (use-package! clojure-mode
(add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) :hook (clojure-mode . rainbow-delimiters-mode)
(when (featurep! +lsp) :config
(add-hook! '(clojure-mode-local-vars-hook (when (featurep! +lsp)
clojurec-mode-local-vars-hook (add-hook! '(clojure-mode-local-vars-hook
clojurescript-mode-local-vars-hook) clojurec-mode-local-vars-hook
(defun +clojure-disable-lsp-indentation-h () clojurescript-mode-local-vars-hook)
(setq-local lsp-enable-indentation nil)) (defun +clojure-disable-lsp-indentation-h ()
#'lsp!) (setq-local lsp-enable-indentation nil))
(after! lsp-clojure #'lsp!)
(dolist (m '(clojure-mode (after! lsp-clojure
clojurec-mode (dolist (m '(clojure-mode
clojurescript-mode clojurec-mode
clojurex-mode)) clojurescript-mode
(add-to-list 'lsp-language-id-configuration (cons m "clojure"))))) clojurex-mode))
(add-to-list 'lsp-language-id-configuration (cons m "clojure"))))))
(use-package! cider (use-package! cider
@ -58,13 +59,18 @@
cider-repl-history-quit-action 'delete-and-restore cider-repl-history-quit-action 'delete-and-restore
cider-repl-history-highlight-inserted-item t cider-repl-history-highlight-inserted-item t
cider-repl-history-size 1000 cider-repl-history-size 1000
cider-repl-pop-to-buffer-on-connect 'display-only
cider-repl-result-prefix ";; => " cider-repl-result-prefix ";; => "
cider-repl-print-length 100 cider-repl-print-length 100
cider-repl-use-clojure-font-lock t cider-repl-use-clojure-font-lock t
cider-repl-use-pretty-printing t cider-repl-use-pretty-printing t
cider-repl-wrap-history nil 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* ;; 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 ;; rather than the *cider-repl* buffer. How silly. We might want to see that
@ -90,6 +96,8 @@
"\"" #'cider-jack-in-cljs "\"" #'cider-jack-in-cljs
"c" #'cider-connect-clj "c" #'cider-connect-clj
"C" #'cider-connect-cljs "C" #'cider-connect-cljs
"m" #'cider-macroexpand-1
"M" #'cider-macroexpand-all
(:prefix ("e" . "eval") (:prefix ("e" . "eval")
"b" #'cider-eval-buffer "b" #'cider-eval-buffer
"d" #'cider-eval-defun-at-point "d" #'cider-eval-defun-at-point
@ -114,9 +122,6 @@
"e" #'cider-enlighten-mode "e" #'cider-enlighten-mode
"i" #'cider-inspect "i" #'cider-inspect
"r" #'cider-inspect-last-result) "r" #'cider-inspect-last-result)
(:prefix ("m" . "macro")
"e" #'cider-macroexpand-1
"E" #'cider-macroexpand-all)
(:prefix ("n" . "namespace") (:prefix ("n" . "namespace")
"n" #'cider-browse-ns "n" #'cider-browse-ns
"N" #'cider-browse-ns-all "N" #'cider-browse-ns-all

View file

@ -4,8 +4,8 @@
(package! dart-mode :pin "04fcd649f1") (package! dart-mode :pin "04fcd649f1")
(when (featurep! +lsp) (when (featurep! +lsp)
(package! lsp-dart :pin "064d47bad3")) (package! lsp-dart :pin "4cd73b77f4"))
(when (featurep! +flutter) (when (featurep! +flutter)
(package! flutter :pin "ec92a4df84") (package! flutter :pin "293b7225b9")
(package! hover :pin "6f9ed1a651")) (package! hover :pin "6f9ed1a651"))

View file

@ -1,9 +1,5 @@
;;; lang/data/config.el -*- lexical-binding: t; -*- ;;; 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 (use-package! nxml-mode
:mode "\\.p\\(?:list\\|om\\)\\'" ; plist, pom :mode "\\.p\\(?:list\\|om\\)\\'" ; plist, pom
:mode "\\.xs\\(?:d\\|lt\\)\\'" ; xslt, xsd :mode "\\.xs\\(?:d\\|lt\\)\\'" ; xslt, xsd
@ -16,9 +12,6 @@
(setq-hook! 'nxml-mode-hook tab-width nxml-child-indent)) (setq-hook! 'nxml-mode-hook tab-width nxml-child-indent))
;;
;;; Third-party plugins
;;;###package csv-mode ;;;###package csv-mode
(map! :after csv-mode (map! :after csv-mode
:localleader :localleader
@ -29,25 +22,3 @@
"S" #'csv-sort-numeric-fields "S" #'csv-sort-numeric-fields
"k" #'csv-kill-fields "k" #'csv-kill-fields
"t" #'csv-transpose) "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"))

View file

@ -1,12 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/data/packages.el ;;; 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! csv-mode :pin "635337407c")
(package! dhall-mode :pin "ef4d33debe")
(package! protobuf-mode
:recipe (:host github :repo "emacsmirror/protobuf-mode" :files (:defaults "*"))
:pin "94b7bd7e8b")

View file

@ -1,12 +1,10 @@
;;; lang/elm/config.el -*- lexical-binding: t; -*- ;;; lang/elm/config.el -*- lexical-binding: t; -*-
(after! elm-mode (after! elm-mode
(add-hook 'elm-mode-hook #'rainbow-delimiters-mode) (if (featurep! +lsp)
(add-hook 'elm-mode-local-vars-hook #'lsp!)
(when (featurep! +lsp) (set-company-backend! 'elm-mode 'company-elm))
(add-hook 'elm-mode-local-vars-hook #'lsp!))
(set-company-backend! 'elm-mode 'company-elm)
(set-repl-handler! 'elm-mode #'run-elm-interactive) (set-repl-handler! 'elm-mode #'run-elm-interactive)
(set-pretty-symbols! 'elm-mode (set-pretty-symbols! 'elm-mode
:null "null" :null "null"
@ -22,4 +20,4 @@
(use-package! flycheck-elm (use-package! flycheck-elm
:when (featurep! :checkers syntax) :when (featurep! :checkers syntax)
:after elm-mode :after elm-mode
:config (add-to-list 'flycheck-checkers 'elm nil #'eq)) :config (add-to-list 'flycheck-checkers 'elm))

View file

@ -1,6 +1,6 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/elm/packages.el ;;; lang/elm/packages.el
(package! elm-mode :pin "dd868e55ff") (package! elm-mode :pin "7782be0814")
(when (featurep! :checkers syntax) (when (featurep! :checkers syntax)
(package! flycheck-elm :pin "debd0af563")) (package! flycheck-elm :pin "1b60050efd"))

View file

@ -4,12 +4,14 @@
(package! elisp-mode :built-in t) (package! elisp-mode :built-in t)
(package! highlight-quoted :pin "2410347815") (package! highlight-quoted :pin "2410347815")
;; Tools
(package! macrostep :pin "424e3734a1") (package! macrostep :pin "424e3734a1")
(package! overseer :pin "02d49f582e") (package! overseer :pin "02d49f582e")
(package! elisp-def :pin "368b04da68") (package! elisp-def :pin "368b04da68")
(package! elisp-demos :pin "0d74766f0c") (package! elisp-demos :pin "57dd4ae3e4")
(when (featurep! :checkers syntax) (when (featurep! :checkers syntax)
(package! flycheck-cask :pin "3457ae553c")) (package! flycheck-cask :pin "3457ae553c"))
(package! buttercup :pin "b360e35017") ;; Libraries
(package! buttercup :pin "a91f282025")

View file

@ -15,7 +15,8 @@
- [[#troubleshooting][Troubleshooting]] - [[#troubleshooting][Troubleshooting]]
* Description * Description
This module adds [[https://golang.org][Go]] support. This module adds [[https://golang.org][Go]] support, with optional (but recommended) LSP support via
[[https://github.com/golang/tools/blob/master/gopls/README.md][gopls]].
+ Code completion (~gocode~) + Code completion (~gocode~)
+ Documentation lookup (~godoc~) + Documentation lookup (~godoc~)
@ -30,7 +31,8 @@ This module adds [[https://golang.org][Go]] support.
+ Code checking (~flycheck-golangci-lint~) + Code checking (~flycheck-golangci-lint~)
** Module Flags ** Module Flags
+ =+lsp= Enables integration for the gopls LSP server. + =+lsp= Enables integration for the gopls LSP server. It is highly recommended
you use this, as the non-LSP experience is deprecated (and poor).
** Plugins ** Plugins
+ [[https://github.com/dominikh/go-mode.el][go-mode]] + [[https://github.com/dominikh/go-mode.el][go-mode]]
@ -38,7 +40,7 @@ This module adds [[https://golang.org][Go]] support.
+ [[https://github.com/dominikh/go-mode.el][go-guru]] + [[https://github.com/dominikh/go-mode.el][go-guru]]
+ [[https://github.com/manute/gorepl-mode][gorepl-mode]] + [[https://github.com/manute/gorepl-mode][gorepl-mode]]
+ [[https://github.com/brantou/emacs-go-tag][go-tag]] + [[https://github.com/brantou/emacs-go-tag][go-tag]]
+ [[https://github.com/mdempsky/gocode][company-go]]* + [[https://github.com/mdempsky/gocode][company-go]]* =DEPRECATED=
+ [[https://github.com/s-kostyaev/go-gen-test][go-gen-test]] + [[https://github.com/s-kostyaev/go-gen-test][go-gen-test]]
+ [[https://github.com/weijiangan/flycheck-golangci-lint][flycheck-golangci-lint]] (if =:checkers syntax= is enabled) + [[https://github.com/weijiangan/flycheck-golangci-lint][flycheck-golangci-lint]] (if =:checkers syntax= is enabled)

View file

@ -2,14 +2,14 @@
;;; lang/go/packages.el ;;; lang/go/packages.el
(package! go-eldoc :pin "cbbd2ea1e9") (package! go-eldoc :pin "cbbd2ea1e9")
(package! go-guru :pin "85a20dac6c") (package! go-guru :pin "10d6ab43d9")
(package! go-mode :pin "85a20dac6c") (package! go-mode :pin "10d6ab43d9")
(package! gorepl-mode :pin "6a73bf352e") (package! gorepl-mode :pin "6a73bf352e")
(package! go-tag :pin "59b243f2fa") (package! go-tag :pin "59b243f2fa")
(package! go-gen-test :pin "44c202ac97") (package! go-gen-test :pin "44c202ac97")
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-go :pin "939b4a677f")) (package! company-go :pin "4acdcbdea7"))
(when (featurep! :checkers syntax) (when (featurep! :checkers syntax)
(package! flycheck-golangci-lint :pin "8e446c6831")) (package! flycheck-golangci-lint :pin "8e446c6831"))

View file

@ -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) (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 (use-package! android-mode
:commands android-mode :commands android-mode

View file

@ -37,7 +37,6 @@ This module adds JavaScript and TypeScript support.
+ [[https://github.com/mooz/js2-mode][js2-mode]] + [[https://github.com/mooz/js2-mode][js2-mode]]
+ [[https://github.com/felipeochoa/rjsx-mode][rjsx-mode]] + [[https://github.com/felipeochoa/rjsx-mode][rjsx-mode]]
+ [[https://github.com/emacs-typescript/typescript.el][typescript-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/magnars/js2-refactor.el][js2-refactor]]
+ [[https://github.com/mojochao/npm-mode][npm-mode]] + [[https://github.com/mojochao/npm-mode][npm-mode]]
+ [[https://github.com/abicky/nodejs-repl.el][nodejs-repl]] + [[https://github.com/abicky/nodejs-repl.el][nodejs-repl]]

View file

@ -83,18 +83,6 @@ Run this for any buffer you want to skewer."
;; ;;
;; Hooks ;; 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 ;;;###autoload
(defun +javascript-cleanup-tide-processes-h () (defun +javascript-cleanup-tide-processes-h ()
"Clean up dangling tsserver processes if there are no more buffers with "Clean up dangling tsserver processes if there are no more buffers with

View file

@ -133,7 +133,9 @@
;; ;;
;;; Tools ;;; 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 () (defun +javascript-init-lsp-or-tide-maybe-h ()
"Start `lsp' or `tide' in the current buffer. "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)))) (setq-default company-backends (delq 'company-tide (default-value 'company-backends))))
(set-company-backend! 'tide-mode 'company-tide) (set-company-backend! 'tide-mode 'company-tide)
;; navigation ;; navigation
(set-lookup-handlers! 'tide-mode (set-lookup-handlers! 'tide-mode :async t
:definition '(tide-jump-to-definition :async t) :definition #'tide-jump-to-definition
:references '(tide-references :async t)) :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 ;; resolve to `doom-project-root' if `tide-project-root' fails
(advice-add #'tide-project-root :override #'+javascript-tide-project-root-a) (advice-add #'tide-project-root :override #'+javascript-tide-project-root-a)
;; cleanup tsserver when no tide buffers are left ;; cleanup tsserver when no tide buffers are left
@ -192,8 +196,6 @@ to tide."
;; `tide-mode-hook' is too early, so... ;; `tide-mode-hook' is too early, so...
(advice-add #'tide-setup :after #'eldoc-mode) (advice-add #'tide-setup :after #'eldoc-mode)
(define-key tide-mode-map [remap +lookup/documentation] #'tide-documentation-at-point)
(map! :localleader (map! :localleader
:map tide-mode-map :map tide-mode-map
"R" #'tide-restart-server "R" #'tide-restart-server
@ -239,13 +241,6 @@ to tide."
(js2r-add-keybindings-with-prefix (format "%s r" doom-localleader-key))))) (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 ;;;###package skewer-mode
(map! :localleader (map! :localleader
(:after js2-mode (:after js2-mode
@ -292,10 +287,11 @@ to tide."
web-mode web-mode
markdown-mode markdown-mode
js-mode js-mode
json-mode
typescript-mode typescript-mode
solidity-mode) solidity-mode)
:when (locate-dominating-file default-directory "package.json") :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 (def-project-mode! +javascript-gulp-mode
:when (locate-dominating-file default-directory "gulpfile.js")) :when (locate-dominating-file default-directory "gulpfile.js"))

View file

@ -8,9 +8,9 @@
(package! typescript-mode :pin "102587e458") (package! typescript-mode :pin "102587e458")
;; Tools ;; Tools
(package! eslintd-fix :pin "0c431141be")
(package! js2-refactor :pin "d4c40b5fc8") (package! js2-refactor :pin "d4c40b5fc8")
(package! npm-mode :pin "3ee7c0bad5") (package! npm-mode :pin "3ee7c0bad5")
(package! add-node-modules-path :pin "f31e69ccb6")
;; Eval ;; Eval
(package! nodejs-repl :pin "6fad7d764f") (package! nodejs-repl :pin "6fad7d764f")

View file

@ -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.

View file

@ -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))

View file

@ -0,0 +1,5 @@
;; -*- no-byte-compile: t; -*-
;;; lang/json/packages.el
(package! json-mode :pin "0e819e519a")
(package! json-snatcher :pin "c4cecc0a50")

View file

@ -10,7 +10,8 @@
"Run an inferior instance of `julia' inside Emacs." "Run an inferior instance of `julia' inside Emacs."
(interactive) (interactive)
(if (require 'julia-repl nil t) (if (require 'julia-repl nil t)
(julia-repl) (prog1 (julia-repl)
(julia-repl-use-emacsclient))
(let ((buffer (get-buffer-create "*Julia*"))) (let ((buffer (get-buffer-create "*Julia*")))
(unless (comint-check-proc "*Julia*") (unless (comint-check-proc "*Julia*")
(apply #'make-comint-in-buffer "Julia" "*Julia*" julia-program julia-arguments)) (apply #'make-comint-in-buffer "Julia" "*Julia*" julia-program julia-arguments))

View file

@ -33,6 +33,8 @@ Provide a helping hand when working with LaTeX documents.
** Module Flags ** Module Flags
+ =+latexmk= Use LatexMk instead of LaTeX to compile documents. + =+latexmk= Use LatexMk instead of LaTeX to compile documents.
+ =+cdlatex= Enable [[https://github.com/cdominik/cdlatex][cdlatex]] for fast math insertion. + =+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 + =+fold= Use TeX-fold (from auctex) to fold LaTeX macros to unicode, and make
folding hook-based and less manual. folding hook-based and less manual.

View file

@ -70,7 +70,12 @@ If no viewers are found, `latex-preview-pane' is used.")
(sp-local-pair modes open nil :actions :rem)) (sp-local-pair modes open nil :actions :rem))
;; And tweak these so that users can decide whether they want use latex ;; And tweak these so that users can decide whether they want use latex
;; quotes or not, via `+latex-enable-plain-double-quotes' ;; 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 (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-environments nil #'eq)
(add-to-list '+latex--company-backends #'company-auctex-macros nil #'eq)) (add-to-list '+latex--company-backends #'company-auctex-macros nil #'eq))
(use-package! company-math (use-package! company-math
:when (featurep! :completion company) :when (featurep! :completion company)
:defer t :defer t

View file

@ -70,6 +70,7 @@ capture, the end position, and the output buffer.")
(map! :map markdown-mode-map (map! :map markdown-mode-map
:localleader :localleader
"'" #'markdown-edit-code-block
"o" #'markdown-open "o" #'markdown-open
"p" #'markdown-preview "p" #'markdown-preview
"e" #'markdown-export "e" #'markdown-export

View file

@ -18,6 +18,7 @@
- [[#built-in-custom-link-types][Built-in custom link types]] - [[#built-in-custom-link-types][Built-in custom link types]]
- [[#configuration][Configuration]] - [[#configuration][Configuration]]
- [[#changing-org-directory][Changing ~org-directory~]] - [[#changing-org-directory][Changing ~org-directory~]]
- [[#changing-org-noter-notes-search-path][Changing ~org-noter-notes-search-path~]]
* Description * Description
This module adds org-mode support to Doom Emacs, along with a number of This module adds org-mode support to Doom Emacs, along with a number of
@ -63,6 +64,8 @@ https://www.mfoot.com/blog/2015/11/22/literate-emacs-configuration-with-org-mode
+ =+ipython= (**DEPRECATED**) Enables ipython integration for babel. + =+ipython= (**DEPRECATED**) Enables ipython integration for babel.
+ =+journal= Enables [[https://github.com/bastibe/org-journal][org-journal]] integration. + =+journal= Enables [[https://github.com/bastibe/org-journal][org-journal]] integration.
+ =+jupyter= Enables Jupyter integration for babel. + =+jupyter= Enables Jupyter integration for babel.
+ =+noter= Enables org-noter integration. Keeps notes in sync with a document.
Requires [[https://github.com/politza/pdf-tools][pdf-tools]] (=:tools pdf=) or [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Document-View.html][DocView]] or [[https://github.com/wasamasa/nov.el][nov.el]] to be enabled.
+ =+pandoc= Enables pandoc integration into the Org exporter. + =+pandoc= Enables pandoc integration into the Org exporter.
+ =+pomodoro= Enables a pomodoro timer for clocking time on tasks. + =+pomodoro= Enables a pomodoro timer for clocking time on tasks.
+ =+present= Enables integration with reveal.js, beamer and org-tree-slide, so + =+present= Enables integration with reveal.js, beamer and org-tree-slide, so
@ -121,6 +124,9 @@ https://www.mfoot.com/blog/2015/11/22/literate-emacs-configuration-with-org-mode
+ =+roam= + =+roam=
+ [[https://github.com/jethrokuan/org-roam][org-roam]] + [[https://github.com/jethrokuan/org-roam][org-roam]]
+ [[https://github.com/jethrokuan/company-org-roam][company-org-roam]] + [[https://github.com/jethrokuan/company-org-roam][company-org-roam]]
+ =+noter=
+ [[https://github.com/weirdNox/org-noter][org-noter]]
** Hacks ** Hacks
+ The window is recentered when following links. + The window is recentered when following links.
@ -223,3 +229,10 @@ To modify ~org-directory~ it must be set /before/ =org= has loaded:
;; ~/.doom.d/config.el ;; ~/.doom.d/config.el
(setq org-directory "~/new/org/location/") (setq org-directory "~/new/org/location/")
#+END_SRC #+END_SRC
** Changing ~org-noter-notes-search-path~
To modify ~org-noter-notes-search-path~ set:
#+BEGIN_SRC emacs-lisp
;; ~/.doom.d/config.el
(setq org-noter-notes-search-path '("~/notes/path/"))
#+END_SRC

View file

@ -10,13 +10,3 @@
(rassq-delete-all '+org-dragndrop-download-dnd-fn (rassq-delete-all '+org-dragndrop-download-dnd-fn
(copy-alist dnd-protocol-alist)))) (copy-alist dnd-protocol-alist))))
(dnd-handle-one-url nil action uri)))) (dnd-handle-one-url nil action uri))))
;;;###autoload
(defun +org-dragndrop-image-fn (protocol link _description)
"Return the image associated with the current attachment."
(let ((file (expand-file-name link org-attach-id-dir)))
(when (and (file-exists-p file) (image-type-from-file-name file))
(with-temp-buffer
(insert-file-contents file)
(goto-char (point-min))
(buffer-substring-no-properties (point) (point-max))))))

View file

@ -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) (unless (eq major-mode 'org-mode)
(user-error "Not in an org buffer")) (user-error "Not in an org buffer"))
(require 'org-download) (require 'org-download)
(condition-case ex (condition-case-unless-debug e
(let ((raw-uri (url-unhex-string path))) (let ((raw-uri (url-unhex-string path)))
(cond ((string-match-p "^data:image/png;base64," path) (cond ((string-match-p "^data:image/png;base64," path)
(org-download-dnd-base64 path nil)) (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 ;; insert the link
(org-download-insert-link raw-uri new-path))))) (org-download-insert-link raw-uri new-path)))))
(error (error
(user-error "Failed to attach file: %s" (error-message-string ex))))) (user-error "Failed to attach file: %s" (error-message-string e)))))

View file

@ -1,43 +1,72 @@
;;; lang/org/autoload/org-link.el -*- lexical-binding: t; -*- ;;; 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)) (if (and buffer-file-name (file-in-directory-p buffer-file-name root))
(file-relative-name path) (file-relative-name path)
path)) path))
;;;###autoload (defun +org--read-link-path (key dir &optional fn)
(defun +org-def-link (key dir) (let ((file (funcall (or fn #'read-file-name) (format "%s: " (capitalize key)) dir)))
(org-link-set-parameters (format "%s:%s" key (file-relative-name file dir))))
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))))
;;;###autoload ;;;###autoload
(defun +org-link-read-file (key dir) (defun +org-define-basic-link (key dir-var &rest plist)
(let ((file (read-file-name (format "%s: " (capitalize key)) dir))) "Define a link with some basic completion & fontification.
(format "%s:%s"
key KEY is the name of the link type. DIR-VAR is the directory variable to resolve
(file-relative-name file dir)))) 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 ;;;###autoload
(defun +org-link-read-directory (key dir) (defun +org-image-file-data-fn (protocol link _description)
(let ((file (read-directory-name (format "%s: " (capitalize key)) dir))) "Intepret LINK as an image file path and return its data."
(format "%s:%s" (setq
key link (expand-file-name
(file-relative-name file dir)))) 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 ;;;###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." "Interpret LINK as base64-encoded image data."
(base64-decode-string link)) (base64-decode-string link))
;;;###autoload ;;;###autoload
(defun +org-image-link (protocol link _description) (defun +org-http-image-data-fn (protocol link _description)
"Interpret LINK as base64-encoded image data." "Interpret LINK as an URL to an image file."
(when (image-type-from-file-name link) (when (image-type-from-file-name link)
(if-let* ((buf (url-retrieve-synchronously (concat protocol ":" link)))) (if-let* ((buf (url-retrieve-synchronously (concat protocol ":" link))))
(with-current-buffer buf (with-current-buffer buf

View file

@ -65,6 +65,12 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default
;; ;;
;;; `org-load' hooks ;;; `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 () (defun +org-init-agenda-h ()
(unless org-agenda-files (unless org-agenda-files
(setq org-agenda-files (list org-directory))) (setq org-agenda-files (list org-directory)))
@ -141,9 +147,10 @@ This forces it to read the background before rendering."
(setq org-todo-keywords (setq org-todo-keywords
'((sequence '((sequence
"TODO(t)" ; A task that needs doing & is ready to do "TODO(t)" ; A task that needs doing & is ready to do
"PROJ(p)" ; An ongoing project that cannot be completed in one step "PROJ(p)" ; A project, which usually contains other tasks
"STRT(s)" ; A task that is in progress "STRT(s)" ; A task that is in progress
"WAIT(w)" ; Something is holding up this task; or it is paused "WAIT(w)" ; Something external is holding up this task
"HOLD(h)" ; This task is paused/on hold because of me
"|" "|"
"DONE(d)" ; Task successfully completed "DONE(d)" ; Task successfully completed
"KILL(k)") ; Task was cancelled, aborted or is no longer applicable "KILL(k)") ; Task was cancelled, aborted or is no longer applicable
@ -158,14 +165,20 @@ This forces it to read the background before rendering."
("STRT" . +org-todo-active) ("STRT" . +org-todo-active)
("[?]" . +org-todo-onhold) ("[?]" . +org-todo-onhold)
("WAIT" . +org-todo-onhold) ("WAIT" . +org-todo-onhold)
("HOLD" . +org-todo-onhold)
("PROJ" . +org-todo-project))) ("PROJ" . +org-todo-project)))
(defadvice! +org-display-link-in-eldoc-a (orig-fn &rest args) (after! org-eldoc
;; HACK Fix #2972: infinite recursion when eldoc kicks in in an 'org' src
;; block.
;; TODO Should be reported upstream!
(puthash "org" "ignore" org-eldoc-local-functions-cache))
(defadvice! +org-display-link-in-eldoc-a (&rest args)
"Display full link in minibuffer when cursor/mouse is over it." "Display full link in minibuffer when cursor/mouse is over it."
:around #'org-eldoc-documentation-function :before-until #'org-eldoc-documentation-function
(or (when-let (link (org-element-property :raw-link (org-element-context))) (when-let (link (org-element-property :raw-link (org-element-context)))
(format "Link: %s" link)) (format "Link: %s" link)))
(apply orig-fn args)))
;; Automatic indent detection in org files is meaningless ;; Automatic indent detection in org files is meaningless
(add-to-list 'doom-detect-indentation-excluded-modes 'org-mode) (add-to-list 'doom-detect-indentation-excluded-modes 'org-mode)
@ -338,7 +351,7 @@ relative to `org-directory', unless it is an absolute path."
(defadvice! +org--prevent-save-prompts-when-refiling-a (&rest _) (defadvice! +org--prevent-save-prompts-when-refiling-a (&rest _)
"Fix #462: when refiling from org-capture, Emacs prompts to kill the "Fix #462: when refiling from org-capture, Emacs prompts to kill the
underlying, modified buffer. This fixes that." underlying, modified buffer. This fixes that."
:after 'org-refile :after #'org-refile
(when (bound-and-true-p org-capture-is-refiling) (when (bound-and-true-p org-capture-is-refiling)
(org-save-all-org-buffers))) (org-save-all-org-buffers)))
@ -364,14 +377,15 @@ underlying, modified buffer. This fixes that."
(defun +org-init-attachments-h () (defun +org-init-attachments-h ()
"Sets up org's attachment system." "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 ;; Centralized attachments directory
(setq org-attach-id-dir (doom-path org-directory org-attach-id-dir) (after! org-attach
;; Store a link to attachments when they are attached (unless org-attach-id-dir
org-attach-store-link-p t (setq org-attach-id-dir (expand-file-name ".attach/" org-directory)))
;; Inherit attachment properties from parent nodes (after! projectile
org-attach-use-inheritance t) (add-to-list 'projectile-globally-ignored-directories org-attach-id-dir))))
(after! projectile
(add-to-list 'projectile-globally-ignored-directories org-attach-id-dir)))
(defun +org-init-custom-links-h () (defun +org-init-custom-links-h ()
@ -395,15 +409,15 @@ underlying, modified buffer. This fixes that."
'("wolfram" . "https://wolframalpha.com/input/?i=%s") '("wolfram" . "https://wolframalpha.com/input/?i=%s")
'("doom-repo" . "https://github.com/hlissner/doom-emacs/%s")) '("doom-repo" . "https://github.com/hlissner/doom-emacs/%s"))
(+org-def-link "org" org-directory) (+org-define-basic-link "org" 'org-directory)
(+org-def-link "doom" doom-emacs-dir) (+org-define-basic-link "doom" 'doom-emacs-dir)
(+org-def-link "doom-docs" doom-docs-dir) (+org-define-basic-link "doom-docs" 'doom-docs-dir)
(+org-def-link "doom-modules" doom-modules-dir) (+org-define-basic-link "doom-modules" 'doom-modules-dir)
;; Allow inline image previews of http(s)? urls or data uris ;; 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 "http" :image-data-fun #'+org-http-image-data-fn)
(org-link-set-parameters "https" :image-data-fun #'+org-image-link) (org-link-set-parameters "https" :image-data-fun #'+org-http-image-data-fn)
(org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image) (org-link-set-parameters "img" :image-data-fun #'+org-inline-image-data-fn)
;; Add support for youtube links + previews ;; Add support for youtube links + previews
(require 'org-yt nil t)) (require 'org-yt nil t))
@ -456,9 +470,9 @@ underlying, modified buffer. This fixes that."
(defun +org-init-hacks-h () (defun +org-init-hacks-h ()
"Getting org to behave." "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) (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)) (add-to-list 'org-file-apps '(directory . emacs))
;; When you create a sparse tree and `org-indent-mode' is enabled, the ;; When you create a sparse tree and `org-indent-mode' is enabled, the
@ -566,6 +580,9 @@ between the two."
"C-c C-S-l" #'+org/remove-link "C-c C-S-l" #'+org/remove-link
"C-c C-i" #'org-toggle-inline-images "C-c C-i" #'org-toggle-inline-images
;; textmate-esque newline insertion ;; 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-return] #'+org/insert-item-below
[C-S-return] #'+org/insert-item-above [C-S-return] #'+org/insert-item-above
[C-M-return] #'org-insert-subheading [C-M-return] #'org-insert-subheading
@ -578,7 +595,10 @@ between the two."
[remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line
:localleader :localleader
"#" #'org-update-statistics-cookies
"'" #'org-edit-special "'" #'org-edit-special
"*" #'org-ctrl-c-star
"+" #'org-ctrl-c-minus
"," #'org-switchb "," #'org-switchb
"." #'org-goto "." #'org-goto
(:when (featurep! :completion ivy) (:when (featurep! :completion ivy)
@ -588,7 +608,6 @@ between the two."
"." #'helm-org-in-buffer-headings "." #'helm-org-in-buffer-headings
"/" #'helm-org-agenda-files-headings) "/" #'helm-org-agenda-files-headings)
"A" #'org-archive-subtree "A" #'org-archive-subtree
"d" #'org-deadline
"e" #'org-export-dispatch "e" #'org-export-dispatch
"f" #'org-footnote-new "f" #'org-footnote-new
"h" #'org-toggle-heading "h" #'org-toggle-heading
@ -598,7 +617,6 @@ between the two."
"o" #'org-set-property "o" #'org-set-property
"p" #'org-priority "p" #'org-priority
"q" #'org-set-tags-command "q" #'org-set-tags-command
"s" #'org-schedule
"t" #'org-todo "t" #'org-todo
"T" #'org-todo-list "T" #'org-todo-list
(:prefix ("a" . "attachments") (:prefix ("a" . "attachments")
@ -621,24 +639,38 @@ between the two."
(:prefix ("b" . "tables") (:prefix ("b" . "tables")
"-" #'org-table-insert-hline "-" #'org-table-insert-hline
"a" #'org-table-align "a" #'org-table-align
"b" #'org-table-blank-field
"c" #'org-table-create-or-convert-from-region "c" #'org-table-create-or-convert-from-region
"dc" #'org-table-delete-column
"dr" #'org-table-kill-row
"e" #'org-table-edit-field "e" #'org-table-edit-field
"f" #'org-table-edit-formulas
"h" #'org-table-field-info "h" #'org-table-field-info
"s" #'org-table-sort-lines
"r" #'org-table-recalculate
"R" #'org-table-recalculate-buffer-tables
(:when (featurep! +gnuplot) (:when (featurep! +gnuplot)
"p" #'org-plot/gnuplot)) "p" #'org-plot/gnuplot))
(:prefix ("c" . "clock") (:prefix ("c" . "clock")
"c" #'org-clock-in "c" #'org-clock-cancel
"C" #'org-clock-out
"d" #'org-clock-mark-default-task "d" #'org-clock-mark-default-task
"e" #'org-clock-modify-effort-estimate "e" #'org-clock-modify-effort-estimate
"E" #'org-set-effort "E" #'org-set-effort
"l" #'org-clock-in-last
"g" #'org-clock-goto "g" #'org-clock-goto
"G" (λ! (org-clock-goto 'select)) "G" (λ! (org-clock-goto 'select))
"r" #'org-clock-report "i" #'org-clock-in
"x" #'org-clock-cancel "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-up
"-" #'org-clock-timestamps-down) "-" #'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") (:prefix ("g" . "goto")
"g" #'org-goto "g" #'org-goto
(:when (featurep! :completion ivy) (:when (featurep! :completion ivy)
@ -655,12 +687,13 @@ between the two."
"x" #'org-capture-goto-last-stored) "x" #'org-capture-goto-last-stored)
(:prefix ("l" . "links") (:prefix ("l" . "links")
"c" #'org-cliplink "c" #'org-cliplink
"d" #'+org/remove-link
"i" #'org-id-store-link
"l" #'org-insert-link "l" #'org-insert-link
"L" #'org-insert-all-links "L" #'org-insert-all-links
"s" #'org-store-link "s" #'org-store-link
"S" #'org-insert-last-stored-link "S" #'org-insert-last-stored-link
"i" #'org-id-store-link "t" #'org-toggle-link-display)
"d" #'+org/remove-link)
(:prefix ("r" . "refile") (:prefix ("r" . "refile")
"." #'+org/refile-to-current-file "." #'+org/refile-to-current-file
"c" #'+org/refile-to-running-clock "c" #'+org/refile-to-running-clock
@ -778,7 +811,7 @@ compelling reason, so..."
(use-package! org-crypt ; built-in (use-package! org-crypt ; built-in
:commands org-encrypt-entries :commands org-encrypt-entries org-encrypt-entry org-decrypt-entries org-decrypt-entry
:hook (org-reveal-start . org-decrypt-entry) :hook (org-reveal-start . org-decrypt-entry)
:config :config
(add-hook! 'org-mode-hook (add-hook! 'org-mode-hook
@ -811,40 +844,18 @@ compelling reason, so..."
:commands org-pdftools-export :commands org-pdftools-export
:init :init
(after! org (after! org
(add-hook 'org-store-link-functions #'org-pdftools-store-link) (org-link-set-parameters (or (bound-and-true-p org-pdftools-link-prefix) "pdf")
;; HACK `org-pdftools' hard-codes "pdftools:" for its links. We want to use
;; a generic link so that the backend doesn't matter. These hacks are
;; in place so that the old pdf(view|tools) links still work, but that
;; org-pdftools will only generate pdf: links.
(org-link-set-parameters "pdf"
:follow #'org-pdftools-open :follow #'org-pdftools-open
:complete #'org-pdftools-complete-link :complete #'org-pdftools-complete-link
:store #'org-pdftools-store-link :store #'org-pdftools-store-link
:export #'org-pdftools-export) :export #'org-pdftools-export)
(add-hook! 'org-open-link-functions (add-hook! 'org-open-link-functions
(defun +org-open-old-pdf-links-fn (link) (defun +org-open-legacy-pdf-links-fn (link)
"Open pdftools:* and pdfviews:* links as if they were pdf:* links."
(let ((regexp "^pdf\\(?:tools\\|view\\):")) (let ((regexp "^pdf\\(?:tools\\|view\\):"))
(when (string-match-p regexp link) (when (string-match-p regexp link)
(org-pdftools-open (replace-regexp-in-string regexp "" link)) (org-pdftools-open (replace-regexp-in-string regexp "" link))
t)))) t))))))
;; TODO Perhaps PR a variable for changing the link upstream?
(defadvice! +org--use-generic-link-a (link)
:filter-return '(org-pdftools-complete-link
org-pdftools-get-link)
(replace-regexp-in-string "^pdftools:" "pdf:" link))
(defadvice! +org--store-generic-link-a (orig-fn &rest args)
:around #'org-pdftools-store-link
(cl-letf* ((old-store-props (symbol-function #'org-link-store-props))
((symbol-function #'org-link-store-props)
(lambda (&rest plist)
(plist-put! plist :type "pdf")
(plist-put! plist :link (+org--use-generic-link-a (plist-get plist :link)))
(apply old-store-props plist))))
(apply orig-fn args)))))
(use-package! evil-org (use-package! evil-org
@ -935,10 +946,12 @@ compelling reason, so..."
org-list org-pcomplete org-src org-footnote org-macro ob org org-agenda org-list org-pcomplete org-src org-footnote org-macro ob org org-agenda
org-capture org-capture
:preface :preface
;; Change org defaults (should be set before org loads) ;; Set these to nil now so we can detect user changes to them later (and fall
(setq org-directory "~/org/" ;; back on defaults otherwise)
org-attach-id-dir ".attach/" (defvar org-directory nil)
org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/") (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/")) org-preview-latex-image-directory (concat doom-cache-dir "org-latex/"))
;; Make most of the default modules opt-in, because I sincerely doubt most ;; Make most of the default modules opt-in, because I sincerely doubt most
@ -965,6 +978,7 @@ compelling reason, so..."
(if (featurep! +pomodoro) (load! "contrib/pomodoro")) (if (featurep! +pomodoro) (load! "contrib/pomodoro"))
(if (featurep! +present) (load! "contrib/present")) (if (featurep! +present) (load! "contrib/present"))
(if (featurep! +roam) (load! "contrib/roam")) (if (featurep! +roam) (load! "contrib/roam"))
(if (featurep! +noter) (load! "contrib/noter"))
;; Add our general hooks after the submodules, so that any hooks the ;; Add our general hooks after the submodules, so that any hooks the
;; submodules add run after them, and can overwrite any defaults if necessary. ;; submodules add run after them, and can overwrite any defaults if necessary.
@ -979,6 +993,7 @@ compelling reason, so..."
#'+org-unfold-to-2nd-level-or-point-h) #'+org-unfold-to-2nd-level-or-point-h)
(add-hook! 'org-load-hook (add-hook! 'org-load-hook
#'+org-init-org-directory-h
#'+org-init-appearance-h #'+org-init-appearance-h
#'+org-init-agenda-h #'+org-init-agenda-h
#'+org-init-attachments-h #'+org-init-attachments-h
@ -1012,7 +1027,6 @@ compelling reason, so..."
;; Global ID state means we can have ID links anywhere. This is required for ;; Global ID state means we can have ID links anywhere. This is required for
;; `org-brain', however. ;; `org-brain', however.
(setq org-id-track-globally t (setq org-id-track-globally t
org-id-locations-file (expand-file-name ".orgids" org-directory)
org-id-locations-file-relative t) org-id-locations-file-relative t)
;; HACK `org-id' doesn't check if `org-id-locations-file' exists or is ;; HACK `org-id' doesn't check if `org-id-locations-file' exists or is

View file

@ -16,61 +16,52 @@
(after! org (after! org
;; A shorter link to attachments ;; A shorter link to attachments
(+org-def-link "download" org-attach-id-dir) (+org-define-basic-link "download" (lambda () (or org-download-image-dir org-attach-id-dir "."))
(org-link-set-parameters "download" :image-data-fun #'+org-dragndrop-image-fn)) :image-data-fun #'+org-image-file-data-fn
:requires 'org-download))
:config :config
(setq org-download-image-dir org-attach-id-dir (unless org-download-image-dir
org-download-link-format "[[download:%s]]\n" (setq org-download-image-dir org-attach-id-dir))
org-download-method 'attach (setq org-download-method 'attach
org-download-heading-lvl nil
org-download-timestamp "_%Y%m%d_%H%M%S" org-download-timestamp "_%Y%m%d_%H%M%S"
org-download-screenshot-method org-download-screenshot-method
(cond (IS-MAC "screencapture -i %s") (cond (IS-MAC "screencapture -i %s")
(IS-LINUX (IS-LINUX
(cond ((executable-find "maim") "maim -s %s") (cond ((executable-find "maim") "maim -s %s")
((executable-find "scrot") "scrot -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 org-download-heading-lvl nil
;; as-is, as image previews. Other files, like pdfs or zips, should be linked org-download-link-format "[[download:%s]]\n"
;; to, with an icon indicating the type of file. org-download-annotate-function (lambda (_link) "")
(defadvice! +org--dragndrop-insert-link-a (_link filename) org-download-link-format-function
"Produces and inserts a link to FILENAME into the document. (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 (defadvice! +org--dragndrop-then-display-inline-images-a (_link filename)
an file icon produced by `+org-attach-icon-for')." :after #'org-download-insert-link
:override #'org-download-insert-link (when (image-type-from-file-name filename)
(if (looking-back "^[ \t]+" (line-beginning-position)) (save-excursion
(delete-region (match-beginning 0) (match-end 0)) (org-display-inline-images
(newline)) t t
(cond ((image-type-from-file-name filename) (progn (org-back-to-heading t) (point))
(insert (progn (org-end-of-subtree t t)
(concat (when (and (org-at-heading-p) (not (eobp))) (backward-char 1))
(if (= org-download-image-html-width 0) "" (point)))))))
(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))))

View file

@ -29,6 +29,8 @@
(defun +org-journal-mode-maybe () (defun +org-journal-mode-maybe ()
"Activate `org-journal-mode', maybe." "Activate `org-journal-mode', maybe."
(and (eq major-mode 'org-mode) (and (eq major-mode 'org-mode)
(stringp buffer-file-name)
(stringp org-journal-file-pattern)
(string-match-p org-journal-file-pattern buffer-file-name) (string-match-p org-journal-file-pattern buffer-file-name)
(let ((org-mode-hook (remq '+org-journal-mode-maybe org-mode-hook))) (let ((org-mode-hook (remq '+org-journal-mode-maybe org-mode-hook)))
(org-journal-mode)))) (org-journal-mode))))

View file

@ -0,0 +1,14 @@
;;; lang/org/contrib/noter.el -*- lexical-binding: t; -*-
;;;###if (featurep! +noter)
(use-package! org-noter
:defer t
:preface
;; Allow the user to preempt this and set the document search path
;; If not set then use `org-directory'
(defvar org-noter-notes-search-path nil)
:config
(setq org-noter-auto-save-last-location t
org-noter-separate-notes-from-heading t)
(unless org-noter-notes-search-path
(setq org-noter-notes-search-path org-directory)))

View file

@ -1,18 +1,25 @@
;;; lang/org/contrib/roam.el -*- lexical-binding: t; -*- ;;; lang/org/contrib/roam.el -*- lexical-binding: t; -*-
;;;###if (featurep! +roam) ;;;###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 (use-package! org-roam
:hook (org-load . org-roam-mode) :hook (org-load . org-roam-mode)
:hook (org-roam-backlinks-mode . turn-on-visual-line-mode) :hook (org-roam-backlinks-mode . turn-on-visual-line-mode)
:commands (org-roam-buffer-toggle-display :commands (org-roam-buffer-toggle-display
org-roam-date
org-roam-find-file org-roam-find-file
org-roam-graph-show org-roam-graph
org-roam-insert org-roam-insert
org-roam-switch-to-buffer org-roam-switch-to-buffer
org-roam-today org-roam-dailies-date
org-roam-tomorrow org-roam-dailies-today
org-roam-yesterday) org-roam-dailies-tomorrow
org-roam-dailies-yesterday)
:preface :preface
;; Set this to nil so we can later detect whether the user has set a custom ;; Set this to nil so we can later detect whether the user has set a custom
;; directory for it, and default to `org-directory' if they haven't. ;; directory for it, and default to `org-directory' if they haven't.
@ -24,30 +31,54 @@
:prefix ("m" . "org-roam") :prefix ("m" . "org-roam")
"b" #'org-roam-switch-to-buffer "b" #'org-roam-switch-to-buffer
"f" #'org-roam-find-file "f" #'org-roam-find-file
"g" #'org-roam-graph-show "g" #'org-roam-graph
"i" #'org-roam-insert "i" #'org-roam-insert
"m" #'org-roam "m" #'org-roam
(:prefix ("d" . "by date") (:prefix ("d" . "by date")
:desc "Arbitrary date" "d" #'org-roam-date :desc "Arbitrary date" "d" #'org-roam-dailies-date
:desc "Today" "t" #'org-roam-today :desc "Today" "t" #'org-roam-dailies-today
:desc "Tomorrow" "m" #'org-roam-tomorrow :desc "Tomorrow" "m" #'org-roam-dailies-tomorrow
:desc "Yesterday" "y" #'org-roam-yesterday)) :desc "Yesterday" "y" #'org-roam-dailies-yesterday))
:config :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-directory)
org-roam-verbose nil ; https://youtu.be/fn4jIlFwuLU 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 org-roam-completion-system
(cond ((featurep! :completion helm) 'helm) (cond ((featurep! :completion helm) 'helm)
((featurep! :completion ivy) 'ivy) ((featurep! :completion ivy) 'ivy)
((featurep! :completion ido) 'ido) ((featurep! :completion ido) 'ido)
('default))) ('default))
org-roam-completion-fuzzy-match
(or (featurep! :completion helm +fuzzy)
(featurep! :completion ivy +fuzzy)))
;; HACK Hide the mode line in the org-roam buffer, since it serves no purpose. ;; HACK On first invocation, `org-roam-db-build-cache' builds the cache with a
;; This makes it easier to distinguish among other org buffers. ;; list of unresolved file paths. If those are symlinks, you will later
(defadvice! +org--hide-mode-line-a (&rest _) ;; end up with duplicate entries in your roam DB (e.g. after
:after #'org-roam-buffer--get-create ;; `org-roam-capture'ing to an existing file).
(with-current-buffer org-roam-buffer ;; REVIEW When jethrokuan/org-roam#518 is merged
(hide-mode-line-mode +1)))) (defadvice! +org-roam-resolve-symlinks-a (args)
:filter-args #'org-roam--list-files
(setcar args (file-truename (car args)))
args)
;; 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 ;; Since the org module lazy loads org-protocol (waits until an org URL is

View file

@ -27,14 +27,14 @@
:recipe (:host github :recipe (:host github
:repo "emacs-straight/org-mode" :repo "emacs-straight/org-mode"
:files ("*.el" "lisp/*.el" "contrib/lisp/*.el")) :files ("*.el" "lisp/*.el" "contrib/lisp/*.el"))
:pin "9994e8ee89") :pin "31068373dc")
;; ...And prevent other packages from pulling org; org-plus-contrib satisfies ;; ...And prevent other packages from pulling org; org-plus-contrib satisfies
;; the dependency already: https://github.com/raxod502/straight.el/issues/352 ;; the dependency already: https://github.com/raxod502/straight.el/issues/352
(package! org :recipe (:local-repo nil)) (package! org :recipe (:local-repo nil))
(package! avy) (package! avy)
(package! htmlize :pin "86f22f211e") (package! htmlize :pin "86f22f211e")
(package! org-superstar :pin "4897c333a8") (package! org-superstar :pin "09ddc28383")
(package! org-yt (package! org-yt
:recipe (:host github :repo "TobiasZawada/org-yt") :recipe (:host github :repo "TobiasZawada/org-yt")
:pin "40cc1ac76d") :pin "40cc1ac76d")
@ -45,13 +45,13 @@
(when (featurep! :editor evil +everywhere) (when (featurep! :editor evil +everywhere)
(package! evil-org (package! evil-org
:recipe (:host github :repo "hlissner/evil-org-mode") :recipe (:host github :repo "hlissner/evil-org-mode")
:pin "4d44e9bbdc")) :pin "9cf661af8f"))
(when (featurep! :tools pdf) (when (featurep! :tools pdf)
(package! org-pdftools :pin "4156b677fc")) (package! org-pdftools :pin "8cc15bb801"))
(when (featurep! :tools magit) (when (featurep! :tools magit)
(package! orgit :pin "0242088fb2")) (package! orgit :pin "e147f05577"))
(when (featurep! +brain) (when (featurep! +brain)
(package! org-brain :pin "3630eb88a3")) (package! org-brain :pin "7ffbf6816a"))
(when (featurep! +dragndrop) (when (featurep! +dragndrop)
(package! org-download :pin "46417e2bd3")) (package! org-download :pin "46417e2bd3"))
(when (featurep! +gnuplot) (when (featurep! +gnuplot)
@ -60,9 +60,11 @@
(when (featurep! +ipython) ; DEPRECATED (when (featurep! +ipython) ; DEPRECATED
(package! ob-ipython :pin "7147455230")) (package! ob-ipython :pin "7147455230"))
(when (featurep! +jupyter) (when (featurep! +jupyter)
(package! jupyter :pin "62ad054001")) (package! jupyter :pin "785edbbff6"))
(when (featurep! +journal) (when (featurep! +journal)
(package! org-journal :pin "3fdb5b3036")) (package! org-journal :pin "8bf06b28d6"))
(when (featurep! +noter)
(package! org-noter :pin "9ead81d42d"))
(when (featurep! +pomodoro) (when (featurep! +pomodoro)
(package! org-pomodoro :pin "aa07c11318")) (package! org-pomodoro :pin "aa07c11318"))
(when (featurep! +present) (when (featurep! +present)
@ -72,7 +74,7 @@
(package! org-tree-slide :pin "7bf09a02bd") (package! org-tree-slide :pin "7bf09a02bd")
(package! org-re-reveal :pin "61549f4c00")) (package! org-re-reveal :pin "61549f4c00"))
(when (featurep! +roam) (when (featurep! +roam)
(package! org-roam :pin "e33c144298") (package! org-roam :pin "963692f353")
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-org-roam :pin "0913d86f16"))) (package! company-org-roam :pin "0913d86f16")))
@ -103,6 +105,6 @@
(when (featurep! +hugo) (when (featurep! +hugo)
(package! ox-hugo (package! ox-hugo
:recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t) :recipe (:host github :repo "kaushalmodi/ox-hugo" :nonrecursive t)
:pin "b6f4142de2")) :pin "5106b430a1"))
(when (featurep! :lang rst) (when (featurep! :lang rst)
(package! ox-rst :pin "9158bfd180")) (package! ox-rst :pin "9158bfd180"))

View file

@ -25,6 +25,8 @@ Adds Python support to Doom Emacs.
+ ~+lsp~ Language Server Protocol support + ~+lsp~ Language Server Protocol support
+ ~+pyenv~ Python virtual environment support via [[https://github.com/pyenv/pyenv][pyenv]] + ~+pyenv~ Python virtual environment support via [[https://github.com/pyenv/pyenv][pyenv]]
+ ~+conda~ Python virtual environment support via [[https://conda.io/en/latest/][Conda]] + ~+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]] + ~+cython~ Cython files support via [[https://github.com/cython/cython/blob/master/Tools/cython-mode.el][Cython-mode]]
** Plugins ** Plugins
@ -41,6 +43,8 @@ Adds Python support to Doom Emacs.
+ [[https://github.com/necaris/conda.el][conda]]* + [[https://github.com/necaris/conda.el][conda]]*
+ ~+pyenv~ + ~+pyenv~
+ [[https://github.com/pythonic-emacs/pyenv-mode][pyenv]]* + [[https://github.com/pythonic-emacs/pyenv-mode][pyenv]]*
+ ~+poetry~
+ [[https://github.com/galaunay/poetry.el][poetry]]*
+ ~+lsp~ and ~:tools lsp~ + ~+lsp~ and ~:tools lsp~
+ [[https://github.com/emacs-lsp/lsp-mode][lsp]] + [[https://github.com/emacs-lsp/lsp-mode][lsp]]
+ [[https://github.com/emacs-lsp/lsp-python-ms][lsp-python-ms]]* + [[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: + Python virtual environments install instructions at:
+ [[https://github.com/pyenv/pyenv][pyenv]] + [[https://github.com/pyenv/pyenv][pyenv]]
+ [[https://conda.io/en/latest/][Conda]] + [[https://conda.io/en/latest/][Conda]]
+ [[https://python-poetry.org/][Poetry]]
+ ~pipenv~ requires [[https://pipenv.readthedocs.io/en/latest/][pipenv]] + ~pipenv~ requires [[https://pipenv.readthedocs.io/en/latest/][pipenv]]

View file

@ -280,6 +280,11 @@ called.")
'append)) 'append))
(use-package! poetry
:when (featurep! +poetry)
:after python)
(use-package! lsp-python-ms (use-package! lsp-python-ms
:when (featurep! +lsp) :when (featurep! +lsp)
:after lsp-clients :after lsp-clients

View file

@ -20,6 +20,10 @@
(unless (executable-find "conda") (unless (executable-find "conda")
(warn! "Couldn't find conda in your PATH"))) (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) (when (featurep! +cython)
(unless (executable-find "cython") (unless (executable-find "cython")
(warn! "Couldn't find cython. cython-mode will not work."))) (warn! "Couldn't find cython. cython-mode will not work.")))

View file

@ -24,6 +24,8 @@
(package! pyenv-mode :pin "aec6f2aa28")) (package! pyenv-mode :pin "aec6f2aa28"))
(when (featurep! +conda) (when (featurep! +conda)
(package! conda :pin "335474e409")) (package! conda :pin "335474e409"))
(when (featurep! +poetry)
(package! poetry :pin "6dcc9d22ca"))
;; Testing frameworks ;; Testing frameworks
(package! nose :pin "f852829751") (package! nose :pin "f852829751")

View file

@ -13,8 +13,8 @@
:config :config
(set-repl-handler! 'racket-mode #'+racket/open-repl) (set-repl-handler! 'racket-mode #'+racket/open-repl)
(set-lookup-handlers! 'racket-mode (set-lookup-handlers! 'racket-mode
:definition #'racket-visit-definition :definition #'racket-xp-visit-definition
:documentation #'racket-describe) :documentation #'racket-xp-describe)
(set-docsets! 'racket-mode "Racket") (set-docsets! 'racket-mode "Racket")
(set-pretty-symbols! 'racket-mode (set-pretty-symbols! 'racket-mode
:lambda "lambda" :lambda "lambda"

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; lang/racket/packages.el ;;; lang/racket/packages.el
(package! racket-mode :pin "bd4c8cf3ce") (package! racket-mode :pin "202cc1b784")

View file

@ -1,5 +1,50 @@
;;; lang/scheme/autoload.el -*- lexical-binding: t; -*- ;;; 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_")))
(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))))
(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 "\\`define" function)))
(lisp-indent-defform state indent-point))
;; NOTE Added this clause to handle alignment of keyword symbols
((and (null method)
(> (length function) 1)
(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 ;;;###autoload
(defun +scheme/open-repl (&optional arg) (defun +scheme/open-repl (&optional arg)
"Open the Scheme REPL." "Open the Scheme REPL."

View file

@ -1,17 +1,20 @@
;;; lang/scheme/config.el -*- lexical-binding: t; -*- ;;; lang/scheme/config.el -*- lexical-binding: t; -*-
;;;###package scheme (use-package! scheme
(add-hook 'scheme-mode-hook #'rainbow-delimiters-mode) :hook (scheme-mode . rainbow-delimiters-mode)
:config (advice-add #'scheme-indent-function :override #'+scheme-scheme-indent-function-a))
(use-package! geiser (use-package! geiser
:defer t :hook (scheme-mode . geiser-mode)
:init :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) (unless (featurep! :lang racket)
(push 'racket geiser-active-implementations)) (push 'racket geiser-active-implementations))
(after! scheme ; built-in (after! scheme ; built-in
(set-repl-handler! 'scheme-mode '+scheme/open-repl) (set-repl-handler! 'scheme-mode #'+scheme/open-repl)
(set-eval-handler! 'scheme-mode #'geiser-eval-region) (set-eval-handler! 'scheme-mode #'geiser-eval-region)
(set-lookup-handlers! 'scheme-mode (set-lookup-handlers! 'scheme-mode
:definition #'geiser-edit-symbol-at-point :definition #'geiser-edit-symbol-at-point
@ -22,24 +25,32 @@
( "\\* [A-Za-z0-9_-]+ REPL \\*" :quit nil))) ( "\\* [A-Za-z0-9_-]+ REPL \\*" :quit nil)))
(map! :localleader (map! :localleader
:map scheme-mode-map :map scheme-mode-map
"'" #'geiser-mode-switch-to-repl "'" #'geiser-mode-switch-to-repl
"s" #'geiser-set-scheme "\"" #'geiser-connect
"[" #'geiser-squarify
"\\" #'geiser-insert-lambda
"s" #'geiser-set-scheme
(:prefix ("e" . "eval") (:prefix ("e" . "eval")
"b" #'geiser-eval-buffer "b" #'geiser-eval-buffer
"B" #'geiser-eval-buffer-and-go "B" #'geiser-eval-buffer-and-go
"e" #'geiser-eval-definition "e" #'geiser-eval-last-sexp
"E" #'geiser-eval-definition-and-go "d" #'geiser-eval-definition
"D" #'geiser-eval-definition-and-go
"r" #'geiser-eval-region "r" #'geiser-eval-region
"R" #'geiser-eval-region-and-go) "R" #'geiser-eval-region-and-go)
(:prefix ("h" . "help") (:prefix ("h" . "help")
"d" 'geiser-autodoc) "d" #'geiser-autodoc
;; TODO add more help keybindings "<" #'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") (:prefix ("r" . "repl")
"b" #'geiser-switch-to-repl "b" #'geiser-switch-to-repl
"q" #'geiser-repl-exit "q" #'geiser-repl-exit
"l" #'geiser-load-current-buffer
"r" #'geiser-restart-repl "r" #'geiser-restart-repl
"R" #'geiser-reload "R" #'geiser-reload
"c" #'geiser-repl-clear-buffer))) "c" #'geiser-repl-clear-buffer)))

View file

@ -12,7 +12,7 @@
:mode "\\.svelte\\'" :mode "\\.svelte\\'"
:mode "\\.vue\\'" :mode "\\.vue\\'"
:mode "\\.twig\\'" :mode "\\.twig\\'"
:mode "\\.jinja\\'" :mode "\\.jinja2?\\'"
:mode "wp-content/themes/.+/.+\\.php\\'" :mode "wp-content/themes/.+/.+\\.php\\'"
:mode "templates/.+\\.php\\'" :mode "templates/.+\\.php\\'"
;; REVIEW We associate TSX files with `web-mode' because `typescript-mode' ;; REVIEW We associate TSX files with `web-mode' because `typescript-mode'

View file

@ -14,8 +14,8 @@
(setq-hook! 'rjsx-mode-hook emmet-expand-jsx-className? t) (setq-hook! 'rjsx-mode-hook emmet-expand-jsx-className? t)
(map! :map emmet-mode-keymap (map! :map emmet-mode-keymap
:v [tab] #'emmet-wrap-with-markup :v [tab] #'emmet-wrap-with-markup
:i [tab] #'+web/indent-or-yas-or-emmet-expand [tab] #'+web/indent-or-yas-or-emmet-expand
:i "M-E" #'emmet-expand-line)) "M-E" #'emmet-expand-line))
;; ;;

View file

@ -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.

View file

@ -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))

View file

@ -0,0 +1,4 @@
;; -*- no-byte-compile: t; -*-
;;; lang/yaml/packages.el
(package! yaml-mode :pin "cecf4b106b")

View file

@ -6,7 +6,7 @@
"TODO" "TODO"
(interactive "<fsh><!>") (interactive "<fsh><!>")
(let ((buffer (+eshell-last-buffer)) (let ((buffer (+eshell-last-buffer))
(command (+evil-resolve-vim-path-a command))) (command (+evil-replace-filename-modifiers-a command)))
(cond (buffer (cond (buffer
(select-window (get-buffer-window buffer)) (select-window (get-buffer-window buffer))
(+eshell-run-command command buffer)) (+eshell-run-command command buffer))

View file

@ -48,7 +48,7 @@ You should use `set-eshell-alias!' to change this.")
;; ;;
;; Packages ;;; Packages
(after! eshell ; built-in (after! eshell ; built-in
(setq eshell-banner-message (setq eshell-banner-message

View file

@ -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 1. You can use =M-x vterm-module-compile= to let emacs automatically compile and
install the module. 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. *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 2. You can compile and install the module yourself. Go to the vterm installation

View file

@ -2,25 +2,26 @@
(use-package! vterm (use-package! vterm
:when (bound-and-true-p module-file-suffix) :when (bound-and-true-p module-file-suffix)
:commands (vterm vterm-mode) :commands vterm vterm-mode
:preface (setq vterm-install t) :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 :config
(set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0) (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 (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 confirm-kill-processes nil
;; Prevent premature horizontal scrolling ;; Prevent premature horizontal scrolling
hscroll-margin 0) 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) (when (featurep! :editor evil)
(add-hook! 'vterm-mode-hook (add-hook! 'vterm-mode-hook
(defun +vterm-init-remember-point-h () (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-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 '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))

View file

@ -3,4 +3,4 @@
(package! vterm (package! vterm
:built-in 'prefer :built-in 'prefer
:pin "996c535b9c") :pin "aa512b8351")

View file

@ -25,36 +25,6 @@
gdb-many-windows t) gdb-many-windows t)
(use-package! dap-mode
:when (featurep! :tools lsp)
:after lsp-mode
:preface
(add-hook 'dap-mode-hook #'dap-ui-mode) ; use a hook so users can remove it
(setq dap-breakpoints-file (concat doom-etc-dir "dap-breakpoints")
dap-utils-extension-path (concat doom-etc-dir "dap-extension/"))
:config
(dap-mode 1)
(dolist (module '(((:lang . cc) ccls dap-lldb dap-gdb-lldb)
((:lang . elixir) elixir-mode dap-elixir)
((:lang . go) go-mode dap-go)
((:lang . java) lsp-java dap-java)
((:lang . php) php-mode dap-php)
((:lang . python) python dap-python)
((:lang . ruby) ruby-mode dap-ruby)
((:lang . rust) rust-mode dap-lldb)))
(when (doom-module-p (caar module) (cdar module) '+lsp)
(with-eval-after-load (nth 1 module)
(mapc #'require (cddr module)))))
(when (featurep! :lang javascript +lsp)
(with-eval-after-load 'js2-mode
(require 'dap-node)
(require 'dap-chrome)
(require 'dap-firefox)
(when IS-WINDOWS
(require 'dap-edge)))))
(use-package! realgud (use-package! realgud
:defer t :defer t
:init :init
@ -116,3 +86,41 @@
(if cmd-buf (switch-to-buffer cmd-buf)) (if cmd-buf (switch-to-buffer cmd-buf))
(message "Error running command: %s" (mapconcat #'identity cmd-args " ")))) (message "Error running command: %s" (mapconcat #'identity cmd-args " "))))
cmd-buf))) cmd-buf)))
(use-package! dap-mode
:when (featurep! +lsp)
:hook (dap-mode . dap-tooltip-mode)
:after lsp-mode
:demand t
:preface
(setq dap-breakpoints-file (concat doom-etc-dir "dap-breakpoints")
dap-utils-extension-path (concat doom-etc-dir "dap-extension/"))
:config
(dolist (module '(((:lang . cc) ccls dap-lldb dap-gdb-lldb)
((:lang . elixir) elixir-mode dap-elixir)
((:lang . go) go-mode dap-go)
((:lang . java) lsp-java dap-java)
((:lang . php) php-mode dap-php)
((:lang . python) python dap-python)
((:lang . ruby) ruby-mode dap-ruby)
((:lang . rust) rust-mode dap-lldb)))
(when (doom-module-p (caar module) (cdar module) '+lsp)
(with-eval-after-load (nth 1 module)
(mapc #'require (cddr module)))))
(when (featurep! :lang javascript +lsp)
(with-eval-after-load 'js2-mode
(require 'dap-node)
(require 'dap-chrome)
(require 'dap-firefox)
(when IS-WINDOWS
(require 'dap-edge))))
(dap-mode 1))
(use-package! dap-ui-mode
:when (featurep! +lsp)
:hook (dap-mode . dap-ui-mode)
:hook (dap-ui-mode . dap-ui-controls-mode))

View file

@ -1,9 +1,10 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; tools/debugger/packages.el ;;; tools/debugger/packages.el
(when (package! realgud :pin "94f2835933") (when (package! realgud :pin "b854e040e0")
(when (featurep! :lang javascript) (when (featurep! :lang javascript)
(package! realgud-trepan-ni :pin "6e9cac5e80"))) (package! realgud-trepan-ni :pin "6e9cac5e80")))
(when (featurep! :tools lsp) (when (featurep! +lsp)
(package! dap-mode :pin "e2086fc9fb")) (package! dap-mode :pin "0b9c8f28ad")
(package! posframe :pin "e62e584268"))

View file

@ -1,4 +1,4 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; tools/ein/packages.el ;;; tools/ein/packages.el
(package! ein :pin "c0147f63c7") (package! ein :pin "1322d8c7f8")

View file

@ -25,13 +25,14 @@
- [[#commands][Commands]] - [[#commands][Commands]]
* Description * Description
Integrates with code navigation and documentation tools to help you quickly look This module adds code navigation and documentation lookup tools to help you
up definitions, references and documentation. quickly look up definitions, references, documentation, dictionary definitions
or synonyms.
+ Jump-to-definition and find-references implementations that just work. + Jump-to-definition and find-references implementations that just work.
+ Powerful xref integration for languages that support it. + Powerful xref integration for languages that support it.
+ Documentation lookup for a variety of online sources (like devdocs.io, + Search online providers like devdocs.io, stackoverflow, google, duckduckgo or
stackoverflow or youtube). youtube (duckduckgo and google have live suggestions).
+ Integration with Dash.app docsets. + Integration with Dash.app docsets.
+ Support for online (and offline) dictionaries and thesauruses. + Support for online (and offline) dictionaries and thesauruses.
@ -43,14 +44,27 @@ up definitions, references and documentation.
** Plugins ** Plugins
+ [[https://github.com/jacktasia/dumb-jump][dumb-jump]] + [[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/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 * Prerequisites
This module has several soft dependencies: This module has several soft dependencies:
+ ~ripgrep~ as a last-resort fallback for jump-to-definition/find-references. + ~ripgrep~ as a last-resort fallback for jump-to-definition/find-references.
+ ~sqlite3~ for Dash docset support. + ~sqlite3~ for Dash docset support (if you have =+docsets= enabled)
+ ~wordnet~ for offline dictionary and thesaurus support. + ~wordnet~ for offline dictionary and thesaurus support (if you have
=+dictionary +offline= enabled).
** MacOS ** MacOS
#+BEGIN_SRC sh #+BEGIN_SRC sh

View file

@ -104,6 +104,7 @@ Dictionary.app behind the scenes to get definitions.")
:commands dumb-jump-result-follow :commands dumb-jump-result-follow
:config :config
(setq dumb-jump-default-project doom-emacs-dir (setq dumb-jump-default-project doom-emacs-dir
dumb-jump-prefer-searcher 'rg
dumb-jump-aggressive nil dumb-jump-aggressive nil
dumb-jump-selector dumb-jump-selector
(cond ((featurep! :completion ivy) 'ivy) (cond ((featurep! :completion ivy) 'ivy)
@ -136,12 +137,17 @@ Dictionary.app behind the scenes to get definitions.")
(use-package! ivy-xref (use-package! ivy-xref
:when (featurep! :completion ivy) :when (featurep! :completion ivy)
:config :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 (use-package! helm-xref
:when (featurep! :completion helm) :when (featurep! :completion helm)))
:config (setq xref-show-xrefs-function (if EMACS27+ #'helm-xref-show-xrefs-27 #'helm-xref-show-xrefs))))
;; ;;
@ -172,11 +178,10 @@ See https://github.com/magit/ghub/issues/81"
(let ((gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")) (let ((gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3"))
(funcall orig-fn url))) (funcall orig-fn url)))
(use-package! helm-dash (cond ((featurep! :completion helm)
:when (featurep! :completion helm)) (require 'helm-dash nil t))
((featurep! :completion ivy)
(use-package! counsel-dash (require 'counsel-dash nil t))))
:when (featurep! :completion ivy)))
;; ;;

View file

@ -8,7 +8,7 @@
(package! helm)) (package! helm))
;; ;;
(package! dumb-jump :pin "e8e9b0c2d1") (package! dumb-jump :pin "d760aa880f")
(when (featurep! :completion ivy) (when (featurep! :completion ivy)
(package! ivy-xref :pin "3d4c35fe2b")) (package! ivy-xref :pin "3d4c35fe2b"))
(when (featurep! :completion helm) (when (featurep! :completion helm)
@ -27,8 +27,13 @@
(when (featurep! +dictionary) (when (featurep! +dictionary)
(if IS-MAC (if IS-MAC
(package! osx-dictionary :pin "1b79ff64c7") (package! osx-dictionary :pin "1b79ff64c7")
(package! define-word :pin "d8c76d503b") (package! define-word :pin "08c71b1ff4")
(package! powerthesaurus :pin "81a262ec0c") ;; 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 "81a262ec0c")
(when (featurep! +offline) (when (featurep! +offline)
(package! wordnut :pin "feac531404") (package! wordnut :pin "feac531404")
(package! synosaurus :pin "14d34fc92a")))) (package! synosaurus :pin "14d34fc92a"))))

View file

@ -213,6 +213,39 @@ auto-killed (which is a potentially expensive process)."
:references 'lsp-ui-peek-find-references))) :references 'lsp-ui-peek-find-references)))
(use-package! company-lsp
:defer t
:config
(setq company-lsp-cache-candidates 'auto)
;; HACK Fix tigersoldier/company-lsp#128 causing company-lsp results to
;; display candidates that are unrelated to the prefix. Source:
;; emacs-lsp/lsp-python-ms#79
(add-to-list 'company-lsp-filter-candidates '(mspyls . t))
(defadvice! +company---fix-lsp-caching-on-competion-a (response prefix)
:override #'company-lsp--on-completion
(let* ((incomplete (and (hash-table-p response) (gethash "isIncomplete" response)))
(items (cond ((hash-table-p response) (gethash "items" response))
((sequencep response) response)))
(candidates (mapcar (lambda (item)
(company-lsp--make-candidate item prefix))
(lsp--sort-completions items)))
(server-id (lsp--client-server-id (lsp--workspace-client lsp--cur-workspace)))
(should-filter (or
;; CHANGE BEGIN
(eq company-lsp-cache-candidates t)
;; CHANGE END
(and (null company-lsp-cache-candidates)
(company-lsp--get-config company-lsp-filter-candidates server-id)))))
(when (null company-lsp--completion-cache)
(add-hook 'company-completion-cancelled-hook #'company-lsp--cleanup-cache nil t)
(add-hook 'company-completion-finished-hook #'company-lsp--cleanup-cache nil t))
(when (eq company-lsp-cache-candidates 'auto)
(company-lsp--cache-put prefix (company-lsp--cache-item-new candidates incomplete)))
(if should-filter
(company-lsp--filter-candidates candidates prefix)
candidates))))
(use-package! helm-lsp (use-package! helm-lsp
:when (featurep! :completion helm) :when (featurep! :completion helm)
:commands helm-lsp-workspace-symbol helm-lsp-global-workspace-symbol) :commands helm-lsp-workspace-symbol helm-lsp-global-workspace-symbol)

View file

@ -1,11 +1,11 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; tools/lsp/packages.el ;;; tools/lsp/packages.el
(package! lsp-mode :pin "6671128422") (package! lsp-mode :pin "4898d35ace")
(package! lsp-ui :pin "242dfe859c") (package! lsp-ui :pin "242dfe859c")
(when (featurep! :completion company) (when (featurep! :completion company)
(package! company-lsp :pin "f921ffa0cd")) (package! company-lsp :pin "f921ffa0cd"))
(when (featurep! :completion ivy) (when (featurep! :completion ivy)
(package! lsp-ivy :pin "a6b7841e08")) (package! lsp-ivy :pin "81e81ced99"))
(when (featurep! :completion helm) (when (featurep! :completion helm)
(package! helm-lsp :pin "46a72f5af1")) (package! helm-lsp :pin "db243993ea"))

View file

@ -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.

View file

@ -1,8 +1,5 @@
;;; tools/magit/config.el -*- lexical-binding: t; -*- ;;; tools/magit/config.el -*- lexical-binding: t; -*-
;;
;;; Packages
(use-package! magit (use-package! magit
:commands magit-file-delete :commands magit-file-delete
:defer-incrementally (dash f s with-editor git-commit package eieio lv transient) :defer-incrementally (dash f s with-editor git-commit package eieio lv transient)
@ -92,11 +89,12 @@
(use-package! forge (use-package! forge
:when (featurep! +forge)
;; We defer loading even further because forge's dependencies will try to ;; We defer loading even further because forge's dependencies will try to
;; compile emacsql, which is a slow and blocking operation. ;; compile emacsql, which is a slow and blocking operation.
:after-call magit-status :after-call magit-status
:commands forge-create-pullreq forge-create-issue :commands forge-create-pullreq forge-create-issue
:init :preface
(setq forge-database-file (concat doom-etc-dir "forge/forge-database.sqlite")) (setq forge-database-file (concat doom-etc-dir "forge/forge-database.sqlite"))
:config :config
;; All forge list modes are derived from `forge-topic-list-mode' ;; 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" (message (concat "Failed to build emacsql; forge may not work correctly.\n"
"See *Compile-Log* buffer for details")) "See *Compile-Log* buffer for details"))
;; HACK Due to changes upstream, forge doesn't initialize completely if ;; HACK Due to changes upstream, forge doesn't initialize completely if
;; it doesn't find `emacsql-sqlite-executable', so we have to do it ;; it doesn't find `emacsql-sqlite-executable', so we have to do it
;; manually after installing it. ;; manually after installing it.
(setq forge--sqlite-available-p t) (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-pullreqs nil t)
(magit-add-section-hook 'magit-status-sections-hook 'forge-insert-issues 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 (setq evil-magit-state 'normal
evil-magit-use-z-for-folds t) evil-magit-use-z-for-folds t)
:config :config
(unmap! magit-mode-map (undefine-key! magit-mode-map
;; Replaced by z1, z2, z3, etc ;; Replaced by z1, z2, z3, etc
"M-1" "M-2" "M-3" "M-4" "M-1" "M-2" "M-3" "M-4"
"1" "2" "3" "4" "1" "2" "3" "4"

Some files were not shown because too many files have changed in this diff Show more