doomemacs/README.md

143 lines
6.2 KiB
Markdown
Raw Normal View History

2015-06-14 17:26:03 +02:00
# NARF Emacs
2016-01-23 21:10:40 -05:00
![Screenshot](/../screenshots/main.png?raw=true)
2015-06-14 17:26:03 +02:00
> What we do every night, Pinky...
2016-02-26 09:30:41 -05:00
This is an Emacs configuration for stubborn vimmers and megalomaniacal mice alike. It
2016-01-23 20:38:12 -05:00
strives to emulate vim as best it can, and surpass it in any way possible.
2015-06-14 17:26:03 +02:00
2016-02-26 09:30:41 -05:00
It is tailored to my needs as an software developer (app, game, and web), data scientist,
and writer running OSX and Emacs **24.5+**.
2015-06-14 17:26:03 +02:00
## Installation
```
2015-09-30 13:52:30 -04:00
brew install cask
2016-02-26 09:30:41 -05:00
brew tap railwaycat/emacsmacport
brew install emacs-mac --with-imagemagick --with-modern-icon
git clone --depth 1 https://github.com/hlissner/emacs.d ~/.emacs.d
2015-06-14 17:26:03 +02:00
cd ~/.emacs.d
make # installs plugins via cask and generates autoloads
```
2016-02-26 09:30:41 -05:00
And to optionally:
2016-01-23 20:38:12 -05:00
2016-02-26 09:30:41 -05:00
```
make compile # optionally byte-compiles everything
make snippets # install hlissner/emacs-snippets into private/snippets
```
2016-01-23 20:38:12 -05:00
2015-06-14 17:26:03 +02:00
## Features
2016-01-23 20:38:12 -05:00
To get a picture of what's in here, check out:
2015-12-12 03:18:14 -05:00
2016-02-26 09:30:41 -05:00
* **[The Caskfile](Cask)**: lists installed plugins and where they're configured.
* **[init.el](init.el)**: lists all loaded modules
* **[private/my-bindings.el]**: most of the custom keybinds
* **[private/my-commands.el]**: available custom ex commands
2015-12-12 03:18:14 -05:00
### Basic
* Modal editing with **evil-mode**
2016-02-26 09:30:41 -05:00
* Pretty line numbers with **nlinum** and neckbearded hackery
2015-12-12 03:18:14 -05:00
* Syntax checking with **Flycheck**
* Completion with **company-mode**
* Pretty mode-line with **spaceline**
* Project navigation with **helm** and **neotree**
* Session persistence (and tab emulation) with **workgroups2**
* Run code inline with **quickrun**
2016-02-26 09:30:41 -05:00
* On-demand REPLs for many major modes with **repl-toggle**, including Ruby, Python,
PHP, JS, Elisp, and Lua.
2015-12-12 03:18:14 -05:00
* 2-char searching with **evil-snipe**
* Display diffs in the margin with **git-gutter**
2016-02-26 09:30:41 -05:00
* Repeat (most) motions with <kbd>SPC</kbd>
* Snippet expansion with **yasnippet**
2015-12-12 03:18:14 -05:00
* File template support with **auto-insert** and **yasnippet**
* Code folding with **hideshow**; doesn't allow arbitrary folds though
2016-02-26 09:30:41 -05:00
* Multiple cursors with **[evil-multiedit]**
2015-12-12 03:18:14 -05:00
* O/S interaction functions, like **os-reveal** and **os-open-in-browser**
2016-02-26 18:00:56 -05:00
* Custom TODO, FIXME and NOTE highlighting
2016-02-26 09:30:41 -05:00
* **big-mode** for presentations and demonstrations
* Tmux integration with `:t` and `:tcd` ex commands
2015-12-12 03:18:14 -05:00
### Advanced
2016-01-23 20:38:12 -05:00
* **Popup control with Shackle**: I've (mostly) tamed window popups in Emacs with
Shackle (popwin was unstable and slow), that includes those made by: Helm,
vc-annotate, quickrun, neotree, \*messages\*, org-mode--and others.
2015-12-12 03:18:14 -05:00
* **Ex compatibility**: I've given quite a few plugins an Ex interface. For instance,
2016-01-23 20:38:12 -05:00
`:t [ARGS]` and `:tcd` for tmux, `:ag [KEYWORDS]` for helm-ag, and `:align [REGEXP]`
2016-02-26 09:30:41 -05:00
for align-regexp. See [private/my-commands.el] for more.
2016-01-23 20:38:12 -05:00
* **Incremental highlighting for `:g[lobal]`**: evil's stock global command does not
do this (`:align` will also highlight matches).
2016-02-26 09:30:41 -05:00
* **A multiple cursor implementation using iedit**: I could never get [evil-mc] working,
and [multiple-cursors] doesn't play nice with evil-mode, so I wrote [evil-multiedit].
2016-02-26 18:52:59 -05:00
To use it, hop into visual mode, select a region and press <kbd>S-r</kbd> (shift-R).
Your edits will apply to all highlighted regions. To limit iedit's scope: while in
iedit mode go into visual, select a range and press <kbd>SPC</kbd>.
2015-12-12 03:18:14 -05:00
* **Rudimentary support for extra =expand(...) symbols in evil-ex**: this includes
`%:[pdert]`, which can be used with ex commands like `:e`, `:w`, or in the expression
register. This *could* be truer to vim, but I haven't gotten around to it.
* **Vim-esque Omni-completion commands**: I've implemented most of the common
omni-completion shortcuts:
2015-12-12 03:18:14 -05:00
```
C-x C-l 'narf/company-whole-lines
2016-02-26 09:30:41 -05:00
C-x C-k 'narf/company-dict-or-keywords
C-x C-f 'company-files
C-x C-] 'company-tags
C-x s 'company-ispell
C-x C-s 'company-yasnippet
C-x C-o 'company-semantic
C-x C-n 'company-dabbrev-code
C-x C-p (lambda (interactive)
(let ((company-selection-wrap-around t))
(call-interactively 'company-dabbrev-code)
(company-select-previous-or-abort))))
2015-12-12 03:18:14 -05:00
```
2016-02-26 09:30:41 -05:00
* **Popup REPLs**: currently supports python (ipython), ruby (pry), php (boris),
2015-12-12 03:18:14 -05:00
elisp (ielm), lua, js (nodejs), and the shell. More support later, hopefully for go
and rust.
* **Yasnippet + auto-insert = file-templates with editable fields**: _and_ it works with
2016-01-29 07:15:19 -05:00
evil-mode! See [core/core-file-templates.el](core/core-file-templates.el) for
configuration details.
2015-12-12 03:18:14 -05:00
* **Tab emulation with Workgroups2**: Workgroups2 will display the tabs in the
2016-01-02 15:17:23 -05:00
minibuffer when you press <kbd>⌘-S-T</kbd>, use `:tabs` or move between "tabs". `gt`
and `gT` work as well.
2015-12-12 03:18:14 -05:00
2016-01-23 21:10:40 -05:00
![Workgroups2 tabs emulation](/../screenshots/tabs.png?raw=true)
2015-12-12 03:18:14 -05:00
2016-01-23 20:38:12 -05:00
⌘-1 - ⌘-9 keybindings work as well.
2015-12-12 03:18:14 -05:00
2016-01-02 15:18:36 -05:00
* **Minimalistic mapping macro**: I liked how concise mapping keys in viml was. I
brought a little of that to Emacs by defining `map!`, a macro for defining keybindings
in as little space as possible. [See my bindings](private/my-bindings.el) for an
example.
2015-12-12 03:18:14 -05:00
* **Modeline improvements**
2016-02-26 09:30:41 -05:00
* **evil-search/iedit/evil-substitute mode-line integration**: I better integrated
Anzu, evil-search, evil-substitute (e.g. `%s/foo/bar`) and
[evil-multiedit](https://github.com/hlissner/evil-multiedit) into the mode-line.
2015-12-12 03:18:14 -05:00
2016-01-23 21:10:40 -05:00
![matches count in mode-line](/../screenshots/search.png?raw=true)
![substitutions count in mode-line](/../screenshots/subst.png?raw=true)
2016-02-26 09:30:41 -05:00
* **Macro-recording indicator**:
2015-12-12 03:18:14 -05:00
2016-01-23 21:10:40 -05:00
![macro indicator in modeline](/../screenshots/macro.png?raw=true)
2016-02-26 09:30:41 -05:00
* **Show (py|rb)env version in mode-line**: see `define-env-command!` on how to set it up
2015-12-12 03:18:14 -05:00
for other modes. It only displays in their respective major-modes.
2016-01-23 21:10:40 -05:00
![py/rb version in modeline](/../screenshots/version.png?raw=true)
2015-06-14 17:26:03 +02:00
## What about Windo-
![Windows, you say...](http://i3.kym-cdn.com/photos/images/newsfeed/000/549/293/504.gif)
2016-02-26 09:30:41 -05:00
[private/my-bindings.el]: private/my-bindings.el
[private/my-commands.el]: private/my-commands.el
[evil-mc]: https://github.com/gabesoft/evil-mc
[multiple-cursors]: https://github.com/magnars/multiple-cursors.el
[evil-multiedit]: https://github.com/hlissner/evil-multiedit