`
totoxian
  • 浏览: 1024117 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

【转】使用vim编辑C程序

阅读更多
<!-- /editable --><!-- /wrapper --><!-- /header -->

使用VIM编辑C程序
Siddharth Heroor

译:mingleiChen

修订历史
修订版v1.0 Jan 14, 2001 Revised by: sh
第二版,修正了一下排版错误
修订版v0.1 Dec 04, 2000 Revised by: sh
第一版,我很愿意听到你的反馈
本文对使用Vim进行编辑C或其他语言(如C++、JAVA)的程序做了简单的介绍。

内容
1.介绍
2.范围内移动(Moving around)
2.1 w,e,b按键
2.2 {,},[[,]]按键
2.3 %按键
3.在C文件中任意跳转
3.1 ctags
3.2 marks
3.3 gd按键
4.自动单词完成
5.自动格式化
5.1 限制列宽
5.2 自动匹配代码
5.3 注释
6.多文件编辑
7.快速修正
8.版权
9.参考

1.介绍
本文档的目的是为VIM的新手用户编辑C语言文件提供可行的编辑选项.文档介绍了一些常用的命令和按键,它们能够有效的提高程序员书写C源代码的速度.
文档主要描述了如何使用VIM编辑C语言文件.本文描述的大部分内容同样适用于vi,此外,文中谈到的关于编辑C文件的内容或多或少的适用于C++,JAVA及其他相似的语言.

2.Moving around
2.1 按键w,e,b
用户可以使用w,e,b键在文件中移动.VIM可以识别C表达式中的不同符号.
看看下面的C代码:

图1

假设光标处于if语句的开始处,当按下w键,光标将跳至第一个(.再按一次w,光标将跳至NULL.再按将跳至==,接下来的按键会分别带你到x..)... &&... y... >... z... 最后到)...
按键e的作用与w相似,只是它会带你到当前单词的末尾,而不是下个单词的开始处.
而按键b的功能与w完全相反,当你按下它,它从相反的方向开始移动光标.如上例,将)...z...>...y...&&...)...x..最后是(...
2.2 按键{,},[[,]]
{和}用于在文档中的段落间移动.当编辑C程序时,这些按键表现出些许不同的含义.下面是一段程序,包含了几个空行.例如:

图2

上面的片断显示了两个段落,用户通过使用{和}键能够很容易的从一段开始移至另一个开始。{将带领光标至段首,而}则把光标移至段尾。许多人喜欢这样的编码样式,把逻辑上的一组语句组织成段,然后使用空行分割它们。例如:

图3

在这样的场合,{和}显得非常有用。用户很轻松的就可以从‘一段’移至另一段。 另一种有用的按键是[[和]],这一对按键将把你的光标带至{之前或是}之后的第一列。例如:

图4

假设你正在编辑函数foo(),突然你想转去编辑bar(),这时只需按]],光标会带你到函数bar()的第一个{处。用户可以按[[回到foo()的开始。
其他相似的按键集是][和[],][将把光标带至下一个位于第一列的}。例如你在编写foo()时需要转到foo()的结尾,这时只需要按][就可以做到。类似的,在你编写bar()的时候若需要移到foo()的结尾,按[]可以帮你做到这点。
记住这些按键的使用方法可以这样做,第一个按键指示了它将把光标向上移还是向下移。[向上移而]向下移。第二个按键则表示将匹配那个符号。类似的,[匹配{,并将光标移向它。]将光标移向}。
关于]],][,[[,[]的一个警告:它们只匹配第一列上的符号。如果用户想让这些按键匹配不管是不是第一列上的符号。VIM的文档有相关的介绍。用户可以自定义按键映射来找到那些符号。事实上,你不需要花费太多的时间在映射上。下面推荐的映射能很好的完成那些功能。
:map [[ ?{<CTRL−VCTRL−M>w99[{

:map ][ /}<CTRL−VCTRL−M>b99]}

:map ]] j0[[%/{<CTRL−VCTRL−M>

:map [] k$][%?}<CTRL−VCTRL−M>

2.3 按键%
%用来匹配光标之后的下一个项目,可以是一个圆括号,一个大括号或是一个方括号。通过按%键,光标自动跳到相应的匹配处。
此外,%也可以用来匹配#if,#ifdef,#else,#elif和#endif。
该按键在确认写好的代码时十分有用。例如:

图5

检查上面的代码包括检查圆括号使用的正确与否。%用来从一个圆括号跳到它对应的另一个。因此,用户可以找到多写或少写的圆括号,并修正。
类似的,%也可以用来在{和它对应的}间跳转。

3.在文件中任意位置跳转
3.1 ctags
Tag是有序的位置保持集。Tags对于理解和编辑C十分有用。它们是C文件中的书签集。当你需要从某个被调用的函数出发跳转到它的定义并随时跳回时,Tags十分有用。

来看看下面的例子:

图6

假设你正在编辑函数foo(),而你想看看函数bar()的定义。此时就可以使用Tags。用户可以跳转到bar()的定义,然后跳回来。如果需要,甚至可以跳转到另一个被bar()调用的函数去,接着再跳转回来。那么,要如何使用Tags呢?用户首先需要对所有源文件使用程序ctags。它将建立一个名为tags的文件。该文件包含了VIM编写的每个函数定义的指针。通过这些指针,很轻松的就能找到所有的函数。确切的用于跳转的按键是CTRL-]和CTRL-T,分别用于向后查找和向前返回。继续看前面的例子,当在函数foo()中bar()被调用的位置上按下CTRL-],光标自动跳转至函数bar()的开始处。然后你可以按CTRL-T从bar()中返回到foo()。

程序ctags按照如下方式调用:$ ctags options file(s)

为当前目录下所有c文件生成tags,输入命令:$ ctags *.c

如果某一文件夹中不同子目录中包含C文件,用户可以在主目录下调用命令:$ ctags −R *.c来生成各个文件的tags。

关于ctags还有许多的选项,可以查看ctags的手册来获得更多信息。

3.2 marks
Marks和Tags很像,但是marks可以被设置在文件中的任意位置,而不仅仅是在函数,枚举处。此外marks必须用户手动设置。 设置一个mark没有显式的标记。mark只是VIM记着的一个文件位置。例如下面的代码:

图7

假设你正编辑行:x++;你希望在你编辑完其他行后能够快速的返回到该行。这时你可以通过按键m'来为该行设置一个mark,然后按''回到该行。

VIM允许你设置多个mark,这些mark保存于寄存器a-z,A-Z以及1-0。例如,设置一个mark并保存于寄存器j,可以按mj,返回该mark可以按'j。
设置多个mark在前进或后退到某片代码显得十分有用。来看这个例子。用户可以在x++处设置一个mark,在y=x处再设置一个,然后再这两个mark中来回跳转。

Marks甚至可以在文件间跳转。用户可以使用寄存器A-Z来实现此功能。寄存器a-z只能在文件里不同代码块间跳转。也就是说,如果你在文件foo。c中设置了mark,使用的是寄存器a,那么到另一个文件中按下'a并不能将光标移到foo。c中的mark位置。如果你需要一个能够带你到另一个文件的mark,就得使用大写的寄存器A-Z。例如,用mA代替ma。在接下来的章节里我将讨论如何进行多文件编辑。

3.3按键gd
先来看看下面的代码:

图8

假设由于某些原因你忘记了y和z是什么而想快速的找到它们的定义。一种方法是向后查找y和z。VIM提供了另一种更加简单而快捷的方案:类似于goto定义的按键gd。当光标在y上,你按gd,这时光标将自动跳转到y
的定义:struct Y y;
另一个相似的按键是gD。它会带你到变量的全局定义处。所以如果用户想查看x的定义,按gD便可以了。

4.自动补完单词
先看看下面的代码:

图9

函数A_Very_Long_Function_Name()可能要一遍又一遍输入,在插入模式,用户可以通过前向或后向搜索自动补完单词。在函数Another_Function中,用户可以输入A_Very...然后按下Ctrl-P,第一个匹配到的单词将显示。在例子中,它显示为A_Very_Long_Variable_Name,如果匹配的不符合你的需求,可以再按Ctrl-P,继续搜索下个匹配的单词,显示为A_Very_Long_Function_Name。一旦单词匹配正确,你就可以继续书写程序了。在整个过程中VIM保持插入状态。
和Ctrl-P类似的按键是Ctrl-N,它先向前搜索最匹配的。这两组按键相同的是到达文件顶部或底部后都将自动继续搜索。
CTRL-P和CTRL-N都是模式CTRL-X的一部分,而CTRL-X又是insert模式的子模式。所以当你再insert模式下的时候就可以进入该模式。离开CTRL-X模式可以通过除了CTRL-P,CTRL-N,CTRL-X的按键来实现。一旦离开CTRL-X模式,你将回到insert模式。
CTRL-X模式下你可以有多种方式来实现自动补完。你甚至可以自动补完文件名。这在你写include头文件的时候很有用。例如通过下面的方式,你可以包含一个foo.h文件。

#include "f CTRL−X CTRL−F"
是的,是CTRL-X CTRL-F,听起来很象emacs。在CTRL-X模式下,你还可以做很多其他事情。其中之一就是字典补完(Dictionary completion)。字典补完允许用户指定一个包含了关键字的文件,它可以用于自动补全单词。默认状态下字典选项是没有设置的。该选项可以通过命令:set dictionary=file来设置。通常用户可以在字典文件里输入C关键字,typedefs,#defines。C++和java程序员可能更喜欢添加类名。
字典文件的格式十分简单,仅仅是每行一个单词就可以了。一个C字典文件看起来就像下面的图一样。

图10

使用字典补完,用户需要按CTRL-X CTRL-K。补全单词的方式很像按键CTRL-P和CTRL-N。所以,例如要输入'typedef',只需要按CTRL-X CTRL-K然后选择就好了。

5.自动格式化
5.1 格式化列宽
用户通常希望使用80或75的列宽。这可以通过命令:set textwidth=80轻松的实现。

可以将该命令写进你的.vimrc文件中,它将自动执行。
如果你需要在确定的文本宽度下自动换行,命令如下,通常该选项在终端下已经既定了。

:set wrapwidth=60
上面的命令设置文本宽度为60列。
5.2自动缩进代码
在C编码时,用户常常想要indent缩进内嵌代码块。若要在编码时自动完成它,VIM提供了一个叫做cindent的选项。使用下面的命令来完成:
:set cindent
通过设置cindent,代码变得很漂亮。你可以把上面的命令加进你的.vimrc文件中,让它自动执行。
5.3注释
VIM也可以让你自动格式化注释。你可以把注释分解成3块:开始部分。中间部分和结束部分。例如,你的编码格式需求可能需要注释表示为如下样式:

/*
* This is the comment
*/

在这个例子里,你可以使用下面的命令来格式化它。

:set comments=sl:/*,mb:**,elx:*
我来解释一下这个命令,命令分成三个部分。第一部分是sl:/*,这告诉VIM注释包括三块,以/*开始。下一部分告诉VIM中间的注释是*,最后一部分告诉VIM几件事。一是注释要以*/结尾,另一是当你按下/时它会自动补完注释。
我们再来看一个例子。假设你的注释样式如下:

/*
** This is the comment
*/

你可以输入这条命令:

:set comments=sl:/*,mb:**,elx:*
插入一条注释时,输入/*并按回车。下一行会自动填上**,当你写完一行注释后按回车,下一行又会自动补上**,如果你想要结束注释,不需要删除一个*再补上一个/,只要按/,VIM会自动结束注释。怎么样,VIM聪明吧。

6.多文件编辑
用户可以一次编辑多个文件。例如,你可以同时编辑一个头文件和源代码文件。若想一次编辑更多文件,按下面的命令调用VIM。

$ vim file1 file2 ...

现在,你就可以先编辑第一个文件,同时可以使用命令:n移至下一个文件。 你也可以使用命令:e#返回上一个文件。 当你编码时,同时可以看到两个文件而且能在它们之间切换应该很有用。换句话说,如果屏幕被分成两部分,上面显示头文件,下面显示代码文件,对你的编程应该很有用。Vim有这样一个命令可以实现该功能。输入命令:split即可。

在两个窗口中显示相同的文件,无论调用了什么命令,都只将影响处于焦点的窗口。于是用户可以使用命令:e file2来在另一个窗口中编辑另一个文件。

执行完那个命令后,你将发现有两个文件处于可视状态。一个窗口显示第一个文件,而另一个窗口显示了第二个文件。在这两个文件间切换可以使用命令CTRL-W。

使用帮助来获取更多关于窗口分割方面的知识。

7.快速查错
当你编写C程序时常常会陷入编辑-编译-编辑的循环中。典型的例子就是你在使用其他软件编辑C文件时,保存文件,编译代码,然后找到错误再重新编辑。VIM使用了一种叫做快速查错的模式来加快这一循环过程。基
本上用户需要把编译器错误保存到一个文件。然后用下面的命令打开这个文件。

$ vim −q compiler_error_file
VIM将会自动打开包含错误的文件并定位到第一个错误。
使用命令"make",用户可以自动编译代码并跳转到第一个出错的位置。按下面的方式调用make命令。

:make
基本上,该命令调用了shell下的make,并转到第一个错误上。然而,如果你不是用make来编译而用例如cc之类的命令编译,那么你得为make命令设置一个称作makeprg的变量。例如:set makeprg=cc\ foo.c
设置完makeprg之后,你就可以使用make并快速查错了。
在你改完第一个错误后,若要修改第二个错误,可以使用命令:cn
返回第一个错误用命令:cN
我将给出几个例子做示范。看看下面的代码:

图11

你可以看到第5行有个错误。文件保存为test。c,makeprg也用命令::set makeprg=gcc\ test.c设置了。
接下来使用命令make,gcc给出了如下的错误提示

图12

按下回车,光标自动移至第6行。
现在命令:cn将把光标移至第4行
用命令:cN返回上一个错误,光标会移到第6行。
改完错误后,用户再执行:make,成功了。

图13

这只是一个很小的例子,你可以使用快速查错功能来解决编译时的问题。而且尽可能的减少编辑-编译-编辑的循环时间。

8.版权
Copyright(c)2000,2001 Siddharth Heroor 在GNU FDL协议许可的范围内,本文可以拷贝,发布或是修改。v1。1及其后版本通过FSS出版。可以在http://www.gnu.org/copyleft/fdl.html找到一份license的拷贝。

9.参考
你可以从VIM上获得更多信息,请到www.vim.org上下载。

分享到:
评论

相关推荐

    基于C/C++语言的简易vim编辑器 仿vim编辑器

    # 基于C/C++语言的简易vim编辑器 仿vim编辑器 1. 编辑器下有normal和insert两种模式。默认为normal模式,按i键进入insert模式,按esc退出insert模式。 2. normal模式下按 h j k l键向左上下右移动光标。 3. normal...

    用VIM编写C/C++程序

    对于Unix下的C/C++的程序员,我推荐你们使用VIM+Ctags的组合来写程序。其中原因听我慢慢道来。(下面对VIM的介绍主要是针对5.6以后的版本) VIM支持语法制导和自动缩进 VIM会根据文件的后缀名,如:*.c、*.cpp、*....

    vim user manual ---vim用户手册

    j30.2j C程序的缩进 j30.3j 自动缩进 j30.4j 其它语言的缩进 j30.5j 跳格键与空格 j30.6j 注释的格式化 jusr 31.txtj 探索GUI j31.1j 文件浏览器 j31.2j 确认 j31.3j 菜单命令的快捷键 j31.4j Vim的窗口位置和大小 j...

    jeffy-vim-v2.1

    jeffy-vim用于配置Vim编辑器,使Vim工作得更像一个C/C++的IDE。在一些插件的润色下,jeffy-vim实现了很多IDE的基本功能,比如:代码解析、代码补全、函数跳转、 程序调试等。我还自己编写了一个插件用于管理项目,...

    jeffy-vim:从 code.google.compjeffy-vim 自动导出

    简介jeffy-vim用于配置Vim编辑器,使Vim工作得更像一个C/C++的IDE。在一些插件的润色下,jeffy-vim实现了很多IDE的基本功能,比如:代码解析、代码补全、函数跳转、 程序调试等。我还自己编写了一个插件用于管理项目...

    vim-obsoleted:请使用vimvim。 Vim来到github

    该编辑器对于编辑程序和其他纯文本文件非常有用。 所有命令均以正常的键盘字符给出,因此那些可以用十个手指打字的命令可以非常快速地工作。 另外,用户可以定义功能键,并可以使用鼠标。 Vim在Amiga DOS,MS-DOS...

    小型通讯录程序c语言链表实现(源代码)

    小型通讯录程序c语言链表实现(源代码) CentOS下vim编辑器gcc编译器

    VIM插件及教程

    打开编辑文件,vim底行模式, :cs a F:\...\cscope.out 查看是否已经连接到对应数据库 :cs s Step 6 使用cscope浏览源码 你可以使用vim底行中使用cscope的命令; 也可以应用cscope的键盘映射进行快速操作。 在...

    Vim用户手册中文版72.pdf

    01.3 使用Vim教程 01.4 版本 第02章 Vim第一步 02.1 首次运行Vim 02.2 插入文本 02.3 移动光标 02.4 删除字符 02.5 撤销和重做 02.6 其它编辑命令 02.7 退出 02.8 求助 第03章 移动 03.1 以Word为单位的移动 03.2 ...

    vim-padre:VIM 调试器插件

    VIM 神父编写 VIM PADRE 是为了帮助使用 VIM 编辑器进行调试。 虽然 IDE 已经变得非常流行,但 VIM 似乎仍然流行(当然在作者的情况下)进行编辑。 在撰写本文时,有许多用于 VIM 的调试器插件,但似乎没有一个能 a)...

    leetcode下载-CVimTutorial:C语言基础教程和Vim的基本使用方法

    leetcode下载 C语言入门 往届是没有C语言入门的内容的,助教第一次试图做一个完整的、适合有Java基础的同学的教程。...C语言的输出不像Java那么轻松,在java中使用syso就可以了,在C中则比较复杂。因

    实验三 Shell和Vi编辑器

    关于shell和vi编程的书籍,这本资料可以帮我们很快的了解shell和vi的变成过程

    vim-eunuch:eunuch.vim:UNIX的帮助程序

    太监最需要UNIX外壳程序命令的Vim sugar。 功能包括: :Delete :同时删除缓冲区和磁盘上的文件。 :Unlink :类似于:Delete ,但保留现在为空的缓冲区。 :Move :同时重命名缓冲区和磁盘上的文件。 :Rename :类似于...

    Linux C程序设计大全

    第6章 vi与vim编辑器 第7章 gcc编译器 第8章 makefile 第9章 gdb 第3篇 Linux进程操作 第10章 进程环境 第11章 进程控制 第12章 时间和日历历程 第13章 信号及信号处理 第14章 进程间通信 第15章 线程 第4篇 Linux...

    vimcoder:topcoder vim编辑器插件

    可以使用示例测试用例数据(当前仅C ++)在本地生成测试用例“驱动程序”。 建立状态 执照 本软件已根据的条款和条件获得。 有关更多信息,请参见COPYING文件。 TopCoder,Inc.既不支持也不认可此项目。 下载 可以...

    2022年山东科技大学Linux实验三:C程序开发工具【源码、实验报告】

    个人linux实验作业【源码、实验报告】,仅供参考学习,切勿抄袭 实验内容: 机考座次生成程序。...要求利用makefile对程序文件进行管理,使用gedit或vim编辑器编写程序,使用gcc和gdb编译调试程序。

    vimconf:我在 Windows、Unix 和 Mac 上的 Vim 配置

    关于这是我在 windows、unix 和 mac 上对 vim 的 vim 配置。 unix 风格也适用于 macintosh(至少在 ... 有些正在使用外部程序,可能并非在所有系统上都可用,但至少可以在 windows 和 debian 上工作,例如 xmllint 来

    在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程

    它在编辑用 C/Perl/Python 编写的程序时特别有用。可以用它来编辑 Linux/Unix 配置文件。 ~/.vimrc 是你个人的 Vim 初始化和自定义文件。 如何在不重启 Vim 会话的情况下重新加载 .vimrc 在 Vim 中重

    Wim编辑器精通之路

     与其它的类Vi编辑器相比, Vim拥有众多的特性: 对180多种语言的语法高亮功能, 对C语言的自动缩进, 以及一个功能强大的内置脚本语言. 对每个人来说, Vim总有让他们喜欢的东西. Vim的开发仍然在继续进行, 写作本文时...

Global site tag (gtag.js) - Google Analytics