Emacs 如何在elisp中查找语法错误

Emacs 如何在elisp中查找语法错误,emacs,elisp,Emacs,Elisp,如果这是重复的,请删除。 我刚刚编辑了我的.emacs文件,在我做了修改之后。我 重新启动emacs。但当它再次出现时,它声称 文件有一些错误。我应该从--debug init开始 我也做了。但它并没有帮助我解决或发现语法错误。 那么有没有一种方法可以找到有语法错误的行呢。或者更好,如果 会有类似于(e)lisp lint的东西,比如xml、json、js 等等提前谢谢 编辑 已成功获取转储文件: Debugger entered--Lisp error: (void-variable whit

如果这是重复的,请删除。 我刚刚编辑了我的.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()
调试器已输入--Lisp错误:(无效变量空白模式)
重新显示内部\(C\函数\)()
删除进程(#)
SomeUnicodeFo“[(“服务器”)服务器使用tcp服务器身份验证目录服务器套接字目录生成新缓冲区“*temp*”函数生成字节码0“SomeUnicodeFo”vconcat向量[buffer name kill buffer]2”\n\n(fn)“插入文件内容逐字展开文件名查看“127\\.0\.0\.1:[0-9]+\\([0-9]+\\)“通信进程属性字符串到数字匹配字符串1 t:其他删除进程使网络进程:名称“服务器客户端测试”:系列本地:服务器nil:noquery:service]14”\n\n(fn)”])
server-running-p(“服务器”)
字节码(“SomeUnicodeFo”[加载文件名缓冲区文件名recentf用户emacs目录前的菜单recentf保存文件服务器名添加到列表加载路径文件名目录”。/packages“工具栏模式0加载”ergoemacs键绑定/ergoemacs模式“ergoemacs模式1”init_加载包“init_版本”“init_函数”“init_设置”“init_别名”“init_abbrevs-lisp-mode”“init_keybinding”“init_mouse”“init_clean_menu”需要recentf“Close”。recentf“recentf mode server-running-p t server start]4)
加载(“/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site lisp/。/ergoemacs/init”)
评估缓冲区(#nil)/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site lisp/site start.el“nil t);在缓冲区位置1432读取
使用代码转换加载(“/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)
加载(“/home/dirk/.emacs.d/ergoemacs_1.9.3.1/site lisp/site start.el”nil nil t)
加载文件(“~/.emacs.d/ergoemacs_1.9.3.1/site lisp/site start.el”)
评估缓冲区(#nil)/home/dirk/.emacs“nil t);在缓冲区位置2883处读取
使用代码转换加载(“/home/dirk/.emacs”“/home/dirk/.emacs”t)
荷载(“~/.emacs”t)
命令行()
正常-顶级()

一种方法是打开文件并标记前半部分,然后应用
评估区域
。如果报告了错误,则标记一半并重复。如果未报告错误,则将其应用于另一半

通过这种方式,你可以缩小问题的范围,一旦你发现了问题,你就有希望找出问题所在

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

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

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


但是您的回溯表明问题可能不是语法问题。最像是菜单中的某个地方出现了
空白模式
(即在菜单项的
:enable
属性中),这表示一个错误,因为
空白模式
变量恰好尚未定义。因此,正如Phils所建议的,加载
空白
可能会解决问题。

错误是什么?如果您不告诉我们,我们无法帮助您。您在运行
emacs--debug init
时是否获得堆栈跟踪?如果是,请检查把这一点也写进你的问题中。@phils毫无疑问,当我从--debug init开始时,我没有得到回溯。它只是说“Package assoc”已过时。另一方面,如果我正常开始,它会给我“start with--debug init”消息,堆栈跟踪中有很多未知项,但请尝试插入
(需要“空白”)
在ergoemacs位之前进入init文件。在不知道其他代码实际在做什么的情况下,这可能是克服错误的最简单方法(
空白
库定义了
空白模式
变量)。我建议用
M-x检查参数
代替所述的手动方法。@phils,谢谢,我不知道那一个!我已经更新了答案。@phils感谢“M-x检查参数”的建议“是为我做的。。。但你并没有把它作为答案贴出来。你想把它作为答案发布,这样我就可以点击这个作为解决方案了吗?@phils,把它作为一个单独的答案发布对我来说很好,毕竟,这是你首先想到的。继续接受这个答案吧,PolymathMonkey。Lindydancer建议检查是否有不平衡的圆括号为您解决了问题,而不是您这样做的具体方法。