【问题标题】:trace who sets a variable 'yas-snippet-dirs' in elisp跟踪谁在 elisp 中设置了变量“yas-snippet-dirs”
【发布时间】:2016-03-14 14:18:58
【问题描述】:

某些 elisp init 函数错误地设置了变量 'yas-sn-p-dirs'。

有没有办法拥有调试模式,以获取最终修改此值的所有堆栈跟踪的日志?

【问题讨论】:

  • 不是您问题的答案,但源代码的 grep 需要 2 秒,并为您提供对 yas-snippet-dirs 的所有引用。从那里,您可以进入并修改您不喜欢的任何内容或创建新函数或使用建议等。在我看来,实际上不需要调试模式或堆栈跟踪来处理 grep 可以在一瞬间完成的事情一只眼睛。
  • 是的,这就是我所做的 grep -r -n "yas-snippet-dirs" * 。但由于这些变量的变化是在“代码即数据”风格的回调中,我不能只是在其中设置一个断点,或者至少我是这么想的..
  • 这些引用都没有内置到 C 代码库中。它们都是用 Lisp 编写的以扩展名 .el 结尾的纯文本文件。直接进入并修改它们是相当直接的,然后在你完成后M-x byte-compile-file。如果您想在不修改源代码的情况下更改某些内容,那么您只需在 .emacs 文件中的 (require ...) 库,并在下面放置具有相同名称的修改后的函数。不需要高级调试/gdb 技能。也许您只是部分安装了 Emacs,而没有以 .el 结尾的源代码 Lisp 文件?
  • 或者,也许你所有的 Lisp 源代码文件都是.gz 压缩的,而你的搜索正在跳过它们。在构建 Emacs 之后,我执行的最后一步是递归 gunzip -k -f -r 以在需要时能够 grep .el 文件出现。在您的情况下,也许安装的第三方 Lisp 库也已被压缩并且超出了基本的 grep?如果是这样,只需 gunzip 他们。
  • 不,我可以很好地 grep,但我的意思是代码出现在具有 (use-package yasnippet :commands (yas-global-mode yas-minor-mode) :init (progn .... (push 'yas-installed-snippets-dir yas-snippet-dirs) ... 的数据结构中,所以它不是我知道的函数,或者至少我不知道。它的代码作为数据。它的解释是由稍后解释的代码触发的

标签: debugging emacs elisp


【解决方案1】:

没有这样的东西,但您可能会发现elisp bug hunter 很有用。

【讨论】:

    【解决方案2】:

    在最近的 Emacs 中,您可以使用 debug-watch

    M-x debug-watch RET yas-snippet-dirs RET
    

    应该可以解决问题。如果你需要尽早添加观察者(在你可以输入交互式命令之前),然后把

    (debug-watch 'yas-snippet-dirs)
    

    在您的 ~/.emacs 早期的某个地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多