【问题标题】:how to find syntax error in elisp如何在 elisp 中查找语法错误
【发布时间】:2014-05-14 06:47:10
【问题描述】:

如果这是重复的,请删除。 我只是在编辑我的 .emacs 文件,在我完成更改之后。一世 重新启动了emacs。但是当它再次出现时,它声称配置 文件有一些错误。我应该从“--debug-init”开始 我也做过。但它并没有帮助我解决也没有找到语法错​​误。 那么有没有办法找到有语法错误的行。或者更好,如果 会有类似 (e)lisp lint 之类的东西,例如 xml、json、js 等等。提前致谢

编辑

设法得到转储:

Debugger entered--Lisp error: (void-variable whitespace-mode)
  redisplay_internal\ \(C\ function\)()
  delete-process(#<process server-client-test>)
 Someunicodefoo" [("server") server-use-tcp server-auth-dir server-socket-dir generate-new-buffer " *temp*" funcall make-byte-code 0 "Someunicodefoo" vconcat vector [buffer-name kill-buffer] 2 "\n\n(fn)" insert-file-contents-literally expand-file-name looking-at "127\\.0\\.0\\.1:[0-9]+ \\([0-9]+\\)" comm process-attributes string-to-number match-string 1 t :other delete-process make-network-process :name "server-client-test" :family local :server nil :noquery :service] 14 "\n\n(fn)"])
  server-running-p("server")
  byte-code("Someunicodefoo" [load-file-name buffer-file-name recentf-menu-before user-emacs-directory recentf-save-file server-name add-to-list load-path file-name-directory "../packages" tool-bar-mode 0 load "ergoemacs-keybindings/ergoemacs-mode" ergoemacs-mode 1 "init_load_packages" "init_version" "init_functions" "init_settings" "init_aliases" "init_abbrevs-lisp-mode" "init_keybinding" "init_mouse" "init_clean_menus" require recentf "Close" ".recentf" recentf-mode server server-running-p t server-start] 4)
  load("/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site-lisp/../ergoemacs/init")
  eval-buffer(#<buffer  *load*-842275> nil "/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site-lisp/site-start.el" nil t)  ; Reading at buffer position 1432
  load-with-code-conversion("/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site-lisp/site-start.el" "/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site-lisp/site-start.el" nil nil)
  load("/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site-lisp/site-start.el" nil nil t)
  load-file("~/.emacs.d/ergoemacs_1.9.3.1/site-lisp/site-start.el")
  eval-buffer(#<buffer  *load*> nil "/home/dirk/.emacs" nil t)  ; Reading at buffer position 2883
  load-with-code-conversion("/home/dirk/.emacs" "/home/dirk/.emacs" t t)
  load("~/.emacs" t t)
  command-line()
  normal-top-level()

【问题讨论】:

  • 错误是什么?如果您不告诉我们,我们将无法帮助您。运行emacs --debug-init 时是否得到堆栈跟踪?如果是这样,请将其粘贴到您的问题中。
  • @phils 不幸的是,当我从 --debug-init 开始时,我没有得到回溯。它只是说“Package assoc”已过时。另一方面,如果我正常开始,它会给我“以 --debug-init 开始”消息
  • 该堆栈跟踪中有很多未知数,但请尝试在 ergoemacs 位之前将(require 'whitespace) 插入到您的 init 文件中。在不知道其他代码实际在做什么的情况下,这可能是克服错误的最简单方法(whitespace 库定义了 whitespace-mode 变量)。

标签: emacs elisp


【解决方案1】:

一种方法是打开文件并标记它的前半部分并应用eval-region。如果报告错误,标记一半并重复。如果没有报错,应用到另一半。

这样你可以缩小问题的范围,一旦你找到它,你就有希望找出问题所在。

我用来查找不正确括号的另一种技术是分别在文件的开头和结尾添加一个额外的括号,然后运行 ​​C-M-fC-M-b from分别是开头和结尾。如果有不正确的括号,它们将匹配新添加的括号,并且点将移动到不正确的括号。

编辑:您可以使用 M-x check-parens 来检查不匹配的括号。

【讨论】:

  • 我建议用M-x check-parens 代替所描述的手动方法。
  • @phils,谢谢,我不知道那个!我已经更新了答案。
  • @phils 感谢“M-x check-parens”为我所做的建议......但您没有将其发布为答案。你想把它作为答案发布,这样我就可以点击这个解决了?
  • @phils,将其作为单独的答案发布对我来说没问题,毕竟,你一开始就想出了它。
  • 继续接受这个答案,PolymathMonkey。 Lindydancer 的建议是检查不平衡括号是否为您解决了问题,而不是您这样做的特定方法。
【解决方案2】:

对于类似“lint”的检查,有 elint.el,但更重要的是,还有字节编译器:M-x byte-compile-file RET 允许您对文件进行字节编译,并会为您提供有关语法和样式的各种警告。

但是您的回溯表明问题可能不是语法之一。最喜欢有一个 whitespace-mode 出现在 menu 的某处(即在菜单项的 :enable 属性中),这表示错误,因为 whitespace-mode 变量恰好没有被定义然而。所以正如菲尔斯建议的那样,加载whitespace 可能会解决这个问题。

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2017-05-29
    • 2013-08-09
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多