VIM是Linux和Unix下常用的文本编辑工具,在编写代码和阅读代码中经常使用。
但VIM进行代码项目管理时,没有IDE集成开发工具方便,现在提供一个VIM插件Project,可以对代码项目进行简单的集中管理
一、 下载安装
1、 在 Vim 网站上下载最新版本project.tar.gz 或直接下载project-1.4.1.tar.gz
2、 解压缩移动plugin和doc到~/.vim目录(没有~/.vim则自己创建),步骤如下:
mkdir ~/.vim
mv doc ~/.vim
mv plugin ~/.vim
二、Project 使用介绍
1、 打开vim后,敲入命令 :Project,可以看到project的列表(如果没初始化,则为空)
2、 输入C(斜杠+大写的C),会出现下面这些信息
Enter the Name of the Entry: ProjectName (项目名称)
Enter the Absolute Directory to Load: ProjectPath (项目路径目录)
Enter the CD parameter: . (“.”为当前目录)
Enter the File Filter: (符合条件的源文件,一般为空)
三、Project项目管理
1、打开project
vim +Project
或
vim登陆后输入命令 :Project
2、导入文件列表
C(递归读取子目录) c(读取当前文件)
按照提示填写:
Enter the name of the Entry: <Description>
Enter the Absolute Directory to Load: {projpath}
Enter the CD parameter: [{options}] 之一
Enter the File Filter: [{options}] 之一
导入文件列表时忽略{、}、 空行、 #
3、列表显示格式
<Description>={projpath} [{options}] {
[ filename ]
[ project_entry ]
}
<Description>描述
{options}配置参数项
CD={path}
in={filename}
out={filename}
filter="{pat}" 文件类型
flags={flag}
4、打开列表文件
:Project 默认列表文件
:Project {file}
列表文件默认存储地址:~/.vimprojects
5、常用命令
l(列出所有当前层文件)L(递归),按任何键停止
w(关闭当前层文件)W(递归)
g(在项目当前层文件搜索)G(递归)
关闭子文件夹并刷新当前文件夹下文件,R递归打开文件夹并刷新所有文件
s关闭文件夹并创建,S递归打开文件夹并创建
s将文件在水平打开多个窗口显示,打开或关闭文件夹列表
o将文件在一个窗口打开,打开或关闭文件夹列表
v在右窗口显示指针停留在project窗口的文件内容
<space>空格扩大project窗口的宽度,恢复宽度
i显示文件或文件夹的设置参数,如filter="*"
I显示文件或文件夹的决对路径和参数
1 - 9,f1-f9,F1-F9执行指定命令, 查询1-9命令,f0查询f1-f9,F1-F9命令
四、 Project项目管理实例
示例: 导入管理Android源码
1、 打开vim的Project: vim +Project
2、 导入项目: C(即 斜杠 + 大写的C)
Enter the name of the Entry:android
Enter the Absolute Directory to Load: /home/yanggang/ANDROID_SOURCE
Enter the CD parameter:.(直接输入.)
Enter the File Filter:(直接回车)
漫长的加载。。。
示例截图:
用任何编辑器写代码,文件管理的方便与否对编码效率影响很大。一般的IDE都有文件管理功能,并且用来的不错。在vim中,要实现较好的文件管理功能一般都靠插件。在有米实习的第一个月,自己一直用NERDTree来管理文件。开始用起来很爽,因为我的vim终于可以和IDE一样管理我的文件了,但是NERDtree有个明显的缺点,当一个项目的文件系统很复杂时,NERDtree展现出的是节点多到让你蛋疼,这时要打开一个文件相当麻烦,效率低下。碰巧js师兄看到我的vim那么悲催,就介绍了一个项目管理插件,叫project。对于vim来说,这是一个几乎完美的项目管理+文件管理插件,优点就不多写了,谁用谁知道。
project使用法很简单,下面记录下自己常用的几个功能:
首先,用:Project 打开project,不过我喜欢在 .vimrc 中绑定快捷键 nmaprToggleProject ,这个快捷键的功能是按 pr 切换project的打开和关闭状态。
下面用project打开一个项目,打开project后输入下面类似的命令:
myproject=var/www/myproject CD=. filter="*.js *.html *.md" {
|
假设myproject文件中有四个文件:jqurey.js index.html readme.md info.php 和一个子文件夹 child,文件夹child两个文件:test.html和sea.js。把光标停在上两行代码中并按下 刷新,project中应该出现以代码:
myproject=var/www/myproject CD=. filter="*.js *.html *.md" {
|
在project在添加一行,添加后代码如下:
myproject=var/www/myproject CD=. filter="*.js *.html *.md" {
|
再使用/r刷新刚添加的那行,project代码应该如下:
myproject=var/www/myproject CD=. filter="*.js *.html *.md" {
|
上面是使用project打开一个项目的简单完整过程,下面是一些自己常用的命令:
- —reflash光标所在的文件夹
- R—reflash光标所在的文件夹及其子文件夹
- c—create一个项目文件夹
- C—create一个项目文件夹,并会导入期所有子文件夹,项目较大时慎用
- s—如果光标在文件前,用水平分割窗口的方式打开文件,如果光标在文件前,open or close it.
- S—用水平分割窗口的方式打开该文件件的所有文件
- o—打开一个文件,光标会跳到新打开的文件窗口中
- v—代开一个文件,光标不会跳
- vim中默认的maplocalleader是 ,我喜欢在.vimrc设置let maplocalleader=”;”,执行以上命令式使用 ; 代替 。
花了点时间翻译出来,有些地方还不是很清晰明了,主要是有些功能还尚未使用。下载 project中文帮助(也 可以将下文保存成project.txt文件)放到vim的doc目录中,覆盖原来的英文帮助。如果你不想覆盖,你可以把原来的帮助文件移动到上层目录或 其他地方,注意不要重命名放在doc目录下,不然在使用helptags doc目录产生tags时会提示tag重复的警告信息。以后使用: help project 出来的就是中文手册了。时间仓促,翻译的不好,不当或错误之处敬请各位看官指出来。
*project.txt* 一个用来管理多个项目及项目源代码的插件
支持版本: Vim 6.x 及 Vim7.x
最后更新: 2006 年 10 月 13 日 星期五
翻译更新: 2007 年 08 月 16 日 星期五
作者:Aric Blumer
译者:Denven
*project* *project-plugin*
目录:
1.命令..............调出插件.............|project-invoking|
2.继承...........项目层层关系.........|project-inheritance|
3.映射.............插件映射..............|project-mappings|
4.添加映射.......为插件添加映射...|project-adding-mappings|
5.设置..............项目设置.............|project-settings|
6.样例文件..........项目样例..............|project-example|
7.技巧..............使用技巧.................|project-tips|
使用这个插件的基本功能可以为你经常访问的文件提供方便的浏览. 文件会在 Vim 左侧
窗口列出来, 在文件名上按 <Return> 或者双击鼠标就可以打开相应的文件. 这比使用
|file-explorer| 去浏览多层目录要更为便捷.
也可在选择一个文件时候去让插件更改目录, 执行指定都 Vim 脚本. 这些脚本可以通过
修改 $PATH 来设定编译器等的环境. 这在进行多项目开发时可以让 quickfix 工作在不
同的环境中.
其他特性:
o 在项目中实时加载或卸载文件(l, L, w, and W)
o 在项目中所有文件进行全局搜索(g and G)
o 对某一个文件单独执行用户指定的脚本(可以利用这个特写来关联一个文件到
某一个外部程序) (使用1 到 9)
o 对所有文件执行某个用户指定的脚本(使用f1-f9 和 F1-F9)
o 用户高可定制性
o 可以配合 |netrw| 插件使用 XXXX://... 管理远程项目. XXXX 代表 ftp,
rcp, scp, or http.
可以在一个单独的纯本文件中或在 vimrc 中设置几个全局量变进行配置.
必须在 |vimrc| 文件中 set 'nocompatible' 才能使用这个插件. 也可以通过设置变量
"loaded_project" 来禁止插件被加载: >
:let loaded_project = 1
==============================================================================
COMMANDS *project-invoking*
要使用本插件, 只需将其放置到 Vim 的插件目录(~/.vim/plugin)即可. 参见
"|add-global-plugin|", 在下次打开 Vim 时, 输入如下命令 >
:Project
或者 >
:Project {file}
如果没有指定具体的项目文件, 那么会默认使用$HOME/.vimprojects文件.
命令: [g]vim +Project 可在 Vim 启动时同时自动载入project插件窗口.
调出项目窗口时每次只能使用某一个文件, 如果想更改项目, 在项目窗口中运行:bwipe
删除项目缓冲, 然后用 :Project {file} 重新载入新的项目.
可以在同一个文件中保留和显示多个项目, 通过 {} (c参见 |fold.txt|) 来分隔. 在项目
中可以有任意多个嵌套的折叠. {} 中的每一行被当作一个文件名. 空行和 # 号后面的内
容将被忽略.
插件使用 Vim 标准的折叠方式, 支持所有的 |fold-commands| . 例如双击折叠的首行可
以打开或关闭该折叠. 通过光标定位到一个文件名后按回车键或者双击即可打开该文件,
插件会为在右侧打开一个新窗口来显示(如果映射了 |CTRL-W_p|, 也是等价的).
*project-syntax*
*语法*
项目入口描述形式:
project_entry ::=
<Description>={projpath} [{options}] {
[ filename ]
[ project_entry ]
}
{options} 可以是下面的一项或者几项, 但必须放在同一行上.
CD={path}
in={filename}
out={filename}
filter="{pat}"
flags={flag}
注意: 一个项目入口可以包含在另一个项目入口里面, 这意味着可以在项目中设置层次关系.
<Description> 项目描述. 不能含有"="字符. 在 =. 的两边不能有空字符. 它会显示在折叠
行上.
{projpath} 项目路径. 它指向项目文件所在目录, 可以在里面使用环境变量. 如果是一个相
对路径, 插件会根据项目的父目录及其上层目录等层次建立路径, 但最外层的项目入口必须
是一个绝对路径. 参见下面 |project-inheritance|的例子.可以在该项中使用空格, 但是要
转义. 下面的两个例子是针对同一个目录的:
>
Example=/my/directory/with spaces {
}
Example="/my/directory/with spaces" {
}
推荐在 Windows 上这样使用: >
Example="c:My Documents" {
}
而 Vim 很聪明, 这样做也是可以的: >
Example=c:My Documents {
}
CD= 表示在项目中选定一个文件时 Vim 将要进入的目录(相当于使用|:cd|). 这对在需要
使用本地 Makefile 文件进行编译时, 如|:make| 非常有用. 使用 CD=. 表示 Vim 将
{projpath} 及其等价路径设为当前工作目录. 如果不设置 CD 的值将无法中在项目中进
行目录都切换, 注意 "=" 的两边没有空格. CD 参数也可以是来自其父目录下都一个相对
路径. 参考 |project-inheritance| 中的例子. 在使用 |netrw| 浏览项目时该指令将被
忽略. 在 {projpath} 中可以使用空格.
in= 和 out= 用来在进入或者退出文件缓冲时执行特定的 Vim 脚本. (参考 |BufEnter|
和 |BufLeave| 自动命令事件). 它可以使用 Vim 脚本来为项目设定或取消一定的环境.
例如:
in.vim: >
let $PROJECT_HOME='~/my_project'
" Put the compiler in $PATH
if $PATH !~ '/path/to/my/compiler'
let $PATH=$PATH.':/path/to/my/compiler'
endif
out.vim: >
" Remove compiler from $PATH
if $PATH =~ '/path/to/my/compiler'
let $PATH=substitute($PATH, ':/path/to/my/compiler', '', 'g')
endif
在这种情况下, 在合适的环境下可以使用 :make 进行编译你正在编辑的文件. 如果脚本中
使用的是相对路径, If the path to the script is relative, then it is
relative from {projpath}.
如果子项目没有另行设定, 这些指令会被子项目继承. 当配合 |netrw| 插件使用时, in=
和 out= 中的路径必须是绝对路径.
filter= 过滤符. 它指定一个全局的 |glob()| 文件匹配模式. 用于在使用
时更新项目
窗口中的文件列表. 由于可能含有多个文件匹配模式, 必须使用双引号将过滤符号串扩起
来. 如果不设置过滤符号, 插件默认使用通配符 * 来当做过滤符.注意"="前后不能含有空
格. 如果子项目没有指定具体的过滤符, 子项目将会继承父项目的过滤符.
flags= 标识位 为某个折叠设置(启用/取消)具体的特性. 为了记忆方便, 通常使用小写
的表示关闭某一特性, 大写则表示开启某一特性. {flag} 参数可以使用下面的字符标志位:
标志位 描述 ~
l 关闭由 L 的递归. 对于子折叠的同样也被关闭.
r 关闭更新. 当对折叠使用了
or R 后不要进行更新.
它不影响子目录的递归.
S 为刷新和创建项目开启排序功能.
s 关闭刷新和创建项目的排序功能.
T 开启更新项目时折叠处于当前折叠的正下方. 跟在全局变量
g:proj_flags 中使用标志位等效, 但是不能针对多个折叠而言.
t 关闭更新项目时折叠至当前折叠区域的最顶部功能. 强制折叠到底部.
w 关闭 W 的递归. 对于子折叠的同样也被关闭.
在子项目不能沿用父项目中设定的这些标志.
只对当前折叠生效, 折叠外的文字不受其影响.
==============================================================================
INHERITANCE *project-inheritance*
通过下面两个项目文件的对比来理解层次的含义:
>
Parent=~/my_project CD=. filter="Make* *.mk" flags=r {
Child1=c_code {
}
Child2=include CD=. filter="*.h" {
}
}
Child1 的路径是 "~/my_project/c_code", 因为 Child1 继承了 ~/my_project. 它还
继承了 CD. 因为父层的 CD=., 所以对于父层的当前工作路径是 "~/my_project". 那么
Child1 继承过来的 CD 也是"~/my_project". 最后, Child1 从父层继承过来过滤符.
而标志位则是不能继承的,除非单独设置.
Child2 只将 "~/my_project" 从父层继承过来.
所以上述例子跟下面的展开是等价的:
>
Parent=~/my_project CD=. filter="Make* *.mk" flags=r {
Child1=~/my_project/c_code CD=~/my_project filter="Make* *.mk" {
}
Child2=~/my_project/include CD=~/my_project/include filter="*.h" {
}
}
(在一个实际的项目中, Child1 一般不会希望从父层继承过滤符号, 该例子只是为了说明
这个概念而已), 使用 i 可以显示当前光标下项目的层次关系.
==============================================================================
MAPPINGS *project-mappings*
映射 动作 ~
根据过滤符更新光标处的项目. 更新项目, 每深入一层折叠缩进一个空格.
如果在一行最后使用了 "# pragma keep" (不含双引号), 那么该行将保留,
不会被在更新时被删除. 当使用 . 作为一个入口时, 进入当前目录进行浏览
相当方便, 通常对于这个有用的入口你肯定想在更新时被保留.
注意这个映射是 <LocalLeader>r, Vim 默认使用 作为|<LocalLeader>|.
对于使用 |netrw| 浏览的项目不适用.
R 递归执行
.
对于使用 |netrw| 浏览的项目不适用.
c 创建一个项目. 要求用户输入 项目描述, 文件路径, CD 参数, 文件名匹配表达
式 |glob()|. 插件会根据这些信息在光标下面建立一个项目的入口.
对于使用 |netrw| 浏览的项目不适用.
C 为目录及其子目录下的文件递归创建一个项目.
<Return>
在前一窗口或者另外一个新窗口中打开光标处的文件. 如果光标位于折叠上,
按此键打开或关闭折叠.
<S-Return>
s
跟 <Return> 一样, 但会水平分割目标窗口.
使用 <LocalLeader>s 主要是为那些不能识别 <S-Return> 的终端而提供的.
S
加载所有文件到当前窗口, 当前窗口会被水平分割显示所有文件.
<C-Return>
o
同 <Return> 在一个窗口中打开当前文件, 同时关闭其他所有打开的窗口.
该映射保证该文件是除项目窗口以外其他唯一的窗口.
<LocalLeader>o 主要是为那些不能识别 <C-Return> 的终端而提供的.
<M-Return>
v
同 <Return> 仅仅显示文件内容, 而光标依然停留在项目窗口中.
<2-LeftMouse>
(Double-click) 双击鼠标左键, 如果当前光标下是一个已经展开的折叠则关闭
该折叠, 反之打开该折叠. 如果当前光标下为一个文件名, 则在|CTRL-W_p|(前
一窗口)或项目右侧新窗口中打开该文件.
<S-2-LeftMouse>
同 <S-Return>.
<C-2-LeftMouse>
同 <C-Return>.
<RightMouse>
根据变量的值 g:proj_window_increment 增加项目窗口的宽度, 反复点击则为
在原宽度
g:proj_window_width
和增加后的宽度
g:proj_window_width + g:proj_window_increment
之间切换.
是否能够切换原窗口和宽窗口, 或手动改变窗口宽度均取决于全局变量
g:proj_flags 中的标志位 't' 是否设置. (参见|project-flags|).
注意在其他窗口中单击鼠标时右键并不能自动将光标定位到项目窗口.
在离开项目窗口后, 项目窗口宽度会变回到原宽度 g:proj_window_width.
<space> 同 <RightMouse>
<CTRL-Up>
<Up>
移动文本或者折叠到当前光标的上一行. 在有的终端中可能无法识别此绑定而失效.
<LocalLeader><Up> 主要是为那些不能识别 <C-Up> 的终端而提供的.
<CTRL-Down>
<Down>
移动文本或者折叠到当前光标的下一行. 在有的终端中可能无法识别此绑定而失效.
<LocalLeader><Down> 主要是为那些不能识别 <C-Down>.
i 在状态栏中显示光标所在折叠完全解析和继承的参数.
这是专门为手动进入项目时进行相对路径和继承参数的调试而映射的.
I 在状态栏显示光标下文件名的全名(含路径). 此功能是插件调用
Project_GetFname(line('.'))函数来实现的.
1 - 9
执行在 g:proj_run{x} 指定的命令, {x} 是执行命令入口的编号.
参考下文中的 g:proj_run1.
f1-f9
执行 g:proj_run_fold{x} 中指定的命令, {x} 执行命令入口的编号, 命令只针
对当前项目层的文件. 参考下文中的|project-settings|.
F1-F9
执行 g:proj_run_fold{x} 中指定的命令, {x} 是执行命令入口的编号. 对当前
项目层及其所有子项目的所有文件执行命令. 参考下文中的 |project-settings|