Align
一个对齐的插件,用来排版,面对一堆乱七八糟的代码时,用来对齐代码,功能强大,不过用到
的机会不多
http://www.vim.org/scripts/script.php?script_id=521
Mru
http://www.vim.org/scripts/script.php?script_id=521
给vim增加MRU功能,也就是保留最近打开的文件记录,:MRU打开,q退出,很方便,有过一个支持
菜单的类似的插件
不过对于我这样的不用菜单的用户,还是这个命令行的好用一点,因为经常使用,所以我映射
到了F2
功能强大的代码注释工具,用来注释或者取消注释,支持很多语言,可以对文本块操作,写代码
NERD_comments
功能强大的代码注释工具,用来注释或者取消注释,支持很多语言,可以对文本块操作,写代码
离不了,呵呵
最常用到的快捷键是"c
a.vim
在.c/.h之间切换,写代码必备
bufexplorer.vim
列出当前打开的buffer,可以很容易的切换到和删除选定的buffer,必备插件之一
c.vim
c/c++ support,让你用编写c/c++程序时如虎添翼,有很多贴心的功能,每个功能都有快捷键
,不过一部分和NERD_comments冲突
如果经常编写一些单文件的c程序,但是不想写makefile,用这个,他帮你完成,F9编译并链接,
ctrl-F9运行
calendar.vim
日历插件,有了它,用vim来写日记很方便
csExplorer.vim
color theme浏览插件,列出所有的vim color theme到一个列表中,选中后按回车即可应用相
应的color theme,试验color theme时再也不用一次次输入:colo theme_name了,从上百个
color theme中选择自己喜欢的theme时有用
cscope_maps.vim
cscope的vim插件,提供快捷键操纵cscope,好东东,如果你在用cscope的话
favex.vim
FavEx : Favorite file and directory explorer ,可以添加目录和文件到收藏夹,可以把
经常编辑的文件添加到收藏夹来,在文件打开以后,"ff新增文件到收藏夹,"fd新增目录到
收藏夹
lookupfile.vim
五星级推荐的好插件!我觉得它是vim上最伟大的插件之一,提供多种方式查找文件,让你在复
杂的目¼树中也能轻松自如找到你要的文件
matchit.vim
扩展了vim的%功能,让%可以匹配的,不再仅仅是括号,支持多种语言.必备插件之一
parenquote.vim
给选中的文字加上引号,支持( { [ < ' " `,选中后,"加上你想要添加的符号,比如选中abc
后,"(,得到(abc)
snippetEmu.vim
扩展了vim的abbr缩写功能,支持占位符,支持变量替换,强烈推荐
taglist.vim
vim的代码浏览器,生成函数列表,支持跳转,可以根据光标λ置查询到当前的函数名,使用
vim的程序员必备!个人认为是最伟大的插件之一
utl.vim
给vim增加url的识别功能,但是功能远不只是支持url,还有更多,详情见utl的帮助
vcscommand.vim
给vim整合了cvs/subversion功能,不用离开vim环境也能执行常用的cvs/subversion操作了
viki.vim
vim的wiki,没怎么用过,据说很好用,详情可以看滇狐的主页
http://edyfox.codecarver.org/html/viki.html
vis.vim
可以对选中的文本块执行ex操作,尤其是visual block模式下,vim自己是不支持的.选中后,
:B 加上ex命令
visincr.vim
给vim增加生成递增或者递减数列的功能,支持十进制,十六进制,日期,星期等,功能强大灵活
winmanager.vim
给vim增加IDE的功能,提供目录浏览和buffer浏览功能,因为显示器太小,感觉太占空间,所以
单独使用bufexplorer,而且现在vim7的netrw功能也够强大,所以感觉比较鸡肋,而且貌似很
久没有更新,所以基本不用
yankring.vim
类似emacs的king ring,给vim的yank也增加缓冲,vim本身只缓冲删除的字符串,不缓冲yank
的内容
Posted by 1+1=2 at 6:24 AM 0 comments
Labels: vim
Tuesday, October 10, 2006
VIM 新手指南(zz)
术语约定: 如果没有特殊说明, 本文中提到的 VIM 指的是图形界面的 gvim 与字符界面的 vim 的统称, gvim 专指图形界面, vim 专指字符界面。
1.从官方网站(http://www.vim.org/download.php)下载windows版本的gvim安装。
2.下载中文帮助文档安装文件(http://vimcdoc.sourceforge.net/),这个(http://vcd.gro.clinux.org/)是简体中文的镜像站点。
注意:如果安装vim的中文帮助,安装完成后第一次自动启动时可以使用中文的,但退出后又还原为英文了,如果出现这种情况,只要把"vim"vimfiles"doc下的tags-cn另存为tags,再试试吧,中文出现了。
1 让 gvim 正常工作
VIM 是一个非常强大的编辑器, 可惜的是, 无论是 Windows 还是 Linux, gvim 都存在一些小故障,令第一眼看到它的初学者感到非常不愉快。 为了不让更多的初学者在第一次接触 gvim 时被它吓跑, 我在这份教程中首先解决 gvim 令人感到不快的一些小问题, 希望能让更多的用户平滑地过渡到 gvim 的环境中来。
VIM 的安装很简单, Windows 下只要双击安装程序, 一路 next 下去就可以了 (注意到选择安装组件的时候请选择全部组件, 默认安装方式下会少装几个有用的小东西)。 Linux 下各个发行版安装方式都不一样, 但总体来说都不难装。 因此, 本文假设你已经成功地安装了一份 VIM, 不再介绍 VIM 的安装步骤。
1.1 屏蔽系统自带的 .vimrc
VIM 是一个高度可定制的编辑器, 它通过配置文件 .vimrc (Windows 下是 _vimrc)来定制程序的各种行为。 如果你没有编写 .vimrc 的话, 它会使用系统自带的一份默认配置文件。 可惜的是, 系统默认的配置文件存在种种很令人不快的问题。 例如 Windows 下加载 mswin.vim 带来的困惑, 和 Linux 下无法处理中文等等故障。 因此, 我们在安装了 VIM 之后, 第一件要做的事情就是创建自己的 .vimrc。 只要编写一份你自己的配置文件, VIM 便不会再加载系统自带的配置文件。
如果你是 Linux 用户, 请在你的 $HOME 目录下放置一个空文件, 文件名叫 .vimrc, 方法如下:
$ cd # 使用不带参数的 cd 命令,切换到 $HOME 目录
$ touch .vimrc # 使用 touch 命令创建一个空白文件
如果你是 Windows 用户, 请在你的 %HOME% 目录下放置一个空文件, 文件名叫 _vimrc。 步骤如下:
1. 在资源管理器中切换到 %HOME% 目录;
2. 右键单击文件列表的空白位置, 选择“新建”→“文本文件”;
3. 将“新建文本文件.txt”重命名为“_vimrc”, 注意显示扩展名的问题。
现在, 我们已经创建了一份自己的 .vimrc。 在之后的部分里, 我们将逐渐往 .vimrc 里添加一些属于我们自己的内容, 得到一份真正属于自己的配置。
1.2 Linux 下的中文处理
这一节是为 Linux 用户准备的, 如果你是 Windows 用户, 请直接跳过这一节。
在 许多 Linux 发行版里, gvim 默认是不支持汉字的, 这给许多初学者留下了非常不好的印象。 其实, VIM 支持的语言非常之多,远远超乎我们想象。 之所以不能处理中文, 只是因为我们没有正确地配置它。 在正式开始工作以前, 我们首先将中文处理问题解决。这段里面会出现一些如“Normal 模式”、 “Insert 模式”等术语, 看不明白也不要紧, vimtutor 里面会详细解释,在这章内只要照着做就可以了, 不用深究这些词的含义。
打开 gvim, 在键盘上按“i”进入 Insert 模式,然后试着输入一段中文。 如果正常的话, 恭喜, 你可以跳过本段, 直接进入下一段。 如果不能正常输入, 也不要气馁, 先按 ESC, 回到 Normal 状态。 然后在键盘上输入“:set encoding=cp936”, 然后回车。 注意, 当你按下“:”的时候, VIM 就会自动切换到“Command 模式”, 光标会跳到窗口最下方。 冒号“:”之后的部分就是命令的正文。 回车之后, 这条命令就被 VIM 执行了。 这时再按下字母 i 进入 Insert 模式, 输入一段汉字, 如果不出意外的话, 汉字显示应该已经正常。 如果还不正常的话,请与滇狐联系。
现在你的 gvim 应该能够正常输入汉字了, 接下来请看一下 gvim 的菜单能不能正常地显示汉字,如果能的话, 恭喜, 请继续跳过这一节。 如果不能的话, 我们继续进行下面的操作。 首先按三次 ESC 键, 确认 VIM 已经处在 Normal 模式下, 然后在键盘上输入“:so $VIMRUNTIME/delmenu.vim”, 回车后会发现, gvim 的菜单没有了。继续输入“:so $VIMRUNTIME/menu.vim”, 回车, 这时 gvim 的菜单又回来了, 而且菜单中文显示也正常了。
1.3 选择自己喜欢的字体
如果觉得 gvim 的字体显示效果不好的话, 不妨重新选择一个你喜欢的字体。 点“编辑”→“选择字体”,然后在字体列表中选择一个你最中意的字体和字号, 确认后就可以了。 由于 gvim 只能使用等宽字体,因此对话框中列出的字体可能比你系统里安装的字体要少得多, 请慢慢选择, 耐心选, 直到选出最满意的字体为止。 选择完毕后, 先按几下 ESC 确认处在 Normal 模式下, 然后输入这条命令:“:set guifont?” (这里的问号代表询问, 不要漏写), 回车后 gvim 屏幕最下方会显示出你当前所用的字体的名称, 例如在滇狐这里输入这条命令后出来的结果如下:
guifont=Courier 9
请记住这里输出的字体名称, 如果必要的话请先暂时把它写下来备用, 之后我们需要将它写入配置文件。
1.4 将配置写入 .vimrc
之 前我们通过一系列命令, 将 gvim 调整为一个比较适合我们使用的编辑环境。 然而, gvim 是不会自动记住我们这次所做的调整的。下次再打开 gvim 时, 它又变回了原先的模样。 如果我们能够把刚才所输入的命令记录下来, 下次再打开 gvim 的时候把那些命令再执行一遍, 不就可以让 gvim 每次都保持我们调整过的最佳工作状态了么? 对, 这就是配置文件 .vimrc 的作用。
刚才我们已经创建了一 个全空的配置文件 .vimrc, 现在我们往配置文件中写下我们的自己的配置代码。 .vimrc 的格式很简单,只要将刚才输入的所有冒号开头的命令, 依次写入 .vimrc 即可, 写到配置文件里的时候就不要写冒号了。 VIM 启动的时候会依次执行这些命令。 另外, 配置文件中双引号开头的行表示注释, 在 VIM 读入 .vimrc 的时候, 这些行不会被执行。因此你可以使用注释在 .vimrc 中写上一些说明文字, 为自己将来阅读配置文件提供方便。 再次复习一下前几节的内容, 然后写下自己的 .vimrc, 你现在的 .vimrc 可能是这个样子的:
" Windows 下建议也加上这句
set encoding=cp936
" 这两句只在 Linux 下需要
so $VIMRUNTIME/delmenu.vim
so $VIMRUNTIME/menu.vim
" 设置字体。
" 字体名称可以通过前一节介绍的语句获得,
" 如果字体名称中含有空格,
" 需要在空格前面加上一个反斜杠,如下:
set guifont=Courier" 9
提示: 如果对 VIM 的基本操作一无所知的话, 现在你可以不妨先使用其它文本编辑器编写 .vimrc, 如记事本等。 当然, 如果你愿意现在就尝试着使用 gvim 编辑这个文件的话, 也是非常值得鼓励的。
2 入门学习
2.1 vimtutor
vimtutor 是一个非常适合初学者学习 VIM 的简易教程。 教程中说阅读一遍这个教程需要 25 到 30 分钟, 其实很少有人需要这么长时间。一般情况下, 如果精力集中的话, 15 到 20 分钟足以将这份教程从头到尾阅读一遍。 每天花 15 分钟时间将这份教程从头到尾看一遍,平时进行纯文本编辑的时候, 尽量“逼迫”自己多使用 gvim, 花一周时间, 就可以比较熟悉 gvim, 能够用它完成普通的编辑工作了。
Linux 下的 vimtutor 是在终端中打开的, 如果终端字体配置正常, 一般情况下不会出现什么太大问题。 Windows 下的 vimtutor 会弹出一个 gvim 窗口, 大部分情况下也没有什么大问题, 在少部分机器上汉字会出现乱码。 如果 vimtutor 在你机器上显示不正常的话, 请先输入“:set encoding=cp936”, 回车, 然后再点击“编辑”→“选择字体”,选择一个支持中文的字体, 如“新宋体”等, 确认后, 教程的显示应该就恢复正常了。
如果你以前从来没有使用过 VIM 的话, 请先花 15 分钟时间阅读一遍 vimtutor, 然后再继续往后阅读滇狐教程。 之后的部分再出现 vimtutor 里介绍过的术语时, 滇狐将不再作解释。
注意: 为了保证 vimtutor 在任何机器上运行效果都相同, 不会被本地设置的键绑定所干扰, vimtutor 运行时不会读取任何用户自定义的配置文件 .vimrc。 因此如果你之前做的设置在 vimtutor 里没有效果的话, 请不要太过于惊慌。
2.2 VIM 快速编辑示例
学习 VIM 其实是一件比较辛苦的事情, 刚开始的时候可能比用记事本还慢。 因此, 在学会 VIM 之前, 我们有必要先通过一些例子坚定一下信心。
VIM 的一大特点就是“快”。 这里列举了一些使用 VIM 能够快速完成, 而一些其它编辑器难以胜任的功能, 体现 VIM 的优越性。
3 编写自己的 .vimrc
作为一个高度可定制的编辑器, 为 VIM 编写适合自己使用的 .vimrc 是有必要的。 这里给出了一个适合初学者使用的 .vimrc 框架, 以及每一项设置的详细解释, 希望能给大家带来一些帮助。
这里是滇狐自己的 .vimrc, 里面有很多根据滇狐自己的习惯所做的设置。 如果你希望在自己机器上使用的话, 需要根据你的习惯做一些修改。
4 VIM 进阶
通 过一个星期的努力, 把 vimtutor 中的基本命令都熟练掌握后, 使用 VIM 进行简单快速的编辑应该已经没有什么问题了。 接下来,可以每天抽出半个小时时间, 在半个月左右内把 VIM 用户手册大概阅读一遍。 在 VIM 中 Normal 模式下输入“:help usr_toc”即可看到用户手册, 如果更习惯看中文版的话, 可以到这里下载。
记住, 没有必要记住手册中的所有命令, 只要大概知道有哪些命令, 需要用的之后知道到哪一章去查就可以了。 常用的命令查过几次之后自然而然就能够记住, 不常用的命令记下来也没有什么意义。
另外, 可以根据自己的需要, 下载一些常用的 VIM 插件, 方便自己的日常生活与工作。 这里有滇狐整理的 VIM 常用插件推荐, 感兴趣的话可以看看。
如果对 VIM 还有更加浓厚的兴趣的话, 可以试着自己编写 VIM 插件, 不过那些内容就不是这篇文章能够涉及的了。 祝大家好运! Happy VIMming~
VIM参数解释
VIM 中可供用户定制的选项非常非常多, 作为初学者, 我们没有必要了解这么多东西。
下面, 滇狐简单列出了一些最常用的配置项, 大家可以根据自己的需要将这些内容添加到自己的
.vimrc 中。
1 基本设置
*
set nocp
该命令指定让 VIM 工作在不兼容模式下。 在 VIM 之前, 出现过一个非常流行的编辑器叫
vi。 VIM 许多操作与 vi 很相似, 但也有许多操作与 vi 是不一样的。 如果使用“:set
cp”命令打开了兼容模式开关的话, VIM 将尽可能地模仿 vi 的操作模式。
也许有许多人喜欢“最正统的 vi”的操作模式, 对于初学者来说, vi 里许多操作是比较不方便的。
举一个例子, VIM 里允许在 Insert 模式下使用方向键移动光标, 而 vi 里在
Insert 模式下是不能移动光标的, 必须使用 ESC 退回到 Normal 模式下才行。
再举一个例子, vi 里使用 u 命令可以撤消一次先前的操作, 再次按下 u
时, 将撤消“撤消”这个动作本身, 也就是我们常说的“重复”(redo)。
而 VIM 里可以使用 u 命令撤消多步操作, “重复”使用的快捷键是 Ctrl
+ R。
使用兼容模式后, VIM 将放弃这些新的功能, 尽量模仿 vi 的各种操作方式。
只有在不兼容模式下, 才能更好地发挥 VIM 自身的特点。 Bram 爷爷强烈推荐大家使用
VIM 的不兼容模式, 滇狐也是这样推荐的。 请务必在你的 .vimrc 中的第一行写上:
“set nocp”。
*
set ru
该命令打开 VIM 的状态栏标尺。 默认情况下, VIM 的状态栏标尺在屏幕底部,
它能即时显示当前光标所在位置在文件中的行号、列号, 以及对应的整个文件的百分比。
打开标尺可以给文件的编辑工作带来一定方便。
*
set hls
搜索时高亮显示被找到的文本。 该指令的功能在 vimtutor 中已经有过介绍,
这里就不多说了。 其实似乎许多人并不喜欢这个功能。
*
set is
搜索时在未完全输入完毕要检索的文本时就开始检索。 vimtutor 对该命令也有过介绍,
滇狐并不喜欢这个功能, 因此滇狐自己的配置文件里是没有这条命令的。 但是周围有朋友很喜欢这个,
因此滇狐还是将它列在这里。
*
syntax on
打开关键字上色。 进行程序设计的朋友应该都知道关键字上色是什么东西,
因此这里就不多说了。 不进行程序设计的朋友不妨也打开这个功能, 虽然不一定能够用得着,
但这个功能其实也是很好玩的。
*
set backspace=indent,eol,start
设想这样一个情况: 当前光标前面有若干字母, 我们按下 i 键进入了 Insert
模式, 然后输入了 3 个字母, 再按 5 下删除(Backspace)。 默认情况下,
VIM 仅能删除我们新输入的 3 个字母, 然后喇叭“嘟嘟”响两声。 如果我们“set
backspace=start”, 则可以在删除了新输入的 3 个字母之后, 继续向前删除原有的两个字符。
再设想一个情况: 有若干行文字, 我们把光标移到中间某一行的行首, 按
i 键进入 Insert 模式, 然后按一下 Backspace。 默认情况下, 喇叭会“嘟”一声,
然后没有任何动静。 如果我们“set backspace=eol”, 则可以删除前一行行末的回车,
也就是说将两行拼接起来。
当我们设置了自动缩进后, 如果前一行缩进了一定距离, 按下回车后, 下一行也会保持相同的缩进。
默认情况下, 我们不能在 Insert 模式下直接按 Backspace 删除行首的缩进。
如果我们“set backspace=indent”, 则可以开启这一项功能。
上述三项功能, 你可以根据自己的需要, 选择其中一种或几种, 用逗号分隔各个选项。
建议把这三个选项都选上。
*
set whichwrap=b,s,<,>,[,]
默认情况下, 在 VIM 中当光标移到一行最左边的时候, 我们继续按左键,
光标不能回到上一行的最右边。 同样地, 光标到了一行最右边的时候, 我们不能通过继续按右跳到下一行的最左边。
但是, 通过设置 whichwrap 我们可以对一部分按键开启这项功能。 如果想对某一个或几个按键开启到头后自动折向下一行的功能,
可以把需要开启的键的代号写到 whichwrap 的参数列表中, 各个键之间使用逗号分隔。
以下是 whichwrap 支持的按键名称列表:
o
b
在 Normal 或 Visual 模式下按删除(Backspace)键。
o
s
在 Normal 或 Visual 模式下按空格键。
o
h
在 Normal 或 Visual 模式下按 h 键。
o
l
在 Normal 或 Visual 模式下按 l 键。
o
<
在 Normal 或 Visual 模式下按左方向键。
o
>
在 Normal 或 Visual 模式下按右方向键。
o
~
在 Normal 模式下按 ~ 键(翻转当前字母大小写)。
o
[
在 Insert 或 Replace 模式下按左方向键。
o
]
在 Insert 或 Replace 模式下按右方向键。
*
set encoding=cp936
设置当前字符编码为简体中文。 这里还有一段能够自动判断文件的 encoding,
自动选择合适的编码的 .vimrc 代码, 感兴趣的话可以放到自己的配置文件中使用:
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
2 文本编辑设置
*
set sw=4
自动缩进的时候, 缩进尺寸为 4 个空格。
*
set ts=4
Tab 宽度为 4 个字符。
*
set et
编辑时将所有 Tab 替换为空格。
该选项只在编辑时将 Tab 替换为空格, 如果打开一个已经存在的文件, 并不会将已有的
Tab 替换为空格。 如果希望进行这样的替换的话, 可以使用这条命令“:retab”。
3 断行设置
*
set lbr
不在单词中间断行。 设置了这个选项后, 如果一行文字非常长, 无法在一行内显示完的话,
它会在单词与单词间的空白处断开, 尽量不会把一个单词分成两截放在两个不同的行里。
*
set fo+=mB
打开断行模块对亚洲语言支持。 m 表示允许在两个汉字之间断行, 即使汉字之间没有出现空格。
B 表示将两行合并为一行的时候, 汉字与汉字之间不要补空格。 该命令支持的更多的选项请参看用户手册。
4 C/C++ 编码设置
*
set sm
显示括号配对情况。 打开这个选项后, 当输入后括号 (包括小括号、中括号、大括号)
的时候, 光标会跳回前括号片刻, 然后跳回来, 以此显示括号的配对情况。
*
set cin
打开 C/C++ 风格的自动缩进。 打开了自动缩进后, 在编码的时候我们可以使用“V”命令选中一段文本后,
按“=”将这段文本重新调整缩进格式, 在一定程度上起到代码美化的作用。
另外, 打开了自动缩进后, 在使用 TERM 下的 vim 的时, 粘贴代码时常常会出现版式混乱的现象。
那是因为 TERM 并不知道你现在正在粘贴代码, 它直接“粘贴”动作向 vim
解释为键入, 因此 vim 便按照设置的自动缩进格式为你的代码调整了缩进。
不幸的是, 粘贴进去的代码中本身已经包含了缩进, 因此便出现了版式混乱的情况。
在 gvim 中就不会出现这个问题, 因为它能够知道你现在正在粘贴。
知道了这个症状的来由, 解决方案也就显而易见了: 在粘贴的时候把所有自动缩进都关闭,
粘贴完毕之后再打开。 一个个手工关闭自动缩进未免过于繁琐, vim 为我们提供了一个很好用的命令,
只要输入“:set paste”, 就可以关闭所有自动缩进。 粘贴完毕后再输入“:set
nopaste”就可以重新打开原有的自动缩进设置了。
*
set cino=:0g0t0(sus
设定 C/C++ 风格自动缩进的选项, 这里简要介绍一下这段代码里用到的选项的含义,
cino 支持的选项还很多, 更多选项请看用户手册。
// :0
//
// switch 语句之下的 case 语句缩进 0 个空格,也就是说不缩进,与 switch 块平
// 齐,使用这样风格:
switch (x)
{
case 1:
a = b;
break;
default:
}
// g0
//
// class、struct 等之下的访问权限控制语句,如 public、protected、private 等,
// 相对 class、struct 等所在的块缩进 0 个空格,与 class 等块平齐,使用这样的
// 风格:
class foo
{
public:
int a;
private:
int b;
};
// t0
//
// 如果函数返回值与函数名不在同一行,则返回值缩进 0 个空格,也就是说不缩进,如
// 下所示:
// set cino=t4
int
func1()
{
}
// set cino=t0
int
func()
{
}
// (sus
//
// 当一对括号跨越多行时,其后的行缩进前面 sw 指定的距离,效果如下:
int a = (1 + 2 + 3
+ 4 + 5 + 6
+ 7 + 8) * 9;
*
set ai
打开普通文件类型的自动缩进。 该自动缩进不如 cindent 智能, 但它可以为你编辑非
C/C++ 文件提供一定帮助。
5 其它设置
*
set selectmode=
不使用 selectmode。
*
set mousemodel=popup
当右键单击窗口的时候, 弹出快捷菜单。
*
set keymodel=
不使用“Shift + 方向键”选择文本, “Shift + 方向键”代表向指定方向跳一个单词。
如果你喜欢这项功能的话, 可以使用“set keymodel=startsel,stopsel”打开它。
*
set selection=inclusive
指定在选择文本时, 光标所在位置也属于被选中的范围。 如果指定 selection=exclusive
的话, 可能会出现某些文本无法被选中的情况。
*
colo torte
选择 torte 配色方案。 VIM 里内置了许多关键字上色的配色方案, 另外你还可以到网上下载更多配色方案,
或是自己编写。 点击“编辑”→“调色板”, 就能列出所有支持的配色方案。
你可以把“调色板”子菜单剪下来, 然后慢慢选择, 挑出一个你最喜欢的配色方案来。
6 图形界面设置
*
set nowrap
指定不折行。 如果一行太长, 超过屏幕宽度, 则向右边延伸到屏幕外面。
如果使用图形界面的话, 指定不折行视觉效果会好得多。
*
set guioptions+=b
添加水平滚动条。 如果你指定了不折行, 那为窗口添加一个水平滚动条就非常有必要了。
*
set guifont=Courier" 9
设置图形界面下的字体。 你可以点“编辑”→“选择字体”, 然后在对话框中选出你喜欢的字体与字号,
选择完毕后, 先按几下 ESC 确认处在 Normal 模式下, 然后输入这条命令:“:set
guifont?” 回车后 gvim 屏幕最下方会显示出你当前所用的字体的名称与字号。
将获得的结果写到配置文件里面就可以了, 需要注意一点, 如果字体名称里面含有空格的话,
在抄的时候需要在所有空格前面加一个斜杠。
7 条件选择
同一个配色方案, 在 gvim 下和字符界面的 vim 下效果大相径庭, 滇狐个人的习惯是,
在 gvim 下使用 torte 配色方案, 在 vim 下使用 ron 配色方案。 因此我们有必要针对
gvim 和 vim 进行不同的设置。
另外, 前面我们在 gvim 下不使用折行, 开启水平滚动条, 但在 vim 下,
是没有滚动条可用的, 因此还是有必要为 vim 保留自动折行。
条件选择设置的格式如下:
if (has("gui_running"))
" 图形界面下的设置
set nowrap
set guioptions+=b
colo torte
else
" 字符界面下的设置
set wrap
colo ron
endif
以下是滇狐自己的 .vimrc, 有许多根据滇狐自己的习惯做的设置, 如果你要在自己机器上使用的话,
请根据你自己的习惯作出相应修改。
另外, 这份 .vimrc 里面有许多设置是针对插件的, 只有安装了相应插件后,
这些配置才会起作用。 这里有滇狐使用的全部插件打包,
如果需要的话可以直接下载, Linux 用户将该压缩包解压到 $HOME 目录下即可使用,
Windows 用户可以将压缩包解压后, 将解压得到的 .vim 文件夹改名为 vimfiles,
然后复制到 VIM 的安装路径下, 覆盖原有文件。
"=============================================================================
" General settings
"=============================================================================
set nocp
set ru
set cin
set sm
set ai
set sw=4
set ts=4
set et
set cino=:0g0t0(sus
set lbr
set hls
set backspace=indent,eol,start
set whichwrap=b,s,<,>,[,]
set fo+=mB
set selectmode=
set mousemodel=popup
set keymodel=
set selection=inclusive
set matchpairs+=<:>
" for gdbvim
set noshowcmd
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
" Cursor movement
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
nnoremap <End> g$
nnoremap <Home> g0
vnoremap <End> g$
vnoremap <Home> g0
inoremap <End> <C-o>g$
inoremap <Home> <C-o>g0
nmap <C-F4> :confirm bd<CR>
vmap <C-F4> <ESC>:confirm bd
omap <C-F4> <ESC>:confirm bd
map! <C-F4> <ESC>:confirm bd
" Move lines
nmap <C-Down> :<C-u>move .+1<CR>
nmap <C-Up> :<C-u>move .-2<CR>
imap <C-Down> <C-o>:<C-u>move .+1<CR>
imap <C-Up> <C-o>:<C-u>move .-2<CR>
vmap <C-Down> :move '>+1<CR>gv
vmap <C-Up> :move '<-2<CR>gv
" Toggle line number
nmap <C-F12> :set nu!<CR>
imap <C-F12> <C-o>:set nu!<CR>
" Toggle spell check
" For VIM7 only
nmap <C-F11> :set spell!<CR>
imap <C-F11> <C-o>:set spell!<CR>
syntax on
if (has("gui_running"))
set nowrap
set guioptions+=b
colo torte
else
set wrap
colo ron
endif
" ============================================================================
" Plugins settings
" ============================================================================
" Sketch
command -nargs=0 ToggleSketch call ToggleSketch()
" WinManager
" let g:winManagerWindowLayout = "FileExplorer"
" Tlist
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
" A
let g:alternateNoDefaultAlternate=1
" VIM7 doesn't support this.
"let g:alternateExtensions_{"aspx"} = "aspx.cs,aspx.CS"
"let g:alternateExtensions_{"aspx.cs"} = "aspx,ASPX"
" LateXSuite
filetype plugin on
set grepprg=grep" -nH" $*
" Viki
let g:vikiNameSuffix=".viki"
augr viki
au!
au BufRead,BufNewFile *.viki set filetype=viki
augr END
"=============================================================================
" Functions
"=============================================================================
function TextWork()
set nocin
set nosm
set noai
set tw=78
set sw=8
set ts=8
set nowrap
endfunction
function NoTextWork()
set cin
set sm
set ai
set tw=0
set sw=4
set ts=4
if (!has("gui_running"))
set wrap
endif
endfunction
function CodeWork()
call NoTextWork()
WManager
Tlist
endfunction
function TimeStamp()
let curposn= SaveWinPosn()
%s/"$Date: .*"$/"=strftime("$Date: %Y-%m-%d %H:%M:%S$")/ge
%s/Last Change: .*$/"=strftime("Last Change: %Y-%m-%d %H:%M:%S")/ge
%s/Last Modified: .*$/"=strftime("Last Modified: %Y-%m-%d %H:%M:%S")/ge
" Replace once and never update.
%s/Created: *$/"=strftime("Created: %Y-%m-%d %H:%M:%S")/ge
call RestoreWinPosn(curposn)
endfunction
function AutoTimeStamp()
augr tagdate
au!
au BufWritePre,FileWritePre * call TimeStamp()
augr END
endfunction
call AutoTimeStamp()
function NoAutoTimeStamp()
augr tagdate
au!
augr END
endfunction
"=============================================================================
" Commands
"=============================================================================
command -nargs=0 TextWork call TextWork()
command -nargs=0 NoTextWork call NoTextWork()
command -nargs=0 CodeWork call CodeWork()
command -nargs=0 TimeStamp call TimeStamp()
command -nargs=0 AutoTimeStamp call AutoTimeStamp()
command -nargs=0 NoAutoTimeStamp call NoAutoTimeStamp()
"=============================================================================
" Platform dependent settings
"=============================================================================
"-----------------------------------------------------------------------------
" Common
"-----------------------------------------------------------------------------
" Calender
let g:calendar_diary="/home/edward/document/diary"
" Spell Check
" VIM7 supports built-in spell check.
"function SpellCheck()
" !aspell --lang=en -c %
"endfunction
"command -nargs=0 SpellCheck call SpellCheck()
" Mail Template
function MailWork()
0r ~/document/text/mailtemp.txt
%s/%%date%%/"=strftime("%Y-%m-%d")/ge
%s/%%cursor%%//ge
call TextWork()
endfunction
command -nargs=0 MailWork call MailWork()
" Use kittiemake as the default compiler
function Kittie()
set makeprg=kittiemake
endfunction
command -nargs=0 Kittie call Kittie()
" Don't use kittiemake as the default compiler
function NoKittie()
set makeprg=make
endfunction
command -nargs=0 NoKittie call NoKittie()
"-----------------------------------------------------------------------------
" Win32
"-----------------------------------------------------------------------------
"if (has("gui_running"))
" set guifont=新宋体:h9:cGB2312
"endif
" For LaTeX Suite
"let g:Tex_CompileRule_dvi="latex -src-specials -interaction=nonstopmode $*"
"set shellslash
" For tee
"set shellpipe=2>&1"|" tee
" VimTweak
"if (has("gui_running"))
" command -nargs=1 SetAlpha call libcallnr("vimtweak.dll",
" ""SetAlpha", )
" command -nargs=0 TopMost call libcallnr("vimtweak.dll",
" ""EnableTopMost", 1)
" command -nargs=0 NoTopMost call libcallnr("vimtweak.dll",
" ""EnableTopMost", 0)
"endif
"-----------------------------------------------------------------------------
" Linux
"-----------------------------------------------------------------------------
"For LaTeX Suite
"function RemoteLaTeX()
" let g:Tex_ViewRule_dvi="xdvi -editor 'gvim --servername """
" ".expand("%:p").""" --remote-silent'"
" augr remotelatex
" au!
" augr END
"endfunction
"augr remotelatex
"au!
"au BufRead * call RemoteLaTeX()
"augr END
let g:Tex_CompileRule_dvi
"="latex -src-specials -interaction=nonstopmode $*"
let g:Tex_ViewRule_dvi
"="xdvi -editor 'gvim --servername latex-suite --remote-silent'"
if (has("gui_running"))
set guifont=Bitstream" Vera" Sans" Mono" 9
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
endif
Posted by 1+1=2 at 10:00 PM 0 comments
Labels: vim
Monday, October 09, 2006
标题: vim + ctags + taglist + cscope + cppcomplete + global 使用初探(zz)
由于本人比较喜欢在终端状态下的vim,所以gvim下的扩展使用的不多。这里介绍的也是我简单的使用以上扩展的一点点体会。请大家指正。 emacs 不会用,也没有比较过拉。
1、大体感觉,(因为使用时间不长,不全面)
总体使用的感觉定位查找类型定义基本可以用,但自动补全类型方面由于ctags的功能有限,感觉在大工程时,不一定很好用。
大型程序一定要global的参与,它的分析比较全面,但在vim中的提示信息有限。
taglist 精干,需要ctags的支撑 ,直接可以在左边列出函数列表,全局参数列表。(可以排序)
cscope 比较强大,可以对函数以及部分类型定义进行跳转,但有些BUG,好像在某些条件下无法正确找到分析枚举的定义。
cppcomplete 需要ctags的支撑,可以补全类型或者函数名(可不是普通Ctrl+P/N的那种)
global 新版本可以嵌入vim使用,提供比较完整解析和类型索引,和cscope比,稍微差些的就是对类型引用的打印列表中没有标识这个引用在什么函数中进行的。 其实我的感觉global可能不是为vim所生,它的主要目的是用html的方式进行表达相关的关联关系和索引,使用起来感觉没有cscope的那么贴 切。
2、相关的扩展的安装
代码:
apt-get install exuberant-ctags cscope global
cppcomplete 和 taglist 要到www.vim.org的扩展列表中下载。
taglist 的下载地址:
http://www.vim.org/scripts/script.php?script_id=273
cppcomplete 的下载地址:
http://www.vim.org/scripts/script.php?script_id=527
然后在 建立目录
代码:
$HOME/.vim/plugin
将下载的cppcomplete.vim 和 taglist.vim拷贝到$HOME/.vim/plugin中。
安装了global后,最新4.8.6 以上版本有带vim的扩展,将它也拷贝到 $HOME/.vim/plugin
debian sid 版本global安装后扩展文件在
代码:
/usr/share/doc/global/examples/gtags.vim.gz
需要拷贝到$HOME/.vim/plugin后解压,解压方法:
代码:
gzip -d gtags.vim.gz
3、使用这些工具
1)准备工作,先修改一下$HOME/.vimrc文件
为了更好的使用cscope请添加如下内容,这样Ctrl-]的跳转将由cscope的tags进行分析。
代码:
if has("cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
set cscopetag
set cscopequickfix=s-,g-,c-,d-,t-,e-,f-,i-
endif
2)使用cscope
cscope的tag生成最简单的方法是:
在你的开发工程的最上层目录执行cscope-indexer,它会遍历下面的所有目录,生成两个文件,一个是cscope.files,这个文件记录需要生成tags的文件名,可以手工修改,另一个是cscope格式的tags文件cscope.out。
完成后,你在生成了cscope.out的目录打开工程的任意文件,就可以使用Ctrl-]跳转查找类型定义了。
代码:
cs f s xxxx 查找xxxx出现的地方,它能详细列出哪些文件的哪行的哪个函数引用,以及该行的内容,比较不错。 :)
它的所有命令的使用请参考:
代码:
help cscope
3)使用taglist
taglist的功能是即时生成当前文件的函数列表和全局变量列表,便于索引。
在vim中命令模式下使用
Tlist 打开或者关闭当前文件的索引;
TlistSync 立即在打开的索引窗口中定位当前的光标所在位置属于哪个函数或者结构定义中。
还有其他命令,请参考它的帮助文件。
4)ctags的使用
其实cscope是用来替代ctags功能的,ctags的应用广泛,还有其他很多的软件依赖它。
例如要生成cppcomplete需要的tags文件的话,需要运行下面的命令:
代码:
ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files
注意,我在最后使用了参数"-L cscope.files" 这仅仅是借用拉cscope生成的文件索引来帮助ctags去查询相关工程文件生成tags。
5)使用cppcomplete
cppcomplete的使用我只是简单的发现它可以根据上述方法生成的tags文件来自动补全类型成员。
使用很简单,就是在你需要补全类型成员时,按F8键就可以拉。它一般第一次使用时,需要让你确认是使用已有的tags文件还是再生成一次。一般我们自己控制生成tags文件的时机,它就使用就行拉。
但它也受到ctags的分析能力比较差的限制,可能不是每次都能帮到你。
6)使用global
在工程的最上层目录执行命令:
gtags
等待它完成所有需要的global自己格式的tags的生成
生成完后,需要的就是在生成tags的目录打开你的工程的任意文件,用如下命令查询相关类型引用和关联关系:
代码:
Gtags xxxx 查找xxxx的定义
Gtags -r xxxx 查找xxxx的引用
Gtags -s xxxx 查找xxxx出现的地方
它的提示信息很有显,不如cscope更直观,但对大型分析的比较完整。
有时它无法正常分析的类型 可以试试用带-s 的参数的方式找找类型定义。再不行,我就不清楚拉
4、草草的收尾
我使用它们也是一点一点的摸索的没有系统的完整的使用过,也受限于本人的Linux使用经验和工作关系,所以非常简单的使用体会给大家一个参考,希望能有所帮助。更希望后来者能不断补充相关的使用体会。大家都需要交流提高,呵呵。
Posted by 1+1=2 at 4:47 AM 0 comments
Labels: vim
Ctags with Vim
标 题: Ctags with Vim
发信站: BBS 水木清华站 (Mon May 24 08:42:57 2004), 站内
usage: $ctags [-R] inc_dir/*.h include_dir/*.hpp src_dir/*.c
example: $ ctags -R `find . -name "*.c"` `find . -name "*.h"`
su; cd /usr/include; ctags --c-types=+p+x -sort -R
生成非常完整,巨大而有序的tags
各用户在 ~/.vimrc中添加set tags= ./tags, tags, /usr/include/tags即可使用
[注1]+p开关会跳到变量声明的地方而不是它的实现,所以还是采用缺省值,
不要--c-types这个选项,或者只要+x(推荐),其它无所谓。
还有/usr/include并不是/usr/src/linux/include的一个符号链接,
所以如果是看内核中一些变量的定义的话应该到/usr/src/linux上面用ctags
ctags浏览代码 (有的命令说明可能不准确)
:set tags=/Dir/tags 设置需要的tags文件,
可以多个:set tags=/dir1/tags, /dir2/tags
:tag xxx 转到满足查找代码的定义处,简写为 :ta xxx
:tag /^xxx 转到以xxx为起始的tag处
other find tags :stag/ptag/ts/tj/pts/ptj /
:tag /xxx 列出所有包含xxx的tag
:tag 转到前一个浏览过的tag处
vi -t xxx 直接定位到xxx的定义处
:tn / :tp 转到下/上一个tag代码处,可以使用:5tn的形式
:tr / :tl 转到首/尾tag代码处
, 转到光标所在函数或者变量的定义处 g+左键 (GUI) [注2]
, 回到跳转前的代码处(适用于任何跳转) g+右键 (GUI)
:tags 列出当前tag栈的内容
:ts xxx 列出所有匹配的代码及其所属文件,并提供选择浏览
:sts xxx 列出匹配处提供选择在新窗口中打开文件
:tj xxx 类似 :ts xxx,当只有一个匹配时直接转到代码处
g] 与 :ts xxx 功能相同(tag为光标下的标识符)
g] 等价于 :sts xxx
g 等价于 :tj xxx
:pt? xxx 提供上述命令(?为j,s)的预览功能,退出窗口 :q!
:t?! xxx 当前文件的修改被丢弃转到目标文件中
} 在预览窗口中显示当前光标下的tag
:ptl / ptf / ptn /ptp 类似于 tl,tf,tn,tp
:che 察看没有找到的头文件(checkpath)
makeprg :set makeprg=gcc" yourfile.c 为在线编译设置
:make 在线编译
:cn / :cN 移动到编译的 下/上 一个error处
:stag xxx 查找xxx的声明处并在新窗口中打开
:ta {ident} 跳转到标识符定义处
gd 跳转到局部标识符定义处
[注2] Ctrl-]碰巧是telnet的终端符,如果远程编辑文件可能会遇到一些问题,
请参考在线帮助:h ^]。多数telnet都允许使用命令telnet -E hostname来打开
或关闭该脱字符,或者用telnet -e escape hostname来指定另外一个脱字符
来代替^],请man telnet参看-E -e的帮助。
一个对齐的插件,用来排版,面对一堆乱七八糟的代码时,用来对齐代码,功能强大,不过用到
的机会不多
http://www.vim.org/scripts/script.php?script_id=521
Mru
http://www.vim.org/scripts/script.php?script_id=521
给vim增加MRU功能,也就是保留最近打开的文件记录,:MRU打开,q退出,很方便,有过一个支持
菜单的类似的插件
不过对于我这样的不用菜单的用户,还是这个命令行的好用一点,因为经常使用,所以我映射
到了F2
功能强大的代码注释工具,用来注释或者取消注释,支持很多语言,可以对文本块操作,写代码
NERD_comments
功能强大的代码注释工具,用来注释或者取消注释,支持很多语言,可以对文本块操作,写代码
离不了,呵呵
最常用到的快捷键是"c
a.vim
在.c/.h之间切换,写代码必备
bufexplorer.vim
列出当前打开的buffer,可以很容易的切换到和删除选定的buffer,必备插件之一
c.vim
c/c++ support,让你用编写c/c++程序时如虎添翼,有很多贴心的功能,每个功能都有快捷键
,不过一部分和NERD_comments冲突
如果经常编写一些单文件的c程序,但是不想写makefile,用这个,他帮你完成,F9编译并链接,
ctrl-F9运行
calendar.vim
日历插件,有了它,用vim来写日记很方便
csExplorer.vim
color theme浏览插件,列出所有的vim color theme到一个列表中,选中后按回车即可应用相
应的color theme,试验color theme时再也不用一次次输入:colo theme_name了,从上百个
color theme中选择自己喜欢的theme时有用
cscope_maps.vim
cscope的vim插件,提供快捷键操纵cscope,好东东,如果你在用cscope的话
favex.vim
FavEx : Favorite file and directory explorer ,可以添加目录和文件到收藏夹,可以把
经常编辑的文件添加到收藏夹来,在文件打开以后,"ff新增文件到收藏夹,"fd新增目录到
收藏夹
lookupfile.vim
五星级推荐的好插件!我觉得它是vim上最伟大的插件之一,提供多种方式查找文件,让你在复
杂的目¼树中也能轻松自如找到你要的文件
matchit.vim
扩展了vim的%功能,让%可以匹配的,不再仅仅是括号,支持多种语言.必备插件之一
parenquote.vim
给选中的文字加上引号,支持( { [ < ' " `,选中后,"加上你想要添加的符号,比如选中abc
后,"(,得到(abc)
snippetEmu.vim
扩展了vim的abbr缩写功能,支持占位符,支持变量替换,强烈推荐
taglist.vim
vim的代码浏览器,生成函数列表,支持跳转,可以根据光标λ置查询到当前的函数名,使用
vim的程序员必备!个人认为是最伟大的插件之一
utl.vim
给vim增加url的识别功能,但是功能远不只是支持url,还有更多,详情见utl的帮助
vcscommand.vim
给vim整合了cvs/subversion功能,不用离开vim环境也能执行常用的cvs/subversion操作了
viki.vim
vim的wiki,没怎么用过,据说很好用,详情可以看滇狐的主页
http://edyfox.codecarver.org/html/viki.html
vis.vim
可以对选中的文本块执行ex操作,尤其是visual block模式下,vim自己是不支持的.选中后,
:B 加上ex命令
visincr.vim
给vim增加生成递增或者递减数列的功能,支持十进制,十六进制,日期,星期等,功能强大灵活
winmanager.vim
给vim增加IDE的功能,提供目录浏览和buffer浏览功能,因为显示器太小,感觉太占空间,所以
单独使用bufexplorer,而且现在vim7的netrw功能也够强大,所以感觉比较鸡肋,而且貌似很
久没有更新,所以基本不用
yankring.vim
类似emacs的king ring,给vim的yank也增加缓冲,vim本身只缓冲删除的字符串,不缓冲yank
的内容
Posted by 1+1=2 at 6:24 AM 0 comments
Labels: vim
Tuesday, October 10, 2006
VIM 新手指南(zz)
术语约定: 如果没有特殊说明, 本文中提到的 VIM 指的是图形界面的 gvim 与字符界面的 vim 的统称, gvim 专指图形界面, vim 专指字符界面。
1.从官方网站(http://www.vim.org/download.php)下载windows版本的gvim安装。
2.下载中文帮助文档安装文件(http://vimcdoc.sourceforge.net/),这个(http://vcd.gro.clinux.org/)是简体中文的镜像站点。
注意:如果安装vim的中文帮助,安装完成后第一次自动启动时可以使用中文的,但退出后又还原为英文了,如果出现这种情况,只要把"vim"vimfiles"doc下的tags-cn另存为tags,再试试吧,中文出现了。
1 让 gvim 正常工作
VIM 是一个非常强大的编辑器, 可惜的是, 无论是 Windows 还是 Linux, gvim 都存在一些小故障,令第一眼看到它的初学者感到非常不愉快。 为了不让更多的初学者在第一次接触 gvim 时被它吓跑, 我在这份教程中首先解决 gvim 令人感到不快的一些小问题, 希望能让更多的用户平滑地过渡到 gvim 的环境中来。
VIM 的安装很简单, Windows 下只要双击安装程序, 一路 next 下去就可以了 (注意到选择安装组件的时候请选择全部组件, 默认安装方式下会少装几个有用的小东西)。 Linux 下各个发行版安装方式都不一样, 但总体来说都不难装。 因此, 本文假设你已经成功地安装了一份 VIM, 不再介绍 VIM 的安装步骤。
1.1 屏蔽系统自带的 .vimrc
VIM 是一个高度可定制的编辑器, 它通过配置文件 .vimrc (Windows 下是 _vimrc)来定制程序的各种行为。 如果你没有编写 .vimrc 的话, 它会使用系统自带的一份默认配置文件。 可惜的是, 系统默认的配置文件存在种种很令人不快的问题。 例如 Windows 下加载 mswin.vim 带来的困惑, 和 Linux 下无法处理中文等等故障。 因此, 我们在安装了 VIM 之后, 第一件要做的事情就是创建自己的 .vimrc。 只要编写一份你自己的配置文件, VIM 便不会再加载系统自带的配置文件。
如果你是 Linux 用户, 请在你的 $HOME 目录下放置一个空文件, 文件名叫 .vimrc, 方法如下:
$ cd # 使用不带参数的 cd 命令,切换到 $HOME 目录
$ touch .vimrc # 使用 touch 命令创建一个空白文件
如果你是 Windows 用户, 请在你的 %HOME% 目录下放置一个空文件, 文件名叫 _vimrc。 步骤如下:
1. 在资源管理器中切换到 %HOME% 目录;
2. 右键单击文件列表的空白位置, 选择“新建”→“文本文件”;
3. 将“新建文本文件.txt”重命名为“_vimrc”, 注意显示扩展名的问题。
现在, 我们已经创建了一份自己的 .vimrc。 在之后的部分里, 我们将逐渐往 .vimrc 里添加一些属于我们自己的内容, 得到一份真正属于自己的配置。
1.2 Linux 下的中文处理
这一节是为 Linux 用户准备的, 如果你是 Windows 用户, 请直接跳过这一节。
在 许多 Linux 发行版里, gvim 默认是不支持汉字的, 这给许多初学者留下了非常不好的印象。 其实, VIM 支持的语言非常之多,远远超乎我们想象。 之所以不能处理中文, 只是因为我们没有正确地配置它。 在正式开始工作以前, 我们首先将中文处理问题解决。这段里面会出现一些如“Normal 模式”、 “Insert 模式”等术语, 看不明白也不要紧, vimtutor 里面会详细解释,在这章内只要照着做就可以了, 不用深究这些词的含义。
打开 gvim, 在键盘上按“i”进入 Insert 模式,然后试着输入一段中文。 如果正常的话, 恭喜, 你可以跳过本段, 直接进入下一段。 如果不能正常输入, 也不要气馁, 先按 ESC, 回到 Normal 状态。 然后在键盘上输入“:set encoding=cp936”, 然后回车。 注意, 当你按下“:”的时候, VIM 就会自动切换到“Command 模式”, 光标会跳到窗口最下方。 冒号“:”之后的部分就是命令的正文。 回车之后, 这条命令就被 VIM 执行了。 这时再按下字母 i 进入 Insert 模式, 输入一段汉字, 如果不出意外的话, 汉字显示应该已经正常。 如果还不正常的话,请与滇狐联系。
现在你的 gvim 应该能够正常输入汉字了, 接下来请看一下 gvim 的菜单能不能正常地显示汉字,如果能的话, 恭喜, 请继续跳过这一节。 如果不能的话, 我们继续进行下面的操作。 首先按三次 ESC 键, 确认 VIM 已经处在 Normal 模式下, 然后在键盘上输入“:so $VIMRUNTIME/delmenu.vim”, 回车后会发现, gvim 的菜单没有了。继续输入“:so $VIMRUNTIME/menu.vim”, 回车, 这时 gvim 的菜单又回来了, 而且菜单中文显示也正常了。
1.3 选择自己喜欢的字体
如果觉得 gvim 的字体显示效果不好的话, 不妨重新选择一个你喜欢的字体。 点“编辑”→“选择字体”,然后在字体列表中选择一个你最中意的字体和字号, 确认后就可以了。 由于 gvim 只能使用等宽字体,因此对话框中列出的字体可能比你系统里安装的字体要少得多, 请慢慢选择, 耐心选, 直到选出最满意的字体为止。 选择完毕后, 先按几下 ESC 确认处在 Normal 模式下, 然后输入这条命令:“:set guifont?” (这里的问号代表询问, 不要漏写), 回车后 gvim 屏幕最下方会显示出你当前所用的字体的名称, 例如在滇狐这里输入这条命令后出来的结果如下:
guifont=Courier 9
请记住这里输出的字体名称, 如果必要的话请先暂时把它写下来备用, 之后我们需要将它写入配置文件。
1.4 将配置写入 .vimrc
之 前我们通过一系列命令, 将 gvim 调整为一个比较适合我们使用的编辑环境。 然而, gvim 是不会自动记住我们这次所做的调整的。下次再打开 gvim 时, 它又变回了原先的模样。 如果我们能够把刚才所输入的命令记录下来, 下次再打开 gvim 的时候把那些命令再执行一遍, 不就可以让 gvim 每次都保持我们调整过的最佳工作状态了么? 对, 这就是配置文件 .vimrc 的作用。
刚才我们已经创建了一 个全空的配置文件 .vimrc, 现在我们往配置文件中写下我们的自己的配置代码。 .vimrc 的格式很简单,只要将刚才输入的所有冒号开头的命令, 依次写入 .vimrc 即可, 写到配置文件里的时候就不要写冒号了。 VIM 启动的时候会依次执行这些命令。 另外, 配置文件中双引号开头的行表示注释, 在 VIM 读入 .vimrc 的时候, 这些行不会被执行。因此你可以使用注释在 .vimrc 中写上一些说明文字, 为自己将来阅读配置文件提供方便。 再次复习一下前几节的内容, 然后写下自己的 .vimrc, 你现在的 .vimrc 可能是这个样子的:
" Windows 下建议也加上这句
set encoding=cp936
" 这两句只在 Linux 下需要
so $VIMRUNTIME/delmenu.vim
so $VIMRUNTIME/menu.vim
" 设置字体。
" 字体名称可以通过前一节介绍的语句获得,
" 如果字体名称中含有空格,
" 需要在空格前面加上一个反斜杠,如下:
set guifont=Courier" 9
提示: 如果对 VIM 的基本操作一无所知的话, 现在你可以不妨先使用其它文本编辑器编写 .vimrc, 如记事本等。 当然, 如果你愿意现在就尝试着使用 gvim 编辑这个文件的话, 也是非常值得鼓励的。
2 入门学习
2.1 vimtutor
vimtutor 是一个非常适合初学者学习 VIM 的简易教程。 教程中说阅读一遍这个教程需要 25 到 30 分钟, 其实很少有人需要这么长时间。一般情况下, 如果精力集中的话, 15 到 20 分钟足以将这份教程从头到尾阅读一遍。 每天花 15 分钟时间将这份教程从头到尾看一遍,平时进行纯文本编辑的时候, 尽量“逼迫”自己多使用 gvim, 花一周时间, 就可以比较熟悉 gvim, 能够用它完成普通的编辑工作了。
Linux 下的 vimtutor 是在终端中打开的, 如果终端字体配置正常, 一般情况下不会出现什么太大问题。 Windows 下的 vimtutor 会弹出一个 gvim 窗口, 大部分情况下也没有什么大问题, 在少部分机器上汉字会出现乱码。 如果 vimtutor 在你机器上显示不正常的话, 请先输入“:set encoding=cp936”, 回车, 然后再点击“编辑”→“选择字体”,选择一个支持中文的字体, 如“新宋体”等, 确认后, 教程的显示应该就恢复正常了。
如果你以前从来没有使用过 VIM 的话, 请先花 15 分钟时间阅读一遍 vimtutor, 然后再继续往后阅读滇狐教程。 之后的部分再出现 vimtutor 里介绍过的术语时, 滇狐将不再作解释。
注意: 为了保证 vimtutor 在任何机器上运行效果都相同, 不会被本地设置的键绑定所干扰, vimtutor 运行时不会读取任何用户自定义的配置文件 .vimrc。 因此如果你之前做的设置在 vimtutor 里没有效果的话, 请不要太过于惊慌。
2.2 VIM 快速编辑示例
学习 VIM 其实是一件比较辛苦的事情, 刚开始的时候可能比用记事本还慢。 因此, 在学会 VIM 之前, 我们有必要先通过一些例子坚定一下信心。
VIM 的一大特点就是“快”。 这里列举了一些使用 VIM 能够快速完成, 而一些其它编辑器难以胜任的功能, 体现 VIM 的优越性。
3 编写自己的 .vimrc
作为一个高度可定制的编辑器, 为 VIM 编写适合自己使用的 .vimrc 是有必要的。 这里给出了一个适合初学者使用的 .vimrc 框架, 以及每一项设置的详细解释, 希望能给大家带来一些帮助。
这里是滇狐自己的 .vimrc, 里面有很多根据滇狐自己的习惯所做的设置。 如果你希望在自己机器上使用的话, 需要根据你的习惯做一些修改。
4 VIM 进阶
通 过一个星期的努力, 把 vimtutor 中的基本命令都熟练掌握后, 使用 VIM 进行简单快速的编辑应该已经没有什么问题了。 接下来,可以每天抽出半个小时时间, 在半个月左右内把 VIM 用户手册大概阅读一遍。 在 VIM 中 Normal 模式下输入“:help usr_toc”即可看到用户手册, 如果更习惯看中文版的话, 可以到这里下载。
记住, 没有必要记住手册中的所有命令, 只要大概知道有哪些命令, 需要用的之后知道到哪一章去查就可以了。 常用的命令查过几次之后自然而然就能够记住, 不常用的命令记下来也没有什么意义。
另外, 可以根据自己的需要, 下载一些常用的 VIM 插件, 方便自己的日常生活与工作。 这里有滇狐整理的 VIM 常用插件推荐, 感兴趣的话可以看看。
如果对 VIM 还有更加浓厚的兴趣的话, 可以试着自己编写 VIM 插件, 不过那些内容就不是这篇文章能够涉及的了。 祝大家好运! Happy VIMming~
VIM参数解释
VIM 中可供用户定制的选项非常非常多, 作为初学者, 我们没有必要了解这么多东西。
下面, 滇狐简单列出了一些最常用的配置项, 大家可以根据自己的需要将这些内容添加到自己的
.vimrc 中。
1 基本设置
*
set nocp
该命令指定让 VIM 工作在不兼容模式下。 在 VIM 之前, 出现过一个非常流行的编辑器叫
vi。 VIM 许多操作与 vi 很相似, 但也有许多操作与 vi 是不一样的。 如果使用“:set
cp”命令打开了兼容模式开关的话, VIM 将尽可能地模仿 vi 的操作模式。
也许有许多人喜欢“最正统的 vi”的操作模式, 对于初学者来说, vi 里许多操作是比较不方便的。
举一个例子, VIM 里允许在 Insert 模式下使用方向键移动光标, 而 vi 里在
Insert 模式下是不能移动光标的, 必须使用 ESC 退回到 Normal 模式下才行。
再举一个例子, vi 里使用 u 命令可以撤消一次先前的操作, 再次按下 u
时, 将撤消“撤消”这个动作本身, 也就是我们常说的“重复”(redo)。
而 VIM 里可以使用 u 命令撤消多步操作, “重复”使用的快捷键是 Ctrl
+ R。
使用兼容模式后, VIM 将放弃这些新的功能, 尽量模仿 vi 的各种操作方式。
只有在不兼容模式下, 才能更好地发挥 VIM 自身的特点。 Bram 爷爷强烈推荐大家使用
VIM 的不兼容模式, 滇狐也是这样推荐的。 请务必在你的 .vimrc 中的第一行写上:
“set nocp”。
*
set ru
该命令打开 VIM 的状态栏标尺。 默认情况下, VIM 的状态栏标尺在屏幕底部,
它能即时显示当前光标所在位置在文件中的行号、列号, 以及对应的整个文件的百分比。
打开标尺可以给文件的编辑工作带来一定方便。
*
set hls
搜索时高亮显示被找到的文本。 该指令的功能在 vimtutor 中已经有过介绍,
这里就不多说了。 其实似乎许多人并不喜欢这个功能。
*
set is
搜索时在未完全输入完毕要检索的文本时就开始检索。 vimtutor 对该命令也有过介绍,
滇狐并不喜欢这个功能, 因此滇狐自己的配置文件里是没有这条命令的。 但是周围有朋友很喜欢这个,
因此滇狐还是将它列在这里。
*
syntax on
打开关键字上色。 进行程序设计的朋友应该都知道关键字上色是什么东西,
因此这里就不多说了。 不进行程序设计的朋友不妨也打开这个功能, 虽然不一定能够用得着,
但这个功能其实也是很好玩的。
*
set backspace=indent,eol,start
设想这样一个情况: 当前光标前面有若干字母, 我们按下 i 键进入了 Insert
模式, 然后输入了 3 个字母, 再按 5 下删除(Backspace)。 默认情况下,
VIM 仅能删除我们新输入的 3 个字母, 然后喇叭“嘟嘟”响两声。 如果我们“set
backspace=start”, 则可以在删除了新输入的 3 个字母之后, 继续向前删除原有的两个字符。
再设想一个情况: 有若干行文字, 我们把光标移到中间某一行的行首, 按
i 键进入 Insert 模式, 然后按一下 Backspace。 默认情况下, 喇叭会“嘟”一声,
然后没有任何动静。 如果我们“set backspace=eol”, 则可以删除前一行行末的回车,
也就是说将两行拼接起来。
当我们设置了自动缩进后, 如果前一行缩进了一定距离, 按下回车后, 下一行也会保持相同的缩进。
默认情况下, 我们不能在 Insert 模式下直接按 Backspace 删除行首的缩进。
如果我们“set backspace=indent”, 则可以开启这一项功能。
上述三项功能, 你可以根据自己的需要, 选择其中一种或几种, 用逗号分隔各个选项。
建议把这三个选项都选上。
*
set whichwrap=b,s,<,>,[,]
默认情况下, 在 VIM 中当光标移到一行最左边的时候, 我们继续按左键,
光标不能回到上一行的最右边。 同样地, 光标到了一行最右边的时候, 我们不能通过继续按右跳到下一行的最左边。
但是, 通过设置 whichwrap 我们可以对一部分按键开启这项功能。 如果想对某一个或几个按键开启到头后自动折向下一行的功能,
可以把需要开启的键的代号写到 whichwrap 的参数列表中, 各个键之间使用逗号分隔。
以下是 whichwrap 支持的按键名称列表:
o
b
在 Normal 或 Visual 模式下按删除(Backspace)键。
o
s
在 Normal 或 Visual 模式下按空格键。
o
h
在 Normal 或 Visual 模式下按 h 键。
o
l
在 Normal 或 Visual 模式下按 l 键。
o
<
在 Normal 或 Visual 模式下按左方向键。
o
>
在 Normal 或 Visual 模式下按右方向键。
o
~
在 Normal 模式下按 ~ 键(翻转当前字母大小写)。
o
[
在 Insert 或 Replace 模式下按左方向键。
o
]
在 Insert 或 Replace 模式下按右方向键。
*
set encoding=cp936
设置当前字符编码为简体中文。 这里还有一段能够自动判断文件的 encoding,
自动选择合适的编码的 .vimrc 代码, 感兴趣的话可以放到自己的配置文件中使用:
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
2 文本编辑设置
*
set sw=4
自动缩进的时候, 缩进尺寸为 4 个空格。
*
set ts=4
Tab 宽度为 4 个字符。
*
set et
编辑时将所有 Tab 替换为空格。
该选项只在编辑时将 Tab 替换为空格, 如果打开一个已经存在的文件, 并不会将已有的
Tab 替换为空格。 如果希望进行这样的替换的话, 可以使用这条命令“:retab”。
3 断行设置
*
set lbr
不在单词中间断行。 设置了这个选项后, 如果一行文字非常长, 无法在一行内显示完的话,
它会在单词与单词间的空白处断开, 尽量不会把一个单词分成两截放在两个不同的行里。
*
set fo+=mB
打开断行模块对亚洲语言支持。 m 表示允许在两个汉字之间断行, 即使汉字之间没有出现空格。
B 表示将两行合并为一行的时候, 汉字与汉字之间不要补空格。 该命令支持的更多的选项请参看用户手册。
4 C/C++ 编码设置
*
set sm
显示括号配对情况。 打开这个选项后, 当输入后括号 (包括小括号、中括号、大括号)
的时候, 光标会跳回前括号片刻, 然后跳回来, 以此显示括号的配对情况。
*
set cin
打开 C/C++ 风格的自动缩进。 打开了自动缩进后, 在编码的时候我们可以使用“V”命令选中一段文本后,
按“=”将这段文本重新调整缩进格式, 在一定程度上起到代码美化的作用。
另外, 打开了自动缩进后, 在使用 TERM 下的 vim 的时, 粘贴代码时常常会出现版式混乱的现象。
那是因为 TERM 并不知道你现在正在粘贴代码, 它直接“粘贴”动作向 vim
解释为键入, 因此 vim 便按照设置的自动缩进格式为你的代码调整了缩进。
不幸的是, 粘贴进去的代码中本身已经包含了缩进, 因此便出现了版式混乱的情况。
在 gvim 中就不会出现这个问题, 因为它能够知道你现在正在粘贴。
知道了这个症状的来由, 解决方案也就显而易见了: 在粘贴的时候把所有自动缩进都关闭,
粘贴完毕之后再打开。 一个个手工关闭自动缩进未免过于繁琐, vim 为我们提供了一个很好用的命令,
只要输入“:set paste”, 就可以关闭所有自动缩进。 粘贴完毕后再输入“:set
nopaste”就可以重新打开原有的自动缩进设置了。
*
set cino=:0g0t0(sus
设定 C/C++ 风格自动缩进的选项, 这里简要介绍一下这段代码里用到的选项的含义,
cino 支持的选项还很多, 更多选项请看用户手册。
// :0
//
// switch 语句之下的 case 语句缩进 0 个空格,也就是说不缩进,与 switch 块平
// 齐,使用这样风格:
switch (x)
{
case 1:
a = b;
break;
default:
}
// g0
//
// class、struct 等之下的访问权限控制语句,如 public、protected、private 等,
// 相对 class、struct 等所在的块缩进 0 个空格,与 class 等块平齐,使用这样的
// 风格:
class foo
{
public:
int a;
private:
int b;
};
// t0
//
// 如果函数返回值与函数名不在同一行,则返回值缩进 0 个空格,也就是说不缩进,如
// 下所示:
// set cino=t4
int
func1()
{
}
// set cino=t0
int
func()
{
}
// (sus
//
// 当一对括号跨越多行时,其后的行缩进前面 sw 指定的距离,效果如下:
int a = (1 + 2 + 3
+ 4 + 5 + 6
+ 7 + 8) * 9;
*
set ai
打开普通文件类型的自动缩进。 该自动缩进不如 cindent 智能, 但它可以为你编辑非
C/C++ 文件提供一定帮助。
5 其它设置
*
set selectmode=
不使用 selectmode。
*
set mousemodel=popup
当右键单击窗口的时候, 弹出快捷菜单。
*
set keymodel=
不使用“Shift + 方向键”选择文本, “Shift + 方向键”代表向指定方向跳一个单词。
如果你喜欢这项功能的话, 可以使用“set keymodel=startsel,stopsel”打开它。
*
set selection=inclusive
指定在选择文本时, 光标所在位置也属于被选中的范围。 如果指定 selection=exclusive
的话, 可能会出现某些文本无法被选中的情况。
*
colo torte
选择 torte 配色方案。 VIM 里内置了许多关键字上色的配色方案, 另外你还可以到网上下载更多配色方案,
或是自己编写。 点击“编辑”→“调色板”, 就能列出所有支持的配色方案。
你可以把“调色板”子菜单剪下来, 然后慢慢选择, 挑出一个你最喜欢的配色方案来。
6 图形界面设置
*
set nowrap
指定不折行。 如果一行太长, 超过屏幕宽度, 则向右边延伸到屏幕外面。
如果使用图形界面的话, 指定不折行视觉效果会好得多。
*
set guioptions+=b
添加水平滚动条。 如果你指定了不折行, 那为窗口添加一个水平滚动条就非常有必要了。
*
set guifont=Courier" 9
设置图形界面下的字体。 你可以点“编辑”→“选择字体”, 然后在对话框中选出你喜欢的字体与字号,
选择完毕后, 先按几下 ESC 确认处在 Normal 模式下, 然后输入这条命令:“:set
guifont?” 回车后 gvim 屏幕最下方会显示出你当前所用的字体的名称与字号。
将获得的结果写到配置文件里面就可以了, 需要注意一点, 如果字体名称里面含有空格的话,
在抄的时候需要在所有空格前面加一个斜杠。
7 条件选择
同一个配色方案, 在 gvim 下和字符界面的 vim 下效果大相径庭, 滇狐个人的习惯是,
在 gvim 下使用 torte 配色方案, 在 vim 下使用 ron 配色方案。 因此我们有必要针对
gvim 和 vim 进行不同的设置。
另外, 前面我们在 gvim 下不使用折行, 开启水平滚动条, 但在 vim 下,
是没有滚动条可用的, 因此还是有必要为 vim 保留自动折行。
条件选择设置的格式如下:
if (has("gui_running"))
" 图形界面下的设置
set nowrap
set guioptions+=b
colo torte
else
" 字符界面下的设置
set wrap
colo ron
endif
以下是滇狐自己的 .vimrc, 有许多根据滇狐自己的习惯做的设置, 如果你要在自己机器上使用的话,
请根据你自己的习惯作出相应修改。
另外, 这份 .vimrc 里面有许多设置是针对插件的, 只有安装了相应插件后,
这些配置才会起作用。 这里有滇狐使用的全部插件打包,
如果需要的话可以直接下载, Linux 用户将该压缩包解压到 $HOME 目录下即可使用,
Windows 用户可以将压缩包解压后, 将解压得到的 .vim 文件夹改名为 vimfiles,
然后复制到 VIM 的安装路径下, 覆盖原有文件。
"=============================================================================
" General settings
"=============================================================================
set nocp
set ru
set cin
set sm
set ai
set sw=4
set ts=4
set et
set cino=:0g0t0(sus
set lbr
set hls
set backspace=indent,eol,start
set whichwrap=b,s,<,>,[,]
set fo+=mB
set selectmode=
set mousemodel=popup
set keymodel=
set selection=inclusive
set matchpairs+=<:>
" for gdbvim
set noshowcmd
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
" Cursor movement
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
nnoremap <End> g$
nnoremap <Home> g0
vnoremap <End> g$
vnoremap <Home> g0
inoremap <End> <C-o>g$
inoremap <Home> <C-o>g0
nmap <C-F4> :confirm bd<CR>
vmap <C-F4> <ESC>:confirm bd
omap <C-F4> <ESC>:confirm bd
map! <C-F4> <ESC>:confirm bd
" Move lines
nmap <C-Down> :<C-u>move .+1<CR>
nmap <C-Up> :<C-u>move .-2<CR>
imap <C-Down> <C-o>:<C-u>move .+1<CR>
imap <C-Up> <C-o>:<C-u>move .-2<CR>
vmap <C-Down> :move '>+1<CR>gv
vmap <C-Up> :move '<-2<CR>gv
" Toggle line number
nmap <C-F12> :set nu!<CR>
imap <C-F12> <C-o>:set nu!<CR>
" Toggle spell check
" For VIM7 only
nmap <C-F11> :set spell!<CR>
imap <C-F11> <C-o>:set spell!<CR>
syntax on
if (has("gui_running"))
set nowrap
set guioptions+=b
colo torte
else
set wrap
colo ron
endif
" ============================================================================
" Plugins settings
" ============================================================================
" Sketch
command -nargs=0 ToggleSketch call ToggleSketch()
" WinManager
" let g:winManagerWindowLayout = "FileExplorer"
" Tlist
let Tlist_Use_Right_Window=1
let Tlist_File_Fold_Auto_Close=1
" A
let g:alternateNoDefaultAlternate=1
" VIM7 doesn't support this.
"let g:alternateExtensions_{"aspx"} = "aspx.cs,aspx.CS"
"let g:alternateExtensions_{"aspx.cs"} = "aspx,ASPX"
" LateXSuite
filetype plugin on
set grepprg=grep" -nH" $*
" Viki
let g:vikiNameSuffix=".viki"
augr viki
au!
au BufRead,BufNewFile *.viki set filetype=viki
augr END
"=============================================================================
" Functions
"=============================================================================
function TextWork()
set nocin
set nosm
set noai
set tw=78
set sw=8
set ts=8
set nowrap
endfunction
function NoTextWork()
set cin
set sm
set ai
set tw=0
set sw=4
set ts=4
if (!has("gui_running"))
set wrap
endif
endfunction
function CodeWork()
call NoTextWork()
WManager
Tlist
endfunction
function TimeStamp()
let curposn= SaveWinPosn()
%s/"$Date: .*"$/"=strftime("$Date: %Y-%m-%d %H:%M:%S$")/ge
%s/Last Change: .*$/"=strftime("Last Change: %Y-%m-%d %H:%M:%S")/ge
%s/Last Modified: .*$/"=strftime("Last Modified: %Y-%m-%d %H:%M:%S")/ge
" Replace once and never update.
%s/Created: *$/"=strftime("Created: %Y-%m-%d %H:%M:%S")/ge
call RestoreWinPosn(curposn)
endfunction
function AutoTimeStamp()
augr tagdate
au!
au BufWritePre,FileWritePre * call TimeStamp()
augr END
endfunction
call AutoTimeStamp()
function NoAutoTimeStamp()
augr tagdate
au!
augr END
endfunction
"=============================================================================
" Commands
"=============================================================================
command -nargs=0 TextWork call TextWork()
command -nargs=0 NoTextWork call NoTextWork()
command -nargs=0 CodeWork call CodeWork()
command -nargs=0 TimeStamp call TimeStamp()
command -nargs=0 AutoTimeStamp call AutoTimeStamp()
command -nargs=0 NoAutoTimeStamp call NoAutoTimeStamp()
"=============================================================================
" Platform dependent settings
"=============================================================================
"-----------------------------------------------------------------------------
" Common
"-----------------------------------------------------------------------------
" Calender
let g:calendar_diary="/home/edward/document/diary"
" Spell Check
" VIM7 supports built-in spell check.
"function SpellCheck()
" !aspell --lang=en -c %
"endfunction
"command -nargs=0 SpellCheck call SpellCheck()
" Mail Template
function MailWork()
0r ~/document/text/mailtemp.txt
%s/%%date%%/"=strftime("%Y-%m-%d")/ge
%s/%%cursor%%//ge
call TextWork()
endfunction
command -nargs=0 MailWork call MailWork()
" Use kittiemake as the default compiler
function Kittie()
set makeprg=kittiemake
endfunction
command -nargs=0 Kittie call Kittie()
" Don't use kittiemake as the default compiler
function NoKittie()
set makeprg=make
endfunction
command -nargs=0 NoKittie call NoKittie()
"-----------------------------------------------------------------------------
" Win32
"-----------------------------------------------------------------------------
"if (has("gui_running"))
" set guifont=新宋体:h9:cGB2312
"endif
" For LaTeX Suite
"let g:Tex_CompileRule_dvi="latex -src-specials -interaction=nonstopmode $*"
"set shellslash
" For tee
"set shellpipe=2>&1"|" tee
" VimTweak
"if (has("gui_running"))
" command -nargs=1 SetAlpha call libcallnr("vimtweak.dll",
" ""SetAlpha", )
" command -nargs=0 TopMost call libcallnr("vimtweak.dll",
" ""EnableTopMost", 1)
" command -nargs=0 NoTopMost call libcallnr("vimtweak.dll",
" ""EnableTopMost", 0)
"endif
"-----------------------------------------------------------------------------
" Linux
"-----------------------------------------------------------------------------
"For LaTeX Suite
"function RemoteLaTeX()
" let g:Tex_ViewRule_dvi="xdvi -editor 'gvim --servername """
" ".expand("%:p").""" --remote-silent'"
" augr remotelatex
" au!
" augr END
"endfunction
"augr remotelatex
"au!
"au BufRead * call RemoteLaTeX()
"augr END
let g:Tex_CompileRule_dvi
"="latex -src-specials -interaction=nonstopmode $*"
let g:Tex_ViewRule_dvi
"="xdvi -editor 'gvim --servername latex-suite --remote-silent'"
if (has("gui_running"))
set guifont=Bitstream" Vera" Sans" Mono" 9
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
endif
Posted by 1+1=2 at 10:00 PM 0 comments
Labels: vim
Monday, October 09, 2006
标题: vim + ctags + taglist + cscope + cppcomplete + global 使用初探(zz)
由于本人比较喜欢在终端状态下的vim,所以gvim下的扩展使用的不多。这里介绍的也是我简单的使用以上扩展的一点点体会。请大家指正。 emacs 不会用,也没有比较过拉。
1、大体感觉,(因为使用时间不长,不全面)
总体使用的感觉定位查找类型定义基本可以用,但自动补全类型方面由于ctags的功能有限,感觉在大工程时,不一定很好用。
大型程序一定要global的参与,它的分析比较全面,但在vim中的提示信息有限。
taglist 精干,需要ctags的支撑 ,直接可以在左边列出函数列表,全局参数列表。(可以排序)
cscope 比较强大,可以对函数以及部分类型定义进行跳转,但有些BUG,好像在某些条件下无法正确找到分析枚举的定义。
cppcomplete 需要ctags的支撑,可以补全类型或者函数名(可不是普通Ctrl+P/N的那种)
global 新版本可以嵌入vim使用,提供比较完整解析和类型索引,和cscope比,稍微差些的就是对类型引用的打印列表中没有标识这个引用在什么函数中进行的。 其实我的感觉global可能不是为vim所生,它的主要目的是用html的方式进行表达相关的关联关系和索引,使用起来感觉没有cscope的那么贴 切。
2、相关的扩展的安装
代码:
apt-get install exuberant-ctags cscope global
cppcomplete 和 taglist 要到www.vim.org的扩展列表中下载。
taglist 的下载地址:
http://www.vim.org/scripts/script.php?script_id=273
cppcomplete 的下载地址:
http://www.vim.org/scripts/script.php?script_id=527
然后在 建立目录
代码:
$HOME/.vim/plugin
将下载的cppcomplete.vim 和 taglist.vim拷贝到$HOME/.vim/plugin中。
安装了global后,最新4.8.6 以上版本有带vim的扩展,将它也拷贝到 $HOME/.vim/plugin
debian sid 版本global安装后扩展文件在
代码:
/usr/share/doc/global/examples/gtags.vim.gz
需要拷贝到$HOME/.vim/plugin后解压,解压方法:
代码:
gzip -d gtags.vim.gz
3、使用这些工具
1)准备工作,先修改一下$HOME/.vimrc文件
为了更好的使用cscope请添加如下内容,这样Ctrl-]的跳转将由cscope的tags进行分析。
代码:
if has("cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
set cscopetag
set cscopequickfix=s-,g-,c-,d-,t-,e-,f-,i-
endif
2)使用cscope
cscope的tag生成最简单的方法是:
在你的开发工程的最上层目录执行cscope-indexer,它会遍历下面的所有目录,生成两个文件,一个是cscope.files,这个文件记录需要生成tags的文件名,可以手工修改,另一个是cscope格式的tags文件cscope.out。
完成后,你在生成了cscope.out的目录打开工程的任意文件,就可以使用Ctrl-]跳转查找类型定义了。
代码:
cs f s xxxx 查找xxxx出现的地方,它能详细列出哪些文件的哪行的哪个函数引用,以及该行的内容,比较不错。 :)
它的所有命令的使用请参考:
代码:
help cscope
3)使用taglist
taglist的功能是即时生成当前文件的函数列表和全局变量列表,便于索引。
在vim中命令模式下使用
Tlist 打开或者关闭当前文件的索引;
TlistSync 立即在打开的索引窗口中定位当前的光标所在位置属于哪个函数或者结构定义中。
还有其他命令,请参考它的帮助文件。
4)ctags的使用
其实cscope是用来替代ctags功能的,ctags的应用广泛,还有其他很多的软件依赖它。
例如要生成cppcomplete需要的tags文件的话,需要运行下面的命令:
代码:
ctags -n -f cppcomplete.tags --fields=+ai --C++-types=+p * -L cscope.files
注意,我在最后使用了参数"-L cscope.files" 这仅仅是借用拉cscope生成的文件索引来帮助ctags去查询相关工程文件生成tags。
5)使用cppcomplete
cppcomplete的使用我只是简单的发现它可以根据上述方法生成的tags文件来自动补全类型成员。
使用很简单,就是在你需要补全类型成员时,按F8键就可以拉。它一般第一次使用时,需要让你确认是使用已有的tags文件还是再生成一次。一般我们自己控制生成tags文件的时机,它就使用就行拉。
但它也受到ctags的分析能力比较差的限制,可能不是每次都能帮到你。
6)使用global
在工程的最上层目录执行命令:
gtags
等待它完成所有需要的global自己格式的tags的生成
生成完后,需要的就是在生成tags的目录打开你的工程的任意文件,用如下命令查询相关类型引用和关联关系:
代码:
Gtags xxxx 查找xxxx的定义
Gtags -r xxxx 查找xxxx的引用
Gtags -s xxxx 查找xxxx出现的地方
它的提示信息很有显,不如cscope更直观,但对大型分析的比较完整。
有时它无法正常分析的类型 可以试试用带-s 的参数的方式找找类型定义。再不行,我就不清楚拉
4、草草的收尾
我使用它们也是一点一点的摸索的没有系统的完整的使用过,也受限于本人的Linux使用经验和工作关系,所以非常简单的使用体会给大家一个参考,希望能有所帮助。更希望后来者能不断补充相关的使用体会。大家都需要交流提高,呵呵。
Posted by 1+1=2 at 4:47 AM 0 comments
Labels: vim
Ctags with Vim
标 题: Ctags with Vim
发信站: BBS 水木清华站 (Mon May 24 08:42:57 2004), 站内
usage: $ctags [-R] inc_dir/*.h include_dir/*.hpp src_dir/*.c
example: $ ctags -R `find . -name "*.c"` `find . -name "*.h"`
su; cd /usr/include; ctags --c-types=+p+x -sort -R
生成非常完整,巨大而有序的tags
各用户在 ~/.vimrc中添加set tags= ./tags, tags, /usr/include/tags即可使用
[注1]+p开关会跳到变量声明的地方而不是它的实现,所以还是采用缺省值,
不要--c-types这个选项,或者只要+x(推荐),其它无所谓。
还有/usr/include并不是/usr/src/linux/include的一个符号链接,
所以如果是看内核中一些变量的定义的话应该到/usr/src/linux上面用ctags
ctags浏览代码 (有的命令说明可能不准确)
:set tags=/Dir/tags 设置需要的tags文件,
可以多个:set tags=/dir1/tags, /dir2/tags
:tag xxx 转到满足查找代码的定义处,简写为 :ta xxx
:tag /^xxx 转到以xxx为起始的tag处
other find tags :stag/ptag/ts/tj/pts/ptj /
:tag /xxx 列出所有包含xxx的tag
:tag 转到前一个浏览过的tag处
vi -t xxx 直接定位到xxx的定义处
:tn / :tp 转到下/上一个tag代码处,可以使用:5tn的形式
:tr / :tl 转到首/尾tag代码处
, 转到光标所在函数或者变量的定义处 g+左键 (GUI) [注2]
, 回到跳转前的代码处(适用于任何跳转) g+右键 (GUI)
:tags 列出当前tag栈的内容
:ts xxx 列出所有匹配的代码及其所属文件,并提供选择浏览
:sts xxx 列出匹配处提供选择在新窗口中打开文件
:tj xxx 类似 :ts xxx,当只有一个匹配时直接转到代码处
g] 与 :ts xxx 功能相同(tag为光标下的标识符)
g] 等价于 :sts xxx
g 等价于 :tj xxx
:pt? xxx 提供上述命令(?为j,s)的预览功能,退出窗口 :q!
:t?! xxx 当前文件的修改被丢弃转到目标文件中
} 在预览窗口中显示当前光标下的tag
:ptl / ptf / ptn /ptp 类似于 tl,tf,tn,tp
:che 察看没有找到的头文件(checkpath)
makeprg :set makeprg=gcc" yourfile.c 为在线编译设置
:make 在线编译
:cn / :cN 移动到编译的 下/上 一个error处
:stag xxx 查找xxx的声明处并在新窗口中打开
:ta {ident} 跳转到标识符定义处
gd 跳转到局部标识符定义处
[注2] Ctrl-]碰巧是telnet的终端符,如果远程编辑文件可能会遇到一些问题,
请参考在线帮助:h ^]。多数telnet都允许使用命令telnet -E hostname来打开
或关闭该脱字符,或者用telnet -e escape hostname来指定另外一个脱字符
来代替^],请man telnet参看-E -e的帮助。