Emacs入门技巧: 排错

本文记录了作者在使用Emacs编辑器时遇到的JDE插件错误及解决过程,通过启动调试模式定位问题所在,并最终通过修改源代码解决了问题。

人在江湖走,岂能不挨刀。今天人生又完整了一点: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里的菜单选项:


  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="https://p-blog.youkuaiyun.com/images/p_blog_youkuaiyun.com/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”,果然找到了函数定义:


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


  6. 我们照做就成,添加一行(not (string= file-name “.svn”)):

  7. 删除掉jde-plugins.elc,重启Emacs。错误消失。大功告成。
  8. 有耐心看到这里的老大,俺奉上饭后甜点:要不是为了学习工具的话,这样做就够了:google JDE svn,答案就出现老。再次证明:菜鸟的问题,不算问题。
基于粒子群优化算法的p-Hub选址优化(Matlab代码实现)内容概要:本文介绍了基于粒子群优化算法(PSO)的p-Hub选址优化问题的研究与实现,重点利用Matlab进行算法编程和仿真。p-Hub选址是物流与交通网络中的关键问题,旨在通过确定最优的枢纽节点位置和非枢纽节点的分配方式,最小化网络总成本。文章详细阐述了粒子群算法的基本原理及其在解决组合优化问题中的适应性改进,结合p-Hub中转网络的特点构建数学模型,并通过Matlab代码实现算法流程,包括初始化、适应度计算、粒子更新与收敛判断等环节。同时可能涉及对算法参数设置、收敛性能及不同规模案例的仿真结果分析,以验证方法的有效性和鲁棒性。; 适合人群:具备一定Matlab编程基础和优化算法理论知识的高校研究生、科研人员及从事物流网络规划、交通系统设计等相关领域的工程技术人员。; 使用场景及目标:①解决物流、航空、通信等网络中的枢纽选址与路径优化问题;②学习并掌握粒子群算法在复杂组合优化问题中的建模与实现方法;③为相关科研项目或实际工程应用提供算法支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐段理解算法实现逻辑,重点关注目标函数建模、粒子编码方式及约束处理策略,并尝试调整参数或拓展模型以加深对算法性能的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值