Ⅰ. 插件描述
projectionist.vim: Granular project configurationⅡ. 基本信息
|
Ⅲ. 安装方法
使用Vundle管理器安装
在你的.vimrc下添加:Plugin 'tpope/vim-projectionist'
… 然后在Vim中运行以下命令:
:source %
:PluginInstall
对于Vundle版本 < 0.10.2,请用上面的Bundle替换Plugin。
使用NeoBundle管理器安装
在你的.vimrc下添加:NeoBundle 'tpope/vim-projectionist'
… 然后在Vim中运行以下命令:
:source %
:NeoBundleInstall
使用VimPlug管理器安装
在你的.vimrc下添加:Plug 'tpope/vim-projectionist'
… 然后在Vim中运行以下命令:
:source %
:PlugInstall
使用Pathogen管理器安装
在终端中运行以下命令:cd ~/.vim/bundle
git clone https://github.com/tpope/vim-projectionist
Ⅳ. 文档说明
# 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.bash
As you can see, rbenv plugins have hooks in etc/rbenv.d/
and commands inbin/
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.
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 editplugin/projectionist.vim
and :Edoc projectionist
to editdoc/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 thatsplit
, 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.
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.
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 for an example
of another tool that uses it.
License
Copyright © Tim Pope. Distributed under the same terms as Vim itself.
See :help license
.