兴海北路

---男儿仗剑自横行
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

  • 随笔 - 85
  • 文章 - 0
  • 评论 - 17
  • 引用 - 0

常用链接

留言簿(6)

随笔分类

随笔档案

收藏夹

全是知识啊

搜索

  •  

最新评论

阅读排行榜

评论排行榜

把VIM打造成源代码的编辑器
by falcon<zhangjinw@gmail.com>
2008-02-22

    程序开发过程中,源代码的编辑主要是为了实现算法,结果则是一些可阅读的、便于检错的、可移植的...文本文件。如何产生一份良好的源代码文件,这不仅需要一些良好的编辑工具,还需要开发人员养成良好的编程修养[3][4]。

    Linux下有很多优秀的程序编辑工具,包括专门的文本编辑器和一些集成开发环境(IDE)中提供的编辑工具,前者的代表作有vim和emacs,后者的代表作则有Eclipse,Kdevelope,Anjuta等,这里主要介绍VIM的基本使用和一些基本配置。

    通过VIM进行文本编辑的一般过程(如附图二)包括:文件的打开、编辑、保存、关闭,而编辑则包括插入新内容、替换已有内容、查找内容,还包括复制、粘贴、删除等基本操作。

   
  • 打开文件

        在命令行下输入"vim+文件名"即可打开一个新的文件并进入VIM的“编辑模式”。编辑模式可以切换到命令模式(按下字符:)和插入模式(按下字母 a/A/i/I/o/O/s/S/c/C等或者Insert键)。编辑模式下,VIM会把键盘输入解释成VIM的编辑命令,以便实现诸如字符串查找(按下字母/)、文本复制(按下字母yy)、粘贴(按下字母pp)、删除(按下字母d等)、替换(s)等各种操作。当按下 a/A/i/I/o/O/s/S/c/C等字符时,VIM先执行这些字符对应的命令动作(比如移动光标到某个位置,删除某些字符),然后进入插入模式;进入插入模式后可以通过按下ESC键或者是CTRL+C返回到编辑模式,当然,在编辑模式下输入冒号":"后可进入命令模式,通过它可以完成一些复杂的编辑功能,比如进行正则表达式匹配替换,执行shell命令等。实际上,无论是插入模式还是命令模式都是编辑模式的一种。而编辑模式却并不止它们两个,还有字符串查找、删除、替换等。需要提到的是,如果在编辑模式按下字母v/V或者是CTRL+V,可以用光标选择一片代码,进而结合命令模式对这一片代码进行特定的操作。

       
  • 编辑文件

        打开文件以后即可进入编辑模式,这时可以进行各种编辑操作,包括插入、复制、删除、替换字符。其中两种比较重要的模式经常被“独立”出来,即上面提到的插入模式和命令模式。

       
  • 保存文件

        在退出之前需切换到命令模式,输入命令w以便保存各种编辑操作,如果想取消某种操作,可以用u命令。如果打开vim编辑器时没有设定文件名,那么在按下w命令时会提示没有文件名,此时需要在w命令后加上需要保存的文件名。

       
  • 退出

        保存好内容后就可退出,只需在命令模式下键入字符q。如果对文件内容进行了编辑,却没有保存,那么VIM会提示你保存内容,如果不想保存之前的编辑动作,那么可按下字符q并且在之后跟上一个感叹号!,这样会强制退出,不保存最近的内容变更。

        这里需要着重提到的是VIM的命令模式,它是VIM扩展各种新功能的接口,用户可以通过它启用和撤销某个功能,开发人员则可通过它为用户提供新的功能。下面主要介绍通过命令模式这个接口定制VIM以便我们更好地进行源代码的编辑(对于其他的内容建议看看参考资料中提到的VIM的官方教程和VIM实用技术序列,以及其他网友总结的VIM使用技巧等)。

        这里先提一下编码风格。刚学习编程时,代码写得很“难看”(不方便阅读,不方便检错,看不出任何逻辑结构),常常导致心情不好,而且排错也很困难,所以逐渐意识到代码编写需要规范,即养成良好的编码风格,如果换成俗话,那就是代码的排版,让代码好看一些。虽说“编程的“(高雅一些则称开发人员)不一定懂艺术,不过这个应该不是“搞艺术的”(高雅一些应该是文艺工作人员)的特权,而是我们应该具备的专业素养。在Linux下,比较流行的“行业”风格有KR的编码风格、gnu的编码风格、linux内核的编码风格(基于KR的,缩进是8个空格)等,它们都可以通过indent命令格式化,对应的选项分别是- kr,-gnu,-kr -i8。下面演示用indent把代码格式化成上面的三种风格。

    Quote:

    $ vim test.c
    $ cat test.c                  //这样糟糕的编码风格看者会让人想“哭”,太难阅读啦。
    cat test.c
    /* test.c -- a test program for using indent */
    #include<stdio.h>

    int main(int argc, char *argv[])
    {
     int i=0;
     if (i != 0) {i++; }
     else {i--; };
     for(i=0;i<5;i++)j++;
     printf("i=%d,j=%d\n",i,j);

     return 0;
    }
    $ indent -kr test.c
    $ cat test.c            //好看多了
    /* test.c -- a test program for using indent */
    #include<stdio.h>

    int main(int argc, char *argv[])
    {
        int i = 0;
        if (i != 0) {
            i++;
        } else {
            i--;
        };
        for (i = 0; i < 5; i++)
            j++;
        printf("i=%d,j=%d\n", i, j);
        return 0;
    }
    $ indent -gnu test.c
    $ cat test.c      //感觉不如kr的风格,处理if语句时增加了代码行,却并没明显改进效果
    /* test.c -- a test program for using indent */
    #include<stdio.h>

    int
    main (int argc, char *argv[])
    {
      int i = 0;
      if (i != 0)
        {
          i++;
        }
      else
        {
          i--;
        };
      for (i = 0; i < 5; i++)
        j++;
      printf ("i=%d,j=%d\n", i, j);
      return 0;
    }



        从演示中可看出编码风格真的很重要,但是如何养成良好的编码风格呢?经常练习,遵守某个编码风格,一如既往。不过这还不够,如果没有一个好编辑器,习惯也很难养成。而VIM提供了很多辅助我们养成良好编码习惯的功能,这些都通过它的命令模式提供。现在分开介绍几个功能;
    语法加“靓”(亮) :sytax on
    自动缩进宽度(需要set cin才有用):set sw=8
    TAB宽度:set ts=8
    显示行号;set number
    括号自动匹配;set sm
    C语言自动缩进:set cin

        这几个对代码编写来说非常有用,可以考虑把它们全部写到~/.vimrc文件(vim启动的时候会去执行这个文件里头的内容)中,如;
    Quote:

    $ vim ~/.vimrc
    $ cat ~/.vimrc
    :set number
    :set sw=8
    :set ts=8
    :set sm
    :set cin
    :syntax on
    :set textwidth=70
    :set mouse=a
    :set encoding=utf-8
    :set fileencoding=chinese
    :set fileencodings=ucs-bom, utf-8, chinese
    :set ambiwidth=double
    nmap <F2> :nohlsearch <CR>

    :abbr #b /***************************************************************************************

    :abbr #e ***************************************************************************************/



    需要补充的几个技巧有;

  • 在编辑模式下,可通过gqap命令对注释自动断行(每行字符个数可通过命令模式下的"set textwidth=个数"设定)
  • 命令模式下输入数字可以直接跳到指定行,也可在打开文件时用“vim +数字 文件名”实现相同的功能。
  • 命令模式下的TOhtml命令可把C语言输出为html文件,结合syntax on,可产生比较好的web page把代码发布出去。
  • 先切换到可视模式(编辑模式下按字母v可切换过来),用光标选中一片代码,然后通过命令模式下的命令“s#^#//#g"把某一片代码给注释掉,这非常方便调试某一片代码的功能。
  • 命令模式下的”set paste“可解决复制本来已有缩进的代码的自动缩进问题,后可执行”set nopaste“恢复自动缩进。
  • 为了使用最新的vim特性,可用"set nocp"取消与老版本的vi的兼容。
  • 如发现变量命名不好,想在整个代码中修改,可在命令模式下用"%s#old_variable#new_variable#g"全局替换。替换的时注意变量名是其他变量一部分的情况。
  • 如果想把缩进和TAB键替换成空格,可考虑设置expandtab,即“set et”,如果要把以前编写的代码中的缩进和TAB键都替换掉,可以用retab。
  • 为实现关键字补全,输入一部分字符后,按下CTRL+P即可。比如先输入prin,然后按下CTRL+P就可以补全了。
  • 如果想在在编辑模式下查看Linux手册,可把光标定位到在某个函数,按下Shift+k就可以调出man,很有用。
  • 删除空行,在命令模式下输入g/^$/d,前面g命令是扩展到全局,中间是匹配空行,后面d命令是执行删除动作。用替换也可以实现,键入%s#^\ n##g,意思是把所有以换行开头的行全部替换为空。类似地,如果要把多个空行转换为一个可以输入g/^\n$/d或者%s#^\n$##g。
  • 注意使用一些有用的插件,比如ctags, cscope等,可以提高代码阅读、分析的效率。特别是open source的东西。


    更多的技巧可以看看资料[2],[6],[7]。

        实际上,在源代码编写时还有很多需要培养的“素质”,例如源文件的开头注释、函数的注释,变量的命名等。这方面建议看看参考资料里的编程修养、内核编码风格、网络上流传的《华为编程规范》,以及<C Traps & Pitfalls>等。

    参考的资料:

    [1] VIM官方教程,在命令行下键入vimtutor即可
    [2] IBM developerworks 中国,VIM实用技术序列
    实用技巧,http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/
    常用插件,http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/
    定制VIM,http://www.ibm.com/developerworks/cn/linux/l-tip-vim3/
    [3] 编程修养
    http://oss.lzu.edu.cn/modules/newbb/viewtopic.php?topic_id=126&forum=13
    [4] 内核编码风格
    Document/codingstyle
    [5] Linux C编程(主要介绍了一些简单的技巧)
    http://blog.ednchina.com/brucedeng/4695/message.aspx
    [6] vim配置,配置得当可极大方便编程等工作
    http://oss.lzu.edu.cn/blog/article.php?tid_1398.html
    [7] VIM高级命令集锦
    http://oss.lzu.edu.cn/modules/newbb/viewtopic.php?topic_id=830&forum=6
    [8] C Traps & Pitfalls(英文版,不过比较简单呢)
    http://oss.lzu.edu.cn/modules/wfdownloads/singlefile.php?cid=6&lid=64
  • posted on 2008-03-14 15:20 随意门 阅读(799) 评论(0)  编辑 收藏 引用


    只有注册用户登录后才能发表评论。
    网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理