关于文本处理的思考

文本处理与编辑器

文字的出现使人类的文明向前推进一大步,而计算机的出现又让人类的文明更上一层台阶。目前我们与计算机交互的方式最多的就是文本了。文本处理能力的高低,说明你对计算机的处理的能力高低。如何高效的利用计算机,让你一分钟完成别人工作一个小时甚至是几天的工作量,这是非常体现一个人基本能力的地方。

说到文本书处理,就不得不说编辑器了。自从编辑器出现之日起,编辑器的战争从来就没有停止过。除了两大神器vim与emacs之间的争夺之外,还包括各种各样的IDE工具的竞争。首先讲下两大编辑器 vim 和 emacs 之间两种不同哲学之间的斗争。

vim 采用unix的小而美的哲学,把一个文本编辑做到极致,而emacs采用all in one哲学,强在集成。不过现在随着时间的发展,两者都在相互学习与发展。网上的这种争论很多,列举如下:

  1. https://linuxtoy.org/archives/why-emacs-vim-good.html
  2. http://www.wikivs.com/wiki/Emacs_vs_Vim
  3. 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,具体有以下几个原因:

  1. 目前通用性最强的编辑器之一,几乎在所有linux系统中,都是默认编辑器。当然windows 也是可以安装的。
  2. 练习正则表达式最方便的编辑器,可以让你在平时的文本处理时,把正则表达式练到精通。而正则表达式在linux中有广泛的应用,find,grep,awk,sed这些基本的命令都支持。而在文本处理中正则表达式是词法分析的主要工具。
  3. 可编程性与可扩展性最强的编辑器之一。
    1. 支持语法文件最全的编辑器,并且还能够自定义语法文件来实现自定义的语言。
    2. 可以当做teminal来使用,例如bash,python,perl 等等。
    3. 可以通过插件扩展成为IDE 工具。
    4. 可以对文本进行查询、排序、以及各种排版等操作。
  4. 常见的软件都会支持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 的资源

  1. vim 官网 , www.vim.org
  2. vim wiki, http://vim.wikia.com/wiki/Vim_Tips_Wiki
  3. vim IRC,irc.freenode.net
  4. email group , vim@vim.org/vim-announce@vim.org
  5. vim 中文在线文档 http://vimcdoc.sourceforge.net/doc/help.html

文本处理的问题

文本处理需要主要注意以下几个问题,来提高处理效率。

初次编辑

要尽可能多的使用模板,同时使用自动提示,减少重复,以及避免尽可能多的错误。对于写代码来说,那就是语法帮助。查询与实时的语法检查。 可以大大提高你的编程效率。代码调试的很大一部分时间浪费在语法错误上,并且这种解释型语言不好的地方,只有等到运行的时候, 才知道错误。 这浪费了大量的时间。看起来很简单的事情,却浪费了大量的时间。原因就在于重复之上。运行一次需要5分钟,光因为语法错误 你运行了十次。也就是50分钟过去了。而语法错误都是不是问题的问题。你在时间评估上,也很少把这一部分时间给计算进来的。

修改阶段

要能够快速找到需要修改的地方,并能快速精确地修改。特别是在大的工程中,添加新的功能,需要同时修改多个配置,往往会出去多改与漏改的现象。 特别是大的工程运行一次需要大量的时间。结果就会造成十分钟就改完的事情,最后结果变成了一天,大大超出预期。大家都习惯于编程中只修改第一个错误。 正确的做法,应该是从第一错误开始。避免重复的错误。 要尽可能举一反三。 简单的办法,那就通过关键字的搜索来确定判断要修改的范围。 文本的修改主要是查找替换编辑,难点在于精确处理,快速、精确的处理那就更难了,主要难点由于以下几个原因:

  1. 不能多改: 这个在替换操作最明显,每个编辑器都有替换的操作,但是一般人不敢用,主要是原因是怕多改了,把不需要改的也给改了。
  2. 不能少改: 当需要修改的地方当超过一屏的时候,鼠标一滚,不就不知道滚到哪里,就可能出现漏该的问题.
  3. 最后就是快速了,如何来保证快速地实现文本修改。这就要靠vim中的各种命令了。 vim 的各种模式与命令都是为快速精确的处理而设计的。

输出与交换

每个文本处理时大家都期待最好实现同一内容能同时输出多种格式,比如html,pdf,epub等等,实现内容与形式的分离。内容本身要结构化,再一步要对象化方便提取与复用。同时各种结构要能很方便地实现相互转换。这就牵扯到排版的问题,包含公式,以及画图等等问题。

对于第一个问题,vim 能够提供自动示功能。再template的功能不是很强,当然已经有了一些插件可以用,但都是小规模的。大一点的文本,就要专门的template库来处理了。最经典的要就属 perl templatetooklkit。后面的大部分库都基于它来实现的,例如 python,JinJia等等。

第二个问题,基本vi命令可以完全胜任了。

对于第三个问题,已经完全超出了 vim 的能力,需要专门的文档结构框架来解决。

从最初的 SGML->HTML/XML->YAML,到各种各样的 markdown.

restructedText, 以及未来的对象化的再文档结构。

结构

通过vim 的使用来研究文本处理

本书分部分

  1. 入门简介
    1. 文本处理与编辑器
    2. 为什么要解决vim
    3. 文本处理的三个阶段
    4. 如何提高自己文本处理能力
    5. vim 的一些资源
  2. 初级篇
    1. 安装
    2. 正则表达式
    3. 快速编辑
    4. 个性化配置环境
    5. 文本处理日常工作的应用
  3. 中级篇
    1. 能定制与二次开发vim插件
    2. 各种template使用以及自己开发各种模板
    3. 在编辑中过程中的内置函数的使用
    4. 语法文件的定制
  4. 高级篇
    1. 各种文本格式的转换
    2. antlr, pandoc