【问题标题】:Did this (while) loop cause emacs to crash?这个(while)循环是否导致emacs崩溃?
【发布时间】:2012-08-23 19:52:45
【问题描述】:

我需要通过一个 XML 文件来寻找某些标签,这些标签的内容是人类可识别的但不是正则表达式可识别的,并处理这些标签。我整理了一个键盘宏来完成我需要的工作,然后尝试使用以下 elisp 让我逐步浏览文件并为每个标签按 yn而不是在移动命令和宏执行之间来回切换。

(while t
  (progn
    (search-forward "<Name>")
    (move-beginning-of-line nil)
    (if (y-or-n-p "Problem? ")
        (call-last-kbd-macro)
      (next-line)
      )))

但是,当我 M-: 对此进行评估时,它到达了y-or-n-p,然后 emacs 变得没有响应。我在 OS X 10.7 机器上使用 emacs。在 Activity Monitor 中,emacs 占用了正常数量的 RAM 和 CPU 时间,而不是进行升级的资源请求,所以我不认为我遇到了无限循环。 Emacs 完全停止了对输入和点击的响应,包括重复按 Escape 或 C-g 之类的操作。一个额外的细节:我得到的y-or-n-p 交互是一个对话框,而不是在 minibuffer 中,这很奇怪 - 我在上面单击是,对话框消失了,这是我能够与 emacs 进行的最后一次交互在它消失在深空之前。

上面的 elisp 代码中有什么本质上是危险的吗?我的想法是(search-forward) 在缓冲区结束时会失败,发出错误信号,然后循环就会结束。

【问题讨论】:

  • 我很想知道您正在寻找的信息无法识别正则表达式吗?
  • 相当于“这看起来好笑吗?”除非我错过了最近的 Perl 版本中的某些内容,否则没有人有“看起来很有趣”的正则表达式。 :p

标签: macos emacs elisp


【解决方案1】:

试试这个,让搜索失败循环终止。如果 call-last-kbd-macro 在上一次搜索之前向后移动,则此代码仍可能永远循环。

(while (search-forward "<Name>" nil t)
  (progn
    (move-beginning-of-line nil)
    (if (y-or-n-p "Problem? ")
        (call-last-kbd-macro)
      (next-line))))

【讨论】:

  • 所以您认为(while t) 可能导致了问题,最好将搜索明确设为while 循环的条件?
  • 是的,没有什么可以用您的原始代码终止循环。
  • 好的,那条评论和你的回答结合起来,告诉我我想知道什么,所以我接受了。 :)
猜你喜欢
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2014-05-07
相关资源
最近更新 更多