当在Python模式下键入字符串块"""时,Emacs 23会挂起。

3

我的Emacs(Ubuntu 9 + Emacs 23 + Pyflakes)在我输入"""用于字符串块时会挂起。

有人遇到过同样的问题吗?我认为这可能不是一个Emacs的问题,而是一些我用来进行错误检查的Python模式或Pyflakes。

有人解决了这个问题吗?这真是一次令人沮丧的经历。


你可能想要添加你正在使用的Python模式和Pyflakes的版本。 - Trey Jackson
问题已经在开发版本中解决了。现在它能正常工作了。谢谢您的时间。 - user90150
5个回答

3

最新的开发模式pyflakes解决了我的问题。感谢大家。

sudo easy_install -U pyflakes


2

1
你是使用外部的python-mode(来自python-mode包)还是内部的python mode?我在内置的emacs python mode中使用pyflakes没有任何问题,这是我的配置:
(when (load "flymake" t)
(defun flymake-pyflakes-init ()
  (let* ((temp-file (flymake-init-create-temp-buffer-copy
                     'flymake-create-temp-inplace))
         (local-file (file-relative-name
                      temp-file
                      (file-name-directory buffer-file-name))))
    (list "pyflakes" (list local-file))))
(add-to-list 'flymake-allowed-file-name-masks
             '("\\.py\\'" flymake-pyflakes-init)))

1
我刚刚升级到了pyflakes的开发版本,问题得到了解决。谢谢您的建议。 - user90150

0

0

这是出现问题时的回溯信息:

enter image description here

使用gdb调试问题,但由于使用了Emacs包的编译二进制文件,无法获得有用的信息。

(gdb) step
Single stepping until exit from function F707974686f6e2d6e61762d656e642d6f662d73746174656d656e74_python_nav_end_of_statement_0,
which has no line number information.

最后,我放弃了并使用解决方法来添加或修复文档字符串:

  1. 使用 py-pyment 包中的 py-pyment-region 命令
  2. 使用 anzu 包中的 anzu-query-replace 命令替换非标准的文档字符串

此外,在 Emacs 28.1 + gcc/9.5.0_jit 版本中,在单引号之前键入单引号或双引号会导致这个问题。 在空行或不在单引号之前键入双引号则不会出现这个问题。

关于 gdb 的更多信息:

(gdb) backtrace
#0  0x0000000000676a6c in syntax_property_with_flags ()
#1  0x000000000067e33a in scan_sexps_forward ()
#2  0x000000000067eae9 in Fparse_partial_sexp ()
#3  0x0000000000635396 in funcall_subr ()
#4  0x0000000000634e7a in Ffuncall ()
#5  0x00007f366cb8de6f in F73796e7461782d70707373_syntax_ppss_0 () at /xxx/emacs/28.1/x86_64-pc-linux-gnu/../../../../bin/../lib/emacs/28.1/native-lisp/28.1-7901736e/preloaded/syntax-bf4e4bc4-19987706.eln
...
#68 0x000000000046df78 in redisplay_window_1 ()
#69 0x0000000000631365 in internal_condition_case_1 ()
#70 0x000000000046d2ae in redisplay_internal ()
#71 0x000000000046b129 in redisplay ()
#72 0x000000000057e312 in read_char ()
#73 0x000000000058d619 in read_key_sequence ()
#74 0x000000000057b509 in command_loop_1 ()
#75 0x00000000006312be in internal_condition_case ()
#76 0x000000000057ad96 in command_loop_2 ()
#77 0x00000000006309fa in internal_catch ()
#78 0x000000000057ad3e in command_loop ()
#79 0x000000000057a2f2 in recursive_edit_1 ()
#80 0x000000000057a490 in Frecursive_edit ()
#81 0x0000000000576fc2 in sort_args ()
(gdb)

看起来emacs代码存在一些问题导致了这个问题。

然而,当启动没有init.el文件的Emacs时,无法重现此问题。因此,应该是由已安装的包触发的。

最后,在custom-set-variables中注释掉下面的行后,问题消失了。因此,至少对于Emacs 28.1 + gcc/9.5.0_jit,它不是由任何包引起的。

;; '(debug-on-error t) 

只需在init.el文件中添加以下内容即可复制:

(custom-set-variables
'(debug-on-error t)
)

'(debug-on-error t) 也可以写成 '(debug-on-error '(nil))

使用 '(debug-on-error nil) 就不会有问题了。

因此,只要将 debug-on-error 设置为 always - t 或者 when - '(nil),就会出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接