免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1089 | 回复: 0
打印 上一主题 下一主题

VIM编辑器 理解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-06 10:10 |只看该作者 |倒序浏览

vi的程序代码有3960行(包括注释),我想那么大的一个程序,一般人估计是看的会有点头晕。因为它是一个功能比较全的文本编辑器,又是纯c写的,所以可能会被它的庞大结构迷惑而不是其语法。在后面我会贴出vi.c的源码,有兴趣看看
     怎么去分析这个程序呢?细节不想说,只想说说宏观的把握。这里涉及到一个重要的概念--宏#ifdef
#endif等,宏在C程序中是挺有用的一个工具,在linux下它往往用来作为控制代码跨平台的编译,在不同的平台选择不同的宏控制,去编译不同的代码,以此实现跨平台操作。大家都用过内核编译,其中的选项的可选与否,在代码中就是用到宏控制。
     下面开始分析vi:
(1)
#ifdef STANDALONE
#define BB_FEATURE_VI_COLON        // 4288
#define BB_FEATURE_VI_YANKMARK        // 1408
#define BB_FEATURE_VI_SEARCH        // 1088
#define BB_FEATURE_VI_USE_SIGNALS        // 1056
#define BB_FEATURE_VI_DOT_CMD        //  576
#define BB_FEATURE_VI_READONLY        //  128
#define BB_FEATURE_VI_SETOPTS        //  576
#define BB_FEATURE_VI_SET        //  224
#define BB_FEATURE_VI_WIN_RESIZE        //  256  WIN_RESIZE
#endif                                
      vi这个程序一开始用到STANDALONE宏,对vi编辑器的标准配置进行规定
其中又定义了9个宏对应于vi的9种功能,其中包括冒号功能:,复制粘贴功能,查找功能,信号功能,逗号功能,只读功能, 选项设置功能,基本设置功能和定义初始屏幕尺寸功能。这9种功能的实现再加上vi最基本的功能的实现就形成了完整的一个vi编辑程序;是不是有点组件的味道了:),vi中通过宏实现功能的添加删除。
      
#ifdef BB_FEATURE_VI_OPTIMIZE_CURSOR
static int last_row;                // where the cursor was last moved to
#endif                                                        /* BB_FEATURE_VI_OPTIMIZE_CURSOR */
#ifdef BB_FEATURE_VI_USE_SIGNALS
static jmp_buf restart;                // catch_sig()
#endif                                                        /* BB_FEATURE_VI_USE_SIGNALS */
#ifdef BB_FEATURE_VI_WIN_RESIZE
static struct winsize winsize;        // remember the window size
#endif                                                        /* BB_FEATURE_VI_WIN_RESIZE */
#ifdef BB_FEATURE_VI_DOT_CMD
static int adding2q;                // are we currently adding user input to q
static Byte *last_modifying_cmd;        // last modifying cmd for "."
static Byte *ioq, *ioq_start;        // pointer to string for get_one_char to "read"
#endif                                                        /* BB_FEATURE_VI_DOT_CMD
接下来的这段代码是通过定义的不同宏,进行不同功能的不同参数的设置初始化,如果只想实现其中一个功能,完全可以只看其中一段代码
#ifdef BB_FEATURE_VI_COLON
static void Hit_Return(void);
static Byte *get_one_address(Byte *, int *);        // get colon addr, if present
static Byte *get_address(Byte *, int *, int *);        // get two colon addrs, if present
static void colon(Byte *);        // execute the "colon" mode cmds
#endif                                                        /* BB_FEATURE_VI_COLON */
这是有宏控制的函数的声明,在不同的功能实现不同的函数,编译器也只会编译宏控制下的函数。达到可选择的目的
static Byte *next_line(Byte *);        // return pointer to next line B-o-l
static Byte *end_screen(void);        // get pointer to last char on screen
static int count_lines(Byte *, Byte *);        // count line from start to stop
static Byte *find_line(int);        // fi
这些函数是必须要编译的,意味着是实现vc基本功能的函数
extern int vi_main(int argc, char **argv)
主函数的定义,开始对不同的宏所定义的全局变量结构进行初始化,然后进入while循环
while ((c = getopt(argc, argv, "hCR")) != -1)
通过getopt接受参数判断进入的是vi的那种模式?帮助:只读还是crashme命令 ,接下来  把程序的指挥权交给edit_file(前面还做个判断,如果没参数则打开新文件,有则打开以有文件)
static void edit_file(Byte * fn)
它接替了主函数的任务开始继续对有些变量数据初始化,其中包括初始化界面,信号,复制板等,当然这些功能也都是可选的,然后是进入循环
while (editing > 0)
这个循环中开始接受命令
#ifdef BB_FEATURE_VI_CRASHME
#ifdef BB_FEATURE_VI_YANKMARK
#ifdef BB_FEATURE_VI_DOT_CMD
然后调用do_cmd(c);开始执行,有点类似与windows的消息循环机制
执行完后进行后续操作,刷新,显示状态等
                if (mysleep(0) == 0) {
                        // no input pending- so update output
                        refresh(FALSE);
                        show_status_line();
                }
然后继续循环接受命令
直到不满足条件时退出
然后做些后续操作
然后是各个函数的定义以及实现功能。。。。。具体可以参照源代码细看,就不说了。
说了那么多,其实就是想告诉大家如何把一个大的程序(也能勉强算把)给逐步细分,然后从宏观上把握它,明白它是做什么的,大致的框架是什么。可能你具体细节会有不懂,我也是,不过没有关系,知识的学习就是慢慢一点一点的积累,但是思想一定要有。明白了就不会仅陷于学语言的泥潭了

文件:
vim.rar
大小:
31KB
下载:
下载


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/187/showart_65737.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP