一步步将vim改造成C/C++开发环境(IDE)

下文中需要自己创建的文件有:
~/.vimrc    (自己的Vim配置文件,独立于系统配置文件之外)
~/.vim       (Vim插件目录)
  ~/.vim/plugin   (Vim插件子目录)
  ~/.vim/doc       (Vim插件文档子目录)
  ~/.vim/syntax
 
1、安装Vim和Vim基本插件
首先安装好Vim和Vim的基本插件。这些使用apt-get安装即可:
mn@mn-HP:~$ sudo apt-get install vim vim-scripts vim-doc
其中vim-scripts是vim的一些基本插件,包括语法高亮的支持、缩进等等。
 
vim中文帮助文档tar包下载地址:
http://sourceforge.net/projects/vimcdoc/files/vimcdoc/
解压后其中有个doc文件夹, 将其中的内容全部复制到~/.vim/doc, 或者vim安装目录下的doc目录中, 此时vim中的help信息已经是中文的了.  或者直接点击安装文件进行安装。
网页版中文帮助文档网址http://vimcdoc.sourceforge.net/doc/help.html
首页就时vim帮助文档的目录,阅读起来更方便有效、更有针对性!
 
2、Vim配置文件
Vim强大的功能,其来源基本上就两个地方:Vim插件以及Vim配置文件。
Vim 本身的系统配置文件夹是在/usr/share/vim/和/etc/vim/两个文件夹下。一般情况下,我们不会去改变这两个文件夹下的配置文件,而是 在用户文件夹/home/user(其中,user为用户名,我的用户名是mn)下建立自己的配置文件。进入用户文件夹(/home/user/) 之后,用gedit新建一个名叫.vimrc的文件:
mn@mn-HP:~$ cd ~
mn@mn-HP:~$ gedit .vimrc
注:使用gedit主要是为了方便大段大段的文字粘贴!
然后把下面的文字拷贝进这个文件,然后保存:
View Code
 1 " This line should not be removed as it ensures that various options are
 2 " properly set to work with the Vim-related packages available in Debian.
 3  runtime! debian.vim
 4 
 5 " Uncomment the next line to make Vim more Vi-compatible
 6 " NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
 7 " options, so any other options should be set AFTER setting 'compatible'.
 8 set nocompatible
 9 
10 " Vim5 and later versions support syntax highlighting. Uncommenting the
11 " following enables syntax highlighting by default.
12 if has("syntax")
13   syntax on            " 语法高亮
14 endif
15 colorscheme ron        " elflord ron peachpuff default 设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下
16 
17 " detect file type
18 filetype on
19 filetype plugin on
20 
21 " If using a dark background within the editing area and syntax highlighting
22 " turn on this option as well
23 set background=dark
24 
25 " Uncomment the following to have Vim jump to the last position when
26 " reopening a file
27 if has("autocmd")
28   au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
29   "have Vim load indentation rules and plugins according to the detected filetype
30   filetype plugin indent on
31 endif
32 
33 " The following are commented out as they cause vim to behave a lot
34 " differently from regular Vi. They are highly recommended though.
35 
36 "set ignorecase        " 搜索模式里忽略大小写
37 "set smartcase        " 如果搜索模式包含大写字符,不使用 'ignorecase' 选项。只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用。
38 set autowrite        " 自动把内容写回文件: 如果文件被修改过,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令时进行;用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令转到别的文件时亦然。
39 set autoindent        " 设置自动对齐(缩进):即每行的缩进值与上一行相等;使用 noautoindent 取消设置
40 "set smartindent        " 智能对齐方式
41 set tabstop=4        " 设置制表符(tab键)的宽度
42 set softtabstop=4     " 设置软制表符的宽度    
43 set shiftwidth=4    " (自动) 缩进使用的4个空格
44 set cindent            " 使用 C/C++ 语言的自动缩进方式
45 set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s     "设置C/C++语言的具体缩进方式
46 "set backspace=2    " 设置退格键可用
47 set showmatch        " 设置匹配模式,显示匹配的括号
48 set linebreak        " 整词换行
49 set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
50 "set hidden " Hide buffers when they are abandoned
51 set mouse=a            " Enable mouse usage (all modes)    "使用鼠标
52 set number            " Enable line number    "显示行号
53 "set previewwindow    " 标识预览窗口
54 set history=50        " set command history to 50    "历史记录50条
55 
56 
57 "--状态行设置--
58 set laststatus=2 " 总显示最后一个窗口的状态行;设为1则窗口数多于一个的时候显示最后一个窗口的状态行;0不显示最后一个窗口的状态行
59 set ruler            " 标尺,用于显示光标位置的行号和列号,逗号分隔。每个窗口都有自己的标尺。如果窗口有状态行,标尺在那里显示。否则,它显示在屏幕的最后一行上。
60 
61 "--命令行设置--
62 set showcmd            " 命令行显示输入的命令
63 set showmode        " 命令行显示vim当前模式
64 
65 "--find setting--
66 set incsearch        " 输入字符串就显示匹配点
67 set hlsearch   

注:配置文件中,以单个双引号开头的文字为注释。

保存文件之后,启动Vim。此时,Vim已经是这种效果了(语法高亮挺漂亮的–这个是由vim-scripts中的插件支持的)。

 

3、ctags安装与配置
ctags可以建立源码树的标签索引(标签就是一个标识符被定义的地方,如函数定义),使程序员在编程时能迅速定位函数、变量、宏定义等位置去查看原形
以下是在ubuntu下ctags的下载安装和配置过程:
下载并安装ctags,终端输入命令
mn@mn-HP:~$ sudo apt-get install ctags

A、例如要建立vlc的源代码索引,首先进入源码的根目录,输入命令ctags -R, 然后会发现源码的根目录中出现了一个tags文件,这即是该源码的索引文件。

mn@mn-HP:~/document/Source_Code$ cd vlc/
mn@mn-HP:~/document/Source_Code/vlc$ ls
AUTHORS    bin       bootstrap  configure.ac  COPYING      doc     include  lib  make-alias   modules  po        README  src   THANKS
autotools  bindings  compat     contrib       COPYING.LIB  extras  INSTALL  m4   Makefile.am  NEWS     projects  share   test
mn@mn-HP:~/document/Source_Code/vlc$ ctags -R
mn@mn-HP:~/document/Source_Code/vlc$ ls
AUTHORS    bin       bootstrap  configure.ac  COPYING      doc     include  lib  make-alias   modules  po        README  src   test
autotools  bindings  compat     contrib       COPYING.LIB  extras  INSTALL  m4   Makefile.am  NEWS     projects  share   tags  THANKS

此时索引建立好,例如用vim打开文件bin/vlc.c ,输入vim bin/vlc.c  

mn@mn-HP:~/document/Source_Code/vlc$ vim bin/vlc.c

再在vim中运行命令:
:set tags=/home/mn/document/Source_Code/vlc/tags

该命令将tags文件加入到vim中来, 你也可以将这句话放到~/.vimrc中去, 如果你经常在这个工程编程的话.

 

B、建立源码索引,比如需要经常查阅Linux的内核代码,而这些代码放在/home/lingd/arm/linux-2.6.24.7目录下,
那么在终端进入到该目录后,输入命令ctags -R *,你会发现多了一个tags文件,这个就是索引文件。

mn@mn-HP:~/document/Source_Code$ cd linux-3.3.7/
mn@mn-HP:~/document/Source_Code/linux-3.3.7$ ls
arch   COPYING  crypto         drivers   fs       init  Kbuild   kernel  MAINTAINERS  mm   README          samples  security  tools  virt
block  CREDITS  Documentation  firmware  include  ipc   Kconfig  lib     Makefile     net  REPORTING-BUGS  scripts  sound     usr
mn@mn-HP:~/document/Source_Code/linux-3.3.7$ ctags -R
mn@mn-HP:~/document/Source_Code/linux-3.3.7$ ls
arch   COPYING  crypto         drivers   fs       init  Kbuild   kernel  MAINTAINERS  mm   README          samples  security  tags   usr
block  CREDITS  Documentation  firmware  include  ipc   Kconfig  lib     Makefile     net  REPORTING-BUGS  scripts  sound     tools  virt


向vim注册索引文件tags的路径,
mn@mn-HP:~/document/Source_Code/linux-3.3.7$ vi ~/.vimrc
在打开文件的最后添加如下内容(当然,具体路径根据你自己的情况)

View Code
1     "--ctags setting--
2     " 按下F5重新生成tag文件,并更新taglist
3     map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
4     imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
5     set tags=tags
6     set tags+=./tags "add current directory's generated tags file
7     set tags+=~/document/Source_Code/linux-3.3.7/tags "add new tags file(刚刚生成tags的路径,在ctags -R 生成tags文件后,不要将tags移动到别的目录,否则ctrl+]时,会提示找不到源码文件)

set tags+=./tags  表示在当前工作目录下搜索tags文件

set tags+=~/document/Source_Code/linux-3.3.7/tags  表示在搜寻tags文件的时候,也要搜寻~/document/Source_Code/linux-3.3.7文件夹下的tags文件。

然后保存并退出vi。这样,你就可以用vim在任意地方查看有关Linux的函数原形。

------------------------------------
tag命令用法:
Ctrl+]  跳到当前光标下单词的标签
Ctrl+O  返回上一个标签
Ctrl+T  返回上一个标签
:tag TagName 跳到TagName标签
以上命令是在当前窗口显示标签,当前窗口的文件替代为包标签的文件,当前窗口光标跳到标签位置。如果不希望在当前窗口显示标签,可以使用以下命令:
:stag TagName 新窗口显示TagName标签,光标跳到标签处
Ctrl+W + ]  新窗口显示当前光标下单词的标签,光标跳到标签处
当一个标签有多个匹配项时(函数 (或类中的方法) 被多次定义),":tags" 命令会跳转到第一处。如果在当前文件中存在匹配,那它将会被首先使用。
可以用这些命令在各匹配的标签间移动:
:tfirst    到第一个匹配
:[count]tprevious 向前 [count] 个匹配
:[count]tnext  向后 [count] 个匹配
:tlast    到最后一个匹配
或者使用以下命令选择要跳转到哪一个
:tselect TagName
输入以上命令后,vim会为你展示一个选择列表。然后你可以输入要跳转到的匹配代号 (在第一列)。其它列的信息可以让你知道标签在何处被定义过。
以下命令将在预览窗口显示标签
:ptag TagName 预览窗口显示TagName标签,光标跳到标签处
Ctrl+W + }  预览窗口显示当前光标下单词的标签,光标跳到标签处
:pclose   关闭预览窗口
:pedit file.h 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。 

 
最简单的使用方法举例
用vi在任意目录写一个Test.c文件,内容如下:
  1. int main(void)
  2. {
  3.         printf("Hello World!\n");
  4.         return 0;
  5. }
写好后末行模式输入w保存好(不要退出vi),按Esc回到指令模式,把光标停留在printf上
然后按 Ctrl+W + ],vi会自动跳到Linux系统函数printf()处,这时我们能查看printf()的原形
查看完了,按Ctrl+o(回到上一个标签) 就回到原来的地方。

 

4、管理vim插件——vim-addons
通过vim-addons,我们可以管理vim插件。我 们在sudo apt-get install vim vim-scripts vim-doc时,一般会自动安装上vim-addons。若未安装可通过sudo apt-get install vim-addon-manager手动安装。安装完成后,就可以用vim-addons管理vim插件了。
# 系统中已有的vim-scripts中包含的插件及其状态:
mn@mn-HP:~$ vim-addons status

上面我们介绍了如何独立于系统配置文件之外,建立自己的Vim配置文件。当我们自己下载安装Vim插件的时候,也可以另外建立目录,放置我们自 己的插件。这个目录一般为/home/user/.vim,另外还需要建立一个插件子目录,一个插件文档子目录,以上的可以进入/home/user目录 下通过下面的命令执行:
mn@mn-HP:~$ mkdir .vim
mn@mn-HP:~$ cd .vim
mn@mn-HP
:~/.vim$ mkdir plugin
mn@mn-HP
:~/.vim$ mkdir doc 
# vim官方插件的安装,xxxx是要安装的插件名,以status中显示的名称为准。

安装插件xxxx时使用以下命令(前提是在目录/home/user/.vim/下建立好了plugin和doc两个文件夹)vim-addons install xxxx  

关于vim-addons命令的详细用法,可以通过“man vim-addons”查看其帮助文档。

 

5、标签浏览器Taglist
Taglist用于列出了当前文件中的所有标签(宏, 全局变量, 函数名等)
安装Taglist
mn@mn-HP:~$ vim-addons install taglist
配置Taglist
在vim配置文件/home/user/.vimrc中加入如下的配置:

View Code
1     "-- Taglist setting --
2     let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
3     let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
4     let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
5     let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
6     let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
7     "是否一直处理tags.1:处理;0:不处理
8     let Tlist_Process_File_Always=1 "实时更新tags
9     let Tlist_Inc_Winwidth=0

进入vim后用命令":Tlist"打开/关闭taglist窗口

帮助文档
:help taglist.txt

 

6、文件浏览器和缓冲区管理器WinManager
WinManager用于管理文件浏览器和缓冲区(buffer)。2.0以上版本的WinManager还可以管理其他IDE类型插件,不过要用户在插件中增加一些辅助变量和hook来支持WinManager(帮助文档有相关说明)。
Taglist插件本身就提供了对WinManager的支持,不需要我们去修改它。这里,我们就用WinManager来管理文件浏览器netrw和标签浏览器Taglist。netrw是标准的vim插件, 已经随vim一起安装进系统里了, 不需要我们自行下载安装。
安装WinManager
mn@mn-HP:~$ vim-addons install winmanager
配置WinManager
在vim配置文件/home/user/.vimrc中加入如下的配置:

View Code
1     "-- WinManager setting --
2     let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件
3     "let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim
4     nmap wm :WMToggle<cr> 

常用命令
:WMToggle 打开/关闭WinManage,不过我们在配置文件.vimrc中做了快捷键映射,所以直接按wm就可以打开/关闭WinManage
文件浏览器命令(在文件浏览器窗口中使用)
<enter>或双击  如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
<tab>   如果光标下是目录, 则进入该目录; 如果光标下文件, 则在新窗口打开该文件
<F5> 刷新列表
-  返回上一层目录
c  使浏览目录成为vim当前工作目录
d  创建目录
D  删除当前光标下的目录或文件
i  切换显示方式
R  文件或目录重命名
s  选择排序方式
r  反向排序列表
x  定制浏览方式, 使用你指定的程序打开该文件

winmanager帮助文档
:help winmanager
netrw帮助文档
:help netrw

 

7、buffer管理器MiniBufferExplorer
MiniBufferExplorer用于浏览和管理buffer,如果只打开一个文件,是不会显示在屏幕上的,而打开多个文件之后,会自动出现在屏幕上。vim也有自带的buffer管理工具,不过只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直观.
关于vim缓冲区(buffer)和窗口的概念(详见:help windows)
"缓冲区" 是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。
"窗口" 被用来查看缓冲区里的内容。你可以用多个窗口观察同一个缓冲区,也可以用多个窗口观察不同的缓冲区。
"屏幕" Vim 所用的整个工作区域,可以是一个终端模拟窗口,也被叫做 "Vim 窗口"。一个屏幕包含一个或多个窗口,被状态行和屏幕底部的命令行分割。
        +-------------------------------+
屏幕 | 窗口 1        | 窗口 2        |
        |                   |                   |
        |                   |                   |
        |=== 状态行  ===|==== 状态行 ===|
        | 窗口 3                            |
        |                                       |
        |                                       |
        |========= 状态行 ===========|
        |命令行                            |
        +-------------------------------+

安装MiniBufferExplorer
mn@mn-HP:~$ vim-addons install minibufexplorer
配置MiniBufferExplorer
在vim配置文件/home/user/.vimrc中加入如下的配置:

View Code
1     " -- MiniBufferExplorer --
2     let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口
3     let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口
4     let g:miniBufExplMapCTabSwitchBufs = 1 " 启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持
5     "let g:miniBufExplMapCTabSwitchWindows = 1 " 启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持
6     let g:miniBufExplModSelTarget = 1    " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer

 常用命令
<Tab>  移到上一个buffer
<Shift-Tab> 移到下一个buffer
<Enter>  打开光标所在的buffer
d   删除光标所在的buffer

 

 8、项目目录树管理器Project
Project插件是用来显示项目的目录树的,这个目录树是默认保存在~/.vimprojects文件中。
安装Project
mn@mn-HP:~$ vim-addons install project
Project目录树可以通过下面的步骤生成:
1) 打开vim在命令模式下输入 :Project,在屏幕的最左边就会出现一个project框。不过因为没有初始化暂时是空的
2)在命令模式下(不是插入模式)输入\C (大写的C),会出现下面这些信息:
Enter the Name of the Entry: xxxx (输入项目名称)
Enter the Absolute Directory to Load: /xxx/xxx/xxx (输入项目根目录的绝对路径)
Enter the CD parameter: . (“.”为当前目录)或者和项目根目录一致
Enter the File Filter: *.* (符合条件的源文件,可以是*.cpp/*.h等)
PS:项目目录可以嵌套。而且更改之后在~/.vimprojects文件中就能看到内容,你可以手动进行更改。

 

9、代码折叠fold
折叠用于把缓冲区内某一范围内的文本行显示为屏幕上的一行。就像一张纸,要它缩短
些,可以把它折叠起来:

 +------------------------------------+
 |                行 1                        |
 |                行 2                        |
 |                行 3                        |
 |_______________________ |
 \                        \
  \________________________\
  / 被折叠的行             /
 /________________________/
 |               行 12                      |
 |               行 13                      |
 |               行 14                      |
 +-----------------------------------+

 

那些文本仍然在缓冲区内而没有改变。受到折叠影响的只是文本行显示的方式。
折叠的好处是,通过把多行的一节折叠成带有折叠提示的一行,会使你更好地了解对文本的宏观结构。

 

折叠方式foldmethod
vim提供以下6种方法来选定折叠方式:
manual    手工定义折叠
indent      更多的缩进表示更高级别的折叠
expr         用表达式来定义折叠
syntax      用语法高亮来定义折叠
diff            对没有更改的文本进行折叠
marker     对文中的标志折叠 

 

折叠级别foldlevel
'foldlevel' 是个数值选项:数字越大则打开的折叠更多。
当 'foldlevel' 为 0 时,所有的折叠关闭。
当 'foldlevel' 为正数时,一些折叠关闭。
当 'foldlevel' 很大时,所有的折叠打开。

 

折叠栏foldcolumn
'foldcolumn' 是个数字,它设定了在窗口的边上表示折叠的栏的宽度。当为0时,没有折叠栏。最大是12。
一个打开的折叠由一栏来表示,顶端是 '-',其下方是 '|'。这栏在折叠结束的地方结束。当折叠嵌套时,嵌套的折叠出现在被包含的折叠右方一个字符位置。
一个关闭的折叠由 '+' 表示。
当折叠栏太窄而不能显示所有折叠时,显示一数字来表示嵌套的级别。
在折叠栏点击鼠标,可以打开和关闭折叠:

- 点击 '+' 打开在这行的关闭折叠
- 在任何其他非空字符上点击,关闭这行上的打开折叠

在vim配置文件/home/user/.vimrc中加入如下的配置:

View Code
1     "--fold setting--
2     set foldmethod=syntax    " 用语法高亮来定义折叠
3     set foldlevel=100             " 启动vim时不要自动折叠代码
4     set foldcolumn=5             " 设置折叠栏宽度

常用命令
za  打开/关闭在光标下的折叠
zA  循环地打开/关闭光标下的折叠
zo  打开 (open) 在光标下的折叠
zO  循环打开 (Open) 光标下的折叠
zc  关闭 (close) 在光标下的折叠
zC  循环关闭 (Close) 在光标下的所有折叠
zM  关闭所有折叠
zR  打开所有的折叠

帮助文档
:help usr_28.txt
:help fold.txt

10、c/h文件间相互切换 -- 插件: a.vim

下载地址 http://www.vim.org/scripts/script.php?script_id=31
版本  2.18
安装 将a.vim 放到 ~/.vim/plugin 文件夹中
手册 alternate.txt  放到 ~/.vim/doc 文件夹中
下面介绍它的用法:
作为一个C程序员, 日常Coding时在源文件与头文件间进行切换是再平常不过的事了, 直接用vim打开其源/头文件其实也不是什么麻烦事, 但是只用一个按键就切换过来了, 这是多么贴心的功能啊....
安装好a.vim后有下面的几个命令可以用了:
:A 在新Buffer中切换到c/h文件
:AS 横向分割窗口并打开c/h文件
:AV 纵向分割窗口并打开c/h文件
:AT 新建一个标签页并打开c/h文件
安装alternate.txt, 运行helptags
打开vim在命令模式下输入 :helptags ~/.vim/doc
helptags后面的参数为alternate.txt所在的目录。
此时可以通过输入:help alternate
查询帮助alternate的文档。
 

posted on 2012-05-30 14:54  zzwworld  阅读(1803)  评论(0)    收藏  举报

导航