这个(while)循环导致emacs崩溃吗?

时间:2012-08-23 19:52:46

标签: macos emacs elisp

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

(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交互是一个对话框,而不是在迷你缓冲区中,这很奇怪 - 我点击了它并且对话框消失了,这是我能够获得的最后一次互动在它消失在深空之前的emacs。

上述elisp代码中是否存在内在危险的内容?我的想法是(search-forward)会在缓冲区结束时失败,发出错误信号,循环结束。

1 个答案:

答案 0 :(得分: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))))