141 lines
5.2 KiB
Markdown
141 lines
5.2 KiB
Markdown
# foreplay.vim
|
|
|
|
There's a REPL in foreplay, but you probably wouldn't have noticed if I hadn't
|
|
told you. Such is the way with foreplay.vim. By the way, this plugin is for
|
|
Clojure.
|
|
|
|
## Installation
|
|
|
|
You'll need a set of Clojure runtime files.
|
|
[VimClojure](http://www.vim.org/scripts/script.php?script_id=2501) is popular.
|
|
You don't need to bother with the interactive setup.
|
|
|
|
If you don't have a preferred installation method, I recommend
|
|
installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and
|
|
then simply copy and paste:
|
|
|
|
cd ~/.vim/bundle
|
|
git clone git://github.com/tpope/vim-foreplay.git
|
|
git clone git://github.com/vim-scripts/VimClojure.git
|
|
|
|
Once help tags have been generated, you can view the manual with
|
|
`:help foreplay`.
|
|
|
|
## Features
|
|
|
|
This list isn't exhaustive; see the `:help` for details. Any snark resembling
|
|
actual plugins is purely coincidental.
|
|
|
|
### Transparent setup
|
|
|
|
Foreplay.vim talks to nREPL. With Leiningen 2, it connects automatically
|
|
based on `target/repl-port`, otherwise it's just a `:Connect` away. You can
|
|
connect to multiple instances of nREPL for different projects, and it will
|
|
use the right one automatically.
|
|
|
|
You don't need a custom built nailgun client. You don't need a lein plugin.
|
|
You don't need to run some specialized server in a separate terminal, then
|
|
kill and restart it each time you switch projects because the port is hard
|
|
coded.
|
|
|
|
Oh, and if you don't have an nREPL connection, it falls back to using
|
|
`java clojure.main`, using a class path based on your Leiningen or Maven
|
|
config. It's a bit slow, but a two second delay its vastly preferable to
|
|
being forced out of my flow for a single command, in my book.
|
|
|
|
### Not quite a REPL
|
|
|
|
You know that one plugin that provides a REPL in a split window and works
|
|
absolutely flawlessly, never breaking just because you did something innocuous
|
|
like backspace through part of the prompt? No? Such a shame, you really
|
|
would have liked it.
|
|
|
|
I've taken a different approach in foreplay.vim. `cq` (Think "Clojure
|
|
Quasi-REPL") is the prefix for a set of commands that bring up a *command-line
|
|
window* — the same thing you get when you hit `q:` — but set up for Clojure
|
|
code.
|
|
|
|
`cqq` prepopulates the command-line window with the expression under the
|
|
cursor. `cqc` gives you a blank line in insert mode.
|
|
|
|
### Evaluating from the buffer
|
|
|
|
Standard stuff here. `:Eval` evaluates a range (`:%Eval` gets the whole
|
|
file), `:Require` requires a namespace with `:reload` (`:Require!` does
|
|
`:reload-all`), either the current buffer or a given argument. There's a `cp`
|
|
operator that evaluates a given motion (`cpp` for the expression under the
|
|
cursor).
|
|
|
|
### Navigating and Comprehending
|
|
|
|
I'm new to Clojure, so stuff that helps me understand code is a top priority.
|
|
|
|
* `:Source`, `:Doc`, `:FindDoc`, and `:Apropros`, which map to the underlying
|
|
`clojure.repl` macro (with tab complete, of course).
|
|
|
|
* `K` is mapped to look up the symbol under the cursor with `doc`.
|
|
|
|
* `[d` is mapped to look up the symbol under the cursor with `source`.
|
|
|
|
* `[<C-D>` jumps to the definition of a symbol (even if it's inside a jar
|
|
file).
|
|
|
|
* `gf`, everybody's favorite "go to file" command, works on namespaces.
|
|
|
|
Where possible, I favor enhancing built-ins over inventing a bunch of
|
|
`<Leader>` maps.
|
|
|
|
### Omnicomplete
|
|
|
|
Because why not? It works in the quasi-REPL too.
|
|
|
|
### FAQ
|
|
|
|
> Why does it take so long for Vim to startup?
|
|
|
|
The short answer is because the JVM is slow.
|
|
|
|
The first time you load a Clojure file from any given project, foreplay.vim
|
|
sets about trying to determine your class path, leveraging either
|
|
`lein classpath` or `mvn dependency:build-classpath`. This takes a couple of
|
|
seconds or so in the best case scenario, and potentially much longer if it
|
|
decides to hit the network. (I don't understand why "tell me the class path"
|
|
requires hitting the network, but what do I know?)
|
|
|
|
Because the class path is oh-so-expensive to retrieve, foreplay.vim caches it
|
|
in `g:CLASSPATH_CACHE`. By default, this disappears when you exit Vim, but
|
|
you can save it across sessions in `.viminfo` with this handy option:
|
|
|
|
set viminfo+=!
|
|
|
|
The cache is expired when the timestamp on `project.clj` or `pom.xml` changes.
|
|
|
|
## Contributing
|
|
|
|
More than any other plugin, I'm in over my head here. I tried to do my
|
|
homework, but you don't learn best practices overnight. Please, open
|
|
[GitHub issues][] for bug reports and feature requests. Even better than a
|
|
feature request is just to tell me the pain you're experiencing, and perhaps
|
|
some ideas for what might eliminate it. I know Vimscript; you know Clojure.
|
|
Let's synergize.
|
|
|
|
I'm a stickler for [commit messages][], so if you send me a pull request
|
|
request with so much as superfluous period in the subject line, I will
|
|
reject it, then TP your house.
|
|
|
|
[GitHub issues]: http://github.com/tpope/vim-foreplay/issues
|
|
[commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
|
|
|
## Self-Promotion
|
|
|
|
Like foreplay.vim? Follow the repository on
|
|
[GitHub](https://github.com/tpope/vim-foreplay). And if
|
|
you're feeling especially charitable, follow [tpope](http://tpo.pe/) on
|
|
[Twitter](http://twitter.com/tpope) and
|
|
[GitHub](https://github.com/tpope).
|
|
|
|
## License
|
|
|
|
Copyright © Tim Pope. Distributed under the same terms as Vim itself.
|
|
See `:help license`.
|