关于文本处理的思考¶
文本处理与编辑器¶
文字的出现使人类的文明向前推进一大步,而计算机的出现又让人类的文明更上一层台阶。目前我们与计算机交互的方式最多的就是文本了。文本处理能力的高低,说明你对计算机的处理的能力高低。如何高效的利用计算机,让你一分钟完成别人工作一个小时甚至是几天的工作量,这是非常体现一个人基本能力的地方。
说到文本书处理,就不得不说编辑器了。自从编辑器出现之日起,编辑器的战争从来就没有停止过。除了两大神器vim与emacs之间的争夺之外,还包括各种各样的IDE工具的竞争。首先讲下两大编辑器 vim 和 emacs 之间两种不同哲学之间的斗争。
vim 采用unix的小而美的哲学,把一个文本编辑做到极致,而emacs采用all in one哲学,强在集成。不过现在随着时间的发展,两者都在相互学习与发展。网上的这种争论很多,列举如下:
- https://linuxtoy.org/archives/why-emacs-vim-good.html
- http://www.wikivs.com/wiki/Emacs_vs_Vim
- http://forum.ubuntu.com.cn/viewtopic.php?f=68&t=247199&start=0
具体而言,vim 采用简化模式操作,进入模式的大部分命令都是单字符的,这种模式效率较高,而emacs采用组合键方式实现各种功能。所以网上有人戏称 vim esc 到死, emacs ctrl 到死。可谓异曲同步吧,看各自的喜好吧。
就我个人发展而言,是两者同时开始学用,后来vim用文本编辑,用emacs做一些shell的杂项操作,以及文件操作。但慢慢就都改用了vim.
为什么要学Vim¶
很多初学者都问为什么要用Vim,具体有以下几个原因:
- 目前通用性最强的编辑器之一,几乎在所有linux系统中,都是默认编辑器。当然windows 也是可以安装的。
- 练习正则表达式最方便的编辑器,可以让你在平时的文本处理时,把正则表达式练到精通。而正则表达式在linux中有广泛的应用,find,grep,awk,sed这些基本的命令都支持。而在文本处理中正则表达式是词法分析的主要工具。
- 可编程性与可扩展性最强的编辑器之一。
- 支持语法文件最全的编辑器,并且还能够自定义语法文件来实现自定义的语言。
- 可以当做teminal来使用,例如bash,python,perl 等等。
- 可以通过插件扩展成为IDE 工具。
- 可以对文本进行查询、排序、以及各种排版等操作。
- 常见的软件都会支持vim/emacs 模式,例如firebox,chrome等浏览器都支持,以及visual studio 等也都有vim的插件。当然你在坐在床上没有鼠标的时候,也会发现使用vim会有多爽。 只要用到readline库的软件都会支持这两种模式。
学习vim就是快速编辑文本,快速的标准就是手不用离开键盘打字键位,就能够进行绝大部分文本操作。所以要学好vim,就把鼠标与方向键忘掉吧,不然失去了学习vim的意义。另外就是学会用无名指来按shift键,而不是每当用shift与ctrl 需要手全上。下面我们就开始体验如何用 Vim 来提高我们的文本处理速度吧。
怎样学Vim¶
获得任何东西都是需要时间投入的,只不过是如何投入的问题。有的东东入门简单,但是精通很能学要很长时间(这也可能是由于工具本身功能所限),有些东东入门较难,精通后会大大提高效率,并且收益良多。Vim就属于后者,前期至少3-6月的投入,刚开始比较枯燥、难学,但是精通之后就能够大大提高文本处理效率。各种工具的学习曲线对比可以参考 here .
但在实际工作遇到以下几种情况,需要根据实际情况具体斟酌的,并一定都是选用Vim适合的。首先如果只是临时记录,并且这种临时记录次数也不是很多,此时notepad实在再合适不过了。其次是学习新工具与技术都是为提高效率的,如果你觉得其成为自己的一个负担了,所谓的工具也就失去了意义,那就没有必要去学了。
学习任何东西都是熟练才能生巧,再好的工具,如果不熟练,还是快不起来的,更谈不上谈优化与效率了。但也不表明你需要把所有的东西都学会了,才开始熟练。事实上要充分利用80/20原则,只要学习20%功能,就能应付你80%的工作。另外也要求对你日常的文本处理工作进行分类总结,找到让其头疼的80%的问题,然后再去学几条vim相关的命令,就可以胜任你80%的文本工作,快速的解决实际工作中的问题。
下面列举一些vim 的资源¶
- vim 官网 , www.vim.org
- vim wiki, http://vim.wikia.com/wiki/Vim_Tips_Wiki
- vim IRC,irc.freenode.net
- email group , vim@vim.org/vim-announce@vim.org
- vim 中文在线文档 http://vimcdoc.sourceforge.net/doc/help.html
文本处理的问题¶
文本处理需要主要注意以下几个问题,来提高处理效率。
初次编辑¶
要尽可能多的使用模板,同时使用自动提示,减少重复,以及避免尽可能多的错误。对于写代码来说,那就是语法帮助。查询与实时的语法检查。 可以大大提高你的编程效率。代码调试的很大一部分时间浪费在语法错误上,并且这种解释型语言不好的地方,只有等到运行的时候, 才知道错误。 这浪费了大量的时间。看起来很简单的事情,却浪费了大量的时间。原因就在于重复之上。运行一次需要5分钟,光因为语法错误 你运行了十次。也就是50分钟过去了。而语法错误都是不是问题的问题。你在时间评估上,也很少把这一部分时间给计算进来的。
修改阶段¶
要能够快速找到需要修改的地方,并能快速精确地修改。特别是在大的工程中,添加新的功能,需要同时修改多个配置,往往会出去多改与漏改的现象。 特别是大的工程运行一次需要大量的时间。结果就会造成十分钟就改完的事情,最后结果变成了一天,大大超出预期。大家都习惯于编程中只修改第一个错误。 正确的做法,应该是从第一错误开始。避免重复的错误。 要尽可能举一反三。 简单的办法,那就通过关键字的搜索来确定判断要修改的范围。 文本的修改主要是查找替换编辑,难点在于精确处理,快速、精确的处理那就更难了,主要难点由于以下几个原因:
- 不能多改: 这个在替换操作最明显,每个编辑器都有替换的操作,但是一般人不敢用,主要是原因是怕多改了,把不需要改的也给改了。
- 不能少改: 当需要修改的地方当超过一屏的时候,鼠标一滚,不就不知道滚到哪里,就可能出现漏该的问题.
- 最后就是快速了,如何来保证快速地实现文本修改。这就要靠vim中的各种命令了。 vim 的各种模式与命令都是为快速精确的处理而设计的。
输出与交换¶
每个文本处理时大家都期待最好实现同一内容能同时输出多种格式,比如html,pdf,epub等等,实现内容与形式的分离。内容本身要结构化,再一步要对象化方便提取与复用。同时各种结构要能很方便地实现相互转换。这就牵扯到排版的问题,包含公式,以及画图等等问题。
对于第一个问题,vim 能够提供自动示功能。再template的功能不是很强,当然已经有了一些插件可以用,但都是小规模的。大一点的文本,就要专门的template库来处理了。最经典的要就属 perl templatetooklkit。后面的大部分库都基于它来实现的,例如 python,JinJia等等。
第二个问题,基本vi命令可以完全胜任了。
对于第三个问题,已经完全超出了 vim 的能力,需要专门的文档结构框架来解决。
从最初的 SGML->HTML/XML->YAML,到各种各样的 markdown.
restructedText, 以及未来的对象化的再文档结构。