1

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私が得た 1 つの対話は、ミニバッファーではなく、ダイアログ ボックスでした。これは奇妙でした。[はい] をクリックすると、ダイアログ ボックスが消えました。これが、消える前に 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 に答える