Emacs入门技巧: 排错

人在江湖走,岂能不挨刀。今天人生又完整了一点:Emacs出现运行错误。一番折腾,正好学会一点简单的排错技巧。

本来 JDE运行得上好。我把所有相关文件送入SVN后(花了那么多精力配置Emacs,不把心血放进版本控制软件加每日多次冗余备份,好比 吴英真地披挂上10亿珠宝,孤身到广州火车站遛弯儿一样不靠谱),重启Emacs却得到如下错误:error: JDEE plugin Lisp file jde-.svn.el missing。在JDE安装目录下做全文搜索,没有这啥jde-.svn.el文件。也没有任何一份*.el代码含有jde-.svn.el的字样。考虑到Lisp的动态特性,以及.svn酷似SVN文件树下的元数据目录名,开始猜测JDE的某个函数扫描某些文件夹,把里面所有的文件都当成插件载入。当然,俺是程序员,不会像黎叔一样拿比人中黄还有想象力的猜想当证明,满世界找人决斗博取同情。排错的过程如下:
  1. 根据Emacs的提示,用emacs –debug-init启动Emacs。或者在初始文件里加入这句:(setq debug-on-error t)。setq是Emacs Lisp的关键词,表示设置一全局变量。那个不起眼的“t”相当于Java里的true。有了这句,以后Emacs遇到问题,就自动打开内置调试器,创建一*backtrace*窗口,并打印出跟踪结果。喜欢GUI的老大还可以用Options里的菜单选项:
    Emacs入门技巧: 排错

  2. 打印出的错误报告如下。不用管那些“byte-code”开头的行。它们表示一段编译过的*.el被载入,没有什么实质性的帮助。我们的目的就一个:找到出错的地方。这段消息类似Java里的stack trace,每一行是一例函数调用。从下到上,函数被依次调用。比如下面两行就表示jde-pi-plugins()先被调用,接着jde-pi-plugins()调用jde-pi-plugin(“.svn”)
    jde-pi-load-plugin(".svn")
    jde-pi-load-plugins()

    <shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><span style="FONT-SIZE: 12pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/g9yuayon/df35183c143a4a05a0672807d93ea78e.png"></span><span style='FONT-SIZE: 12pt; FONT-FAMILY: "Times New Roman"; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA'><br><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 338.25pt; HEIGHT: 205.5pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5Cdannyy%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png" o:title=""></imagedata></shape></span><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 338.25pt; HEIGHT: 205.5pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5Cdannyy%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png" o:title=""></imagedata></shape><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"></shapetype>
  3. 嗯,看到jde-pi-load-plugin(“.svn”),应该有8分希望了。现在的问题是,函数定义到底在哪个文件里。Emacs Lisp里*.el一般是被require或者load-library这俩函数加载。所以我们自然找require(jde-plugins)里的jde-plugins.el:

  4. 打开jde-plugins.el后,C-s,查找函数定义的开头”(defun jde-pi-load-plugins”,果然找到了函数定义:
    Emacs入门技巧: 排错

  5. 其实不用知道该函数的细节,抓住关键就行了。很明显,下面这段代码过滤掉常见的与plugin无关的目录
    Emacs入门技巧: 排错

  6. 我们照做就成,添加一行(not (string= file-name “.svn”)):
    Emacs入门技巧: 排错
  7. 删除掉jde-plugins.elc,重启Emacs。错误消失。大功告成。
  8. 有耐心看到这里的老大,俺奉上饭后甜点:要不是为了学习工具的话,这样做就够了:google JDE svn,答案就出现老。再次证明:菜鸟的问题,不算问题。

你可能感兴趣的:(SVN,F#,ext,emacs,lisp)