Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tpope/vim-projectionist
projectionist.vim: Granular project configuration
https://github.com/tpope/vim-projectionist
Last synced: 28 days ago
JSON representation
projectionist.vim: Granular project configuration
- Host: GitHub
- URL: https://github.com/tpope/vim-projectionist
- Owner: tpope
- Created: 2014-02-20T20:57:20.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2024-06-22T20:18:54.000Z (5 months ago)
- Last Synced: 2024-10-01T20:43:35.598Z (about 1 month ago)
- Language: Vim Script
- Homepage: https://www.vim.org/scripts/script.php?script_id=4989
- Size: 201 KB
- Stars: 1,055
- Watchers: 13
- Forks: 66
- Open Issues: 29
-
Metadata Files:
- Readme: README.markdown
- Contributing: CONTRIBUTING.markdown
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
README
# projectionist.vim
Projectionist provides granular project configuration using "projections".
What are projections? Let's start with an example.## Example
A while back I went and made a bunch of plugins for working with [rbenv][].
Here's what a couple of them look like:~/.rbenv/plugins $ tree
.
├── rbenv-ctags
│ ├── bin
│ │ └── rbenv-ctags
│ └── etc
│ └── rbenv.d
│ └── install
│ └── ctags.bash
└── rbenv-sentience
└── etc
└── rbenv.d
└── install
└── sentience.bashAs you can see, rbenv plugins have hooks in `etc/rbenv.d/` and commands in
`bin/` matching `rbenv-*`. Here's a projectionist configuration for that
setup:let g:projectionist_heuristics = {
\ "etc/rbenv.d/|bin/rbenv-*": {
\ "bin/rbenv-*": {
\ "type": "command",
\ "template": ["#!/usr/bin/env bash"],
\ },
\ "etc/rbenv.d/*.bash": {"type": "hook"}
\ }
\ }The key in the outermost dictionary says to activate for any directory
containing a subdirectory `etc/rbenv.d/` *or* files matching `bin/rbenv-*`.
The corresponding value contains projection definitions. Here, two
projections are defined. The first creates an `:Ecommand` navigation command
and provides boilerplate to pre-populate new files with, and the second
creates an `:Ehook` command.[rails.vim]: https://github.com/tpope/vim-rails
[rbenv]: https://github.com/sstephenson/rbenv## Features
See `:help projectionist` for the authoritative documentation. Here are some
highlights.### Global and per project projection definitions
In the above example, we used the global `g:projectionist_heuristics` to
declare projections based on requirements in the root directory. If that's
not flexible enough, you can use the autocommand based API, or create a
`.projections.json` in the root of the project.### Navigation commands
Navigation commands encapsulate editing filenames matching certain patterns.
Here are some examples for this very project:{
"plugin/*.vim": {"type": "plugin"},
"autoload/*.vim": {"type": "autoload"},
"doc/*.txt": {"type": "doc"},
"README.markdown": {"type": "doc"}
}With these in place, you could use `:Eplugin projectionist` to edit
`plugin/projectionist.vim` and `:Edoc projectionist` to edit
`doc/projectionist.txt`. If no argument is given, it will edit an alternate
file of that type (see below) or a projection without a glob. So in this
example `:Edoc` would default to editing `README.markdown`.The `E` stands for `edit`. You also get `S`, `V`, and `T` variants that
`split`, `vsplit`, and `tabedit`.Tab complete is smart. Not quite "fuzzy finder" smart but smart nonetheless.
(On that note, fuzzy finders are great, but I prefer the navigation command
approach when there are multiple categories of similarly named files.)### Alternate files
Projectionist provides `:A`, `:AS`, `:AV`, and `:AT` to jump to an "alternate"
file, based on ye olde convention originally established in [a.vim][]. Here's
an example configuration for Maven that allows you to jump between the
implementation and test:{
"src/main/java/*.java": {"alternate": "src/test/java/{}.java"},
"src/test/java/*.java": {"alternate": "src/main/java/{}.java"}
}In addition, the navigation commands (like `:Eplugin` above) will search
alternates when no argument is given to edit a related file of that type.Bonus feature: `:A {filename}` edits a file relative to the root of the
project.[a.vim]: http://www.vim.org/scripts/script.php?script_id=31
### Buffer configuration
Check out these examples for a minimal Ruby project:
{
"*": {"make": "rake"},
"spec/*_spec.rb": {"dispatch": "rspec {file}"}
}That second one sets the default for [dispatch.vim][]. Plugins can use
projections for their own configuration.[dispatch.vim]: https://github.com/tpope/vim-dispatch
## Installation
Install using your favorite package manager, or use Vim's built-in package
support:mkdir -p ~/.vim/pack/tpope/start
cd ~/.vim/pack/tpope/start
git clone https://tpope.io/vim/projectionist.git
vim -u NONE -c "helptags projectionist/doc" -c q## FAQ
> Why not a clearer filename like `.vim_projections.json`?
Nothing about the file is Vim specific. See
[projectionist](https://github.com/glittershark/projectionist) for an example
of another tool that uses it.## License
Copyright © Tim Pope. Distributed under the same terms as Vim itself.
See `:help license`.