Merge branch 'develop' into eshell-improvements
This commit is contained in:
commit
73de701073
112 changed files with 1431 additions and 978 deletions
370
README.md
370
README.md
|
@ -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">
|

|
||||||
<img src="https://github.com/hlissner/doom-emacs/workflows/CI/badge.svg" alt="Build status: develop">
|

|
||||||
</a>
|

|
||||||
<a href="https://discord.gg/qvGgnVx">
|

|
||||||
<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]
|
||||||
</a>
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<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
|
[](http://makeapullrequest.com)
|
||||||
[docs:wiki-modules]: docs/index.org#Module%20List
|
[](https://github.com/bbatsov/emacs-lisp-style-guide)
|
||||||
[docs:wiki-customization]: docs/getting_started.org#Customize
|
[][liberapay]
|
||||||
[docs:contributing]: docs/contributing.org
|
[][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/links/0)
|
||||||
|
[](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/1)
|
||||||
|
[](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/2)
|
||||||
|
[](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/3)
|
||||||
|
[](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/4)
|
||||||
|
[](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/5)
|
||||||
|
[](https://sourcerer.io/fame/hlissner/hlissner/doom-emacs/links/6)
|
||||||
|
[](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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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")))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
11
core/core.el
11
core/core.el
|
@ -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).
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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 ()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)))
|
|
||||||
|
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
;;; lang/assembly/autoload.el -*- lexical-binding: t; -*-
|
|
||||||
|
|
||||||
;;;###autoload
|
|
||||||
(add-to-list 'auto-mode-alist '("\\.hax\\'" . haxor-mode))
|
|
|
@ -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")
|
|
|
@ -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
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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"))
|
|
||||||
|
|
|
@ -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")
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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")
|
||||||
|
|
40
modules/lang/json/README.org
Normal file
40
modules/lang/json/README.org
Normal 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.
|
14
modules/lang/json/config.el
Normal file
14
modules/lang/json/config.el
Normal 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))
|
5
modules/lang/json/packages.el
Normal file
5
modules/lang/json/packages.el
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
;; -*- no-byte-compile: t; -*-
|
||||||
|
;;; lang/json/packages.el
|
||||||
|
|
||||||
|
(package! json-mode :pin "0e819e519a")
|
||||||
|
(package! json-snatcher :pin "c4cecc0a50")
|
|
@ -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))
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))))))
|
|
||||||
|
|
|
@ -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)))))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))))
|
|
||||||
|
|
|
@ -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))))
|
||||||
|
|
14
modules/lang/org/contrib/noter.el
Normal file
14
modules/lang/org/contrib/noter.el
Normal 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)))
|
|
@ -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
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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]]
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.")))
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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."
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
|
38
modules/lang/yaml/README.org
Normal file
38
modules/lang/yaml/README.org
Normal 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.
|
9
modules/lang/yaml/config.el
Normal file
9
modules/lang/yaml/config.el
Normal 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))
|
4
modules/lang/yaml/packages.el
Normal file
4
modules/lang/yaml/packages.el
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
;; -*- no-byte-compile: t; -*-
|
||||||
|
;;; lang/yaml/packages.el
|
||||||
|
|
||||||
|
(package! yaml-mode :pin "cecf4b106b")
|
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
|
||||||
|
|
|
@ -3,4 +3,4 @@
|
||||||
|
|
||||||
(package! vterm
|
(package! vterm
|
||||||
:built-in 'prefer
|
:built-in 'prefer
|
||||||
:pin "996c535b9c")
|
:pin "aa512b8351")
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)))
|
|
||||||
|
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -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"))))
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
60
modules/tools/magit/README.org
Normal file
60
modules/tools/magit/README.org
Normal 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.
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue