-
2008-12-27vim的ruby(rails)补全功能 - [人参总会有技术]
翻了n多资料,才发觉vim7.1自带ruby补全。如果发觉vim的ruby补全功能没有打开的,按以下步骤:
已经拥有部分ruby补全功能,只是发觉还不能实现补全类成员之类更智能补全方法的,直接看3
1、安装完全版的vim7.1以上版本。
这在ubuntu里面是安装vim-full这个包(各发行版不同,不同操作系统注意是完全版的就行了)
$ sudo apt-get install vim-full其他linux发行版参照各自的说明。总之是把vim官方维护的插件都装上,包括ruby支持。
2、单独安装vim-ruby
因为硬盘容量或者机子性能不想安装vim-full的(还有这样的机子么?),可以单独安装vim-ruby
1)通过gem安装
$ gem1.8 install vim-ruby
$ vim-ruby-install.rb (运行这个工具把必要的.vim插件拷贝到~/.vim目录)2)通过linux各发行版的包管理器安装
$ sudo apt-get install vim-ruby3、在.vimrc里配置打开所有ruby补全功能
.vimrc添加以下3行
let g:rubycomplete_buffer_loading = 1
let g:rubycomplete_classes_in_global = 1
let g:rubycomplete_rails = 1详细说明在vim帮助文档里有,:help ft-ruby-omni
备注:
- Vim 会载入/执行程序代码,以便提供补全。这可能会导致部分代码被执行。这一点也
许值得关注。缺省行为不再打开这一功能。如果需要此特性,加上 >
let g:rubycomplete_buffer_loading = 1
<- 在第 1 点中,Vim 可以解析整个缓冲区以获得用作补全结果的类名列表。默认关闭此
功能。要使其生效,在 vimrc 里加入 >
let g:rubycomplete_classes_in_global = 1
<- 在第 2 点中,不支持匿名类。
- 在第 3 点中,Vim 会试图判断对象所支持的方法。
- Vim 可以检测和载入 Rails 环境并用于 rails 项目的文件。默认关闭此特性。要使
其生效,在 vimrc 里加入 >
let g:rubycomplete_rails = 1应该能补全大多数代码了。
在需要补全的时候按C-x C-o
刚装了qt的ruby绑定的包,也能补全,vim太神奇了
-

放个图好了。写了一周多,发觉写GUI和写命令行程序的感受大有不同。命令行程序接口容易规范,时间可以多花在底层实现上。而GUI程序要花费大量时间在界面上,这一周花费最多时间的就是怎么把这个列表视图的信号关联到那个元件(比如编辑器)上。
已经忘了哪本的作者说过,汇报项目进度的时候可以用VB之类写个简易的GUI界面。有个理论,说是用户看软件就好像看冰山一样,看到的一个角就会当作全部。确实这样,昨晚我把草稿箱和编辑器关联上,打开一篇日志的时候,霎那间产生错觉以为这软件已经完成得差不多了。其实完成度就20%左右。
顶图中,标号2的编辑器区域看似能够完美显示,其实我对这个元件一点都没动,还不能保存文件(之前说了,输出的html带很多style不能用)。3的列表昨晚刚弄好,看起来也不错了,先这样放着,还没模块化。1那些标签看似很简陋,但其实已经完成了相应功能了——选取一段文字,按相应按钮在文字两旁加上标签。这种操作论坛不少见,开始弄编辑器的时候要把它们移到编辑区域。
之前定的工作表+1完成度:
- 帐号管理功能 30%
- 纯文本保存功能 20%
- 富文本编辑器(可见既所得 | html模式) 0%
- 编辑日志,删除日志之类的模式完善 10%
- 完善UI 5%
- 核心的atom文档封装发送功能30%
12月了,快期末复习了,还要做JAVA EE的作业。阿,时间阿时间。
-
于是,开始搞那个blog客户端。
至于为什么挑这个东西搞,这里列一下原因:1、太复杂的搞不了,不能指望搞个office什么的。2、唯有搞小软件,而小软件需要跟网络挂钩才有前景。3、blog概念虽然已经泛滥,但是还有不少可挖掘的地方。4、这里宿舍周日至四晚上断网让我很不爽,而我晚上灵感最充足,希望有个离线客户端。
语言用C++,库用Qt4。这几天一直在写实验性质的小代码,QHttp和QDom稍微了解了些,基本了解怎么发新日志到blogbus。目前比较困扰的是富文本怎么储存和编辑。Qt提供的QLineEdit似乎可以直接用,但是它输出的html带有很多style属性。而写日志用不了那么多style,所以昨晚一直在看文档怎么去掉那些默认style。暂时还解决不了,以后要实现所见既所得可能还要自己实现那个编辑器。或者用别人做好的现成的更好,翻到个Qt写的htmledit程序,太复杂还没搞懂。
暂时决定放下编辑器的研究,先把主界面整体框架搞出来。刚在测试主界面和一些对话框要怎么共享数据,也许要参考一下别人的代码先。
那个.pro文件终究还是自己写比较放心,eclipse太臃肿,QtCreator的设置方法跟手写差不多了,于是——手写。QtCreator用来调试就很不错(调用的是gdb),图形化。我太懒了还没去看gdb怎么任意指定一个文件的断点,现在用QtCreator图形化的鼠标点一下,方便很多。今遇到个问题,调试了才发现g++没有为指针初始化值,看一些帖子说是标准本来就不要求初始化,而且初始化影响效率。于是,如果程序中需要判断指针的值,一般就要自己在构造函数里面把指针置0先。
现阶段算是纯学习吧,找不了人帮忙,因为不能叫别人帮我学习。

hohohoho~~有意思
-
2008-11-24不会用工具是很可惜的事-二 - [人参总会有技术]
上一节:不会用工具是很可惜的事
/*
* 人类总是不善于挖掘眼前的事物
*/二、自动化编译工具与调试工具
自动化编译
也就是通过工具跟踪记录一堆源文件、资源文件、配置文件的更新状况,并在编译的时候按照预设规则自动调用预处理器、编译器使软件构建过程自动化。一个编程新手刚打开一个IDE就接触到的过程通常是:首先新增一个源文件,接着敲代码,然后按下“运行”按钮。
IDE是多么的诱人,掩盖了所有细节,以致于让人产生自己“已经懂了”的错觉。找个人来问:“编译项目难么?”答曰:“不难阿,就点一下那个“构建”按钮”。这样的“懂”将会把自己绑定在某一特定IDE。多数新手从VC6迁移到VS2005都会感到不适应,因为新建源文件之前“竟然”要新建项目!
不懂得细节的人,反而失去对项目的控制权。失去了项目控制权,就会很害怕项目文件的变动,因为他们不知道自己的操作是否能被项目管理工具识别:为什么把源文件拷进工作文件集后,项目管理器没有显示新增文件呢?害怕改变,导致止步不前。我就看见很多人经过2个学期的编程学习,仍然把整个项目源代码写在一个文件里(包括参加ACM的人)。他们不知道将代码分割后,项目管理工具可以使用增量式的编译链接,以加快项目生成时间。
自动化编译工具的工作包括:
- 允许用户添加删除项目文件。文件包括源代码、头文件、资源文件等等。没被添加进项目的文件将不会被管理工具跟踪记录。
- 允许用户对编译器的编译选项进行设置,比如链接库路径、报错等级、编译版本。
- 跟踪项目文件的变更,仅对上次编译后进行过修改的源文件进行编译。
- 运行用户预设一些“目标”,对项目进行批处理。一些简单的例子如“清除”整个工程的目标文件,或者将可执行程序复制到指定地方。
在Linux下,通常使用make这个工具,windows下则有nmake,JAVA平台有ant。要了解这些工具的工作流程最好查阅各自的文档。
但是,了解细节并不意味这些工作需要自己做!配置自动化编译工具是项目配置工具的事。(是不是有点晕了)尝试过一段时间的手工配置自动编译工具后,就应转去学习项目配置工具。配置工具可以根据当前工作目录的环境大致设定一个项目模板,用户对其进行细微完善之后便可以使之生成相应的自动化编译工具的配置文件。Linux下这样的配置工具有autoconf,qmake(特定qt)等,而windows下通常就是IDE本身。
IDE?没错,这时候又饶回来了。在配置文件变得复杂之后,IDE成为了释放枯燥劳动的好工具。不过我相信在了解了这堆自动化工具的工作细节后,对IDE的看法将会改观。而不仅仅是知道IDE上面列了一排按钮:编译、运行、调试……
// 用IDE的人尝试一下用make或nmake,用make的人尝试一下用IDE
调试工具
是跟自动化相反思路的工具。主要的任务为检测运行时刻程序内的结构、数据甚至寄存器里面的值。
初学编程,需要调试工具提供以下功能:
- 让程序单步执行,既每次执行一行命令。
- 让程序在自己期望的代码行停止(断点),通常是预计发生错误的代码行之前。
- 程序意外中断时,显示程序出错的相关信息。
- 在以上情况中查看各个变量的具体值。
这听起来很深奥,但掌握一些初级技巧不难,何况大多数IDE还提供了图形化的调试环境——点点鼠标就能让程序按代码行单步执行,鼠标指向某个变量就能显示它的当前值。
而命令行的调试环境例如gdb也并不像想象中难,有时我还怀疑命令行界面的调试器会比图形化界面更容易上手。有一次某室友程序有错误,对着代码干瞪眼。我给他推荐的gdb,并且只说了几个操作:r 运行、b 设置断点、 n 单步运行、 s 跳入函数。然后他开始埋头调试,过一会我问他用得惯不惯,他说还行,并且粗略的找到了程序出错的位置。
有人很不可思议的在2学期编程学习中没用过调试器,而去尝试用肉眼去搜索代码中的错误。想一想,你面对的是一部“计算机”。
// 程序出错了,尝试用调试器。如果对调试器感到苦手,去找一本讲解这个调试器的书。
-
2008-11-24不会用工具是很可惜的事 - [人参总会有技术]
/*
* 以本文怀念仍有同班同学写代码的日子
*/每次看到同学埋怨“编程是一件很痛苦的事”,我就觉得非常可惜。在他们眼里,似乎说得出“编程很有趣”这样的话的人都是怪胎,而怪胎的兴趣和能力都是天生的。写代码,跟在田里插秧收割一样是让人累得直不起腰的苦力活。
但这是不对的,编程之所以有趣,还有一个重要因素——容易。没搞错吧?对着一个空白屏幕打一堆它认识我我不认识它的ASCII代码会是容易的事? 是的,因为“狡猾”的编程geek从不会去做一个字符一个字符地敲键盘这样的蠢事,他们懂得使用让编程变得容易的自动化工具。各种工具让编程变成开播种机播种一样轻松。
下面说说我认为是基础中的基础的几个工具。
目录:一、编辑器 二、自动化编译工具与调试工具 三、源码版本控制 四、IDE
一、编辑器
编辑器绝对是基础^3的工具了,写代码最直接并且最长时间接触的工具就是编辑器。编辑器还有什么好说?不就是附件里的记事本或者一打开VC6就看见的那个大块的空白?
编辑器当然有搞头了,大部分编程geek都花过大量时间去“搞”编辑器,然后选定一款适合自己的作为日后写代码的必需品。一个适合编程geek的编辑器不仅需要完成字符录入的工作,还应该提供如下特性
- 多种字符编码及换行符识别:不能自动识别utf-8等编码和windows、*nix、Mac三种环境换行符的编辑器将会是一个累赘。每次与人交流源码文件的时候为了这些鸡毛蒜皮的事纠结一轮是非常郁闷的事。如果打开一个文件发现行尾很多^M符号,或者换行不正确,又或者全文乱码,那就应该马上换一款“合格”的编辑器了。
// 1、字符问题与操作系统预装的编码也有关。2、正式发布代码文件的时候应使用规范的编码和换行格式,如针对*nix的\n行尾符、utf-8编码 - 制表符设置:制表符在哪里?就是按下Tab键所输入的ASCII码。这个符号的作用通常是对代码进行缩进、对齐(少用)。在各种编程语言中,通常会要求或者推荐将每个代码块缩进一个层次,已区分于上一层代码,使代码更便于阅读。要注意的是,不同的代码风格会要求不同的制表符宽度,比如微软风格是4个字符宽度,Linus风格是8个字符风格,而Qt的官方IDE默认设置将tab转化为4个空格(这就要求编辑器允许设置tab转化为空格)。不能按需设置制表符的话,阅读不同风格的代码将会发觉代码会以非常奇怪的方式对齐。
- 代码高亮显示:一般说来,针对程序员的编辑器的说明文档都会把这个特性放在显眼位置。代码高亮会带来诸多好处,譬如通过是否高亮一眼看出关键词是否输入正确,同时也有助于浏览代码时的快速定位。这个用惯IDE的同学都见识多了,就不多说。与代码高亮相关联的还有各种括号配对高亮。
// 查阅自己需要用的程序语言是否在高亮支持之列 - 文件编辑备份:大多数编辑器编辑文档的时候并不会马上将更改写入原文档,而是在内存中读入一份缓存,编辑的时候仅仅编辑这份缓存,当用户执行<保存>操作的时候才会写入硬盘上的文档。如果操作过程遭遇系统崩溃、断电等等意外事件怎么办?有的编辑器会在编辑时刻另存一份swap文档,用作崩溃后的回复,而有的编辑器则不会。选择有崩溃恢复机制的编辑器,不要以为永远只有女生大声尖叫“阿!!!我的文件还没保存!!”。
- (进阶)代码补全:之前几点用于衡量一个编辑器是否合格,而代码补全则是针对编程的进阶功能了。代码补全包括:上下文补全、函数(成员)补全、代码模板等。上下文补全可以防止变量名输入错误,函数(成员)补全让脑力从函数名记忆炼狱中解脱,而代码模板比如"for ( ; ; )"等可以节省部分重复输入。代码补全是真正让编程变得简单起来的工具!也许有人认为初学者应少用补全,全手打代码会记忆更深刻。但我觉得全手打作为入门的体验就足够了,如果不能从字符记忆中解脱出来,只会极大的打击初学者的积极性。
代码补全有时并非由单纯的编辑器提供,而由IDE(集成开发环境)对其内置的编辑器提供,如VS、eclipse等。由单纯的编辑器自身加上插件实现代码补全的编辑器有鼎鼎大名的emacs,vim,以及windows平台下的notepad++等。每当看到一个字符一个字符的打代码然后发出“很累”的抱怨的人,我都感叹他们的人生是多么不完整。
// 熟用代码补全后脑内的代码记忆经常只有半截,比如"std names<tab>"(补全std namespace),“.toE<tab>.tagN<tab>”(补全.toElement().tagName()) - (进阶)快捷键、键绑定:成熟的编辑器都有一套完备的快捷键,有些是继承传统,有些是自成体系。只有Ctrl-C Ctrl-V当然不能算完备,它还应该包括以下机制:在文本区根据词、行、页面进行上下前后移动、翻页;以词、句、行为单位进行删除;根据某种标签进行跳转,查阅函数定义或头文件;调用外部工具比如make,编译器,调试器的快捷方式;更进阶的定制自定义命令、宏。
当自己已经熟悉一套快捷键机制时,提供自定义快捷键与键绑定就很重要了。比如eclipse提供整套的emacs键和其他键的快速切换。
// 熟悉某套快捷键能提高代码编写速度,也会养成对特定工具的依赖(不利) - (进阶)代码排版、排序:我至今仍然记得在数学建模的时候用word排版论文,选中要设置样式的段落,然后点击某某样式;需要调整段落顺序的时候,不断复制、粘贴。有时单独用于排版的时间竟花去总时间的1/6。代码排版绝对不能这样!代码是一种结构化的文本,理所当然应该用计算机工具对齐排版。代码排版排序理论上是很多IDE和编辑器都提供的工具,在这里特地说明的原因是:拜托翻一下菜单和说明文档,用一下这个被忽略很久的工具。
// 排版功能是辅助,写代码的时候仍要注意按一定的规范 - (进阶^2)宏、脚本定制、插件定制:一些老牌编辑器有着非常夸张的扩展性。比如emacs可以内嵌邮件收发、网页浏览器,号称除了煮咖啡其他都能做。而emacs的配置文件使用了lisp语言——竟然让用户用一套编程语言定制编辑器的行为。但emacs快捷键的复杂程度让每个看到“emacs?是那个要给电脑装上脚踏板的东西?”这样的话都会会心一笑。而另一款老牌编辑器vim通过配置也可以达到轻量级IDE的程度(刚那个emacs当它操作系统好了),同样是扩展性非常优良。
关于编辑器的扩展性我决定放在后面的IDE部分写。
一款好的编辑器让很多编程geek乐在其中,沉迷于编辑的世界。代码高亮与代码补全这样的功能让geek们编写代码感到更舒适。如果在代码编写与阅读这一层面感到不舒服的话,那就应该改善一下编辑器环境了。
下一节:不会用工具是很可惜的事
- 多种字符编码及换行符识别:不能自动识别utf-8等编码和windows、*nix、Mac三种环境换行符的编辑器将会是一个累赘。每次与人交流源码文件的时候为了这些鸡毛蒜皮的事纠结一轮是非常郁闷的事。如果打开一个文件发现行尾很多^M符号,或者换行不正确,又或者全文乱码,那就应该马上换一款“合格”的编辑器了。

