【问题标题】:Check whether forward-sexp was successful in Emacs Lisp在 Emacs Lisp 中检查 forward-sexp 是否成功
【发布时间】:2013-02-25 23:53:21
【问题描述】:

我想检查 (forward-sexp 1) 是成功还是以错误结束。 问题是它返回 nil,即使它已经成功。如何进行此项检查?

【问题讨论】:

    标签: emacs lisp elisp emacs24


    【解决方案1】:

    改用scan-sexps。 它是forward-sexp 背后的主力,并返回一个有意义的值。

    当然,如果括号不平衡,那么你会得到一个错误 - 所以你需要ignore-errorscondition-case

    【讨论】:

      【解决方案2】:

      forward-sexp 如果不能向前移动点,则会发出错误信号。如果你愿意,你可以用condition-case 来捕捉它。这是一个测试它的示例命令:

      (defun test-forward-sexp ()
        "simple command testing (forward-sexp 1)"
        (interactive)
        (condition-case nil
            (progn
              (forward-sexp 1)
              (message "succeeded"))
          (error (message "failed"))))
      

      您可以在信息页面Writing Code to Handle Errors 上阅读有关处理错误的更多信息。

      【讨论】:

      • 这不是问题的直接答案,但我注意到这确实是基本答案,可能更恰当地解决了在这种情况下真正应该做的事情(使用condition-case,就是)!
      • @Dualinity 我认为你误解了你的问题。
      • 我认为我现在没有误解。我忘记在问题中包含忽略错误,这可能会导致混淆。答案现在充分解决了(forward-sexp) 给出 nil 的问题:scan 如果有效则给出一个值,而 forward-sexp 在有效时给出 nil。您的方式是如何进行错误测试的更通用方法。他们是不同的问题?直接的答案是使用scan-sexps(避免nil),间接的答案是在出现错误时更适当地处理,这样也可以解决这个问题?
      • @Dualinity 从字面上看你的问题,你问如何使用forward-sexp 和检测错误——而不是如何编写代码来移动sexp。我认为接受的答案很棒。我只反对您的评论,即我的回答不是对问题的直接回答。
      • 诚然,当涉及到这件事时,阅读字面意思变得很困难:-)。我很抱歉。
      【解决方案3】:

      forward-sexp 在出现错误时不会返回 nil(实际上在这种情况下它不会返回任何内容;它会发出错误信号)。

      【讨论】:

      • 我同意,但考虑到我们正试图获得tnil 返回,我们可以在错误情况下使用(ignore-errors FUN) 获得nil。很抱歉造成混乱。
      • 那么你可以通过(ignore-errors (forward-sexp 1) t)得到你想要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2012-05-11
      • 1970-01-01
      相关资源
      最近更新 更多