1

我需要通过一个 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)在缓冲区结束时会失败,发出错误信号,然后循环将结束。

4

1 回答 1

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))))
于 2012-08-23T21:10:07.923 回答