19

任何了解 Lisp 的人都可以帮助解决这个警告吗?

我升级到 Emacs 24.3,每当我使用 Emacs 创建 Python 文件时,都会收到此警告消息。搜索python.el并找到以下产生警告的代码部分:

(let ((indentation (when block-end
                     (goto-char block-end)
                     (python-util-forward-comment)
                     (current-indentation))))
  (if indentation
      (set (make-local-variable 'python-indent-offset) indentation)
    (message "Can't guess python-indent-offset, using defaults: %s"
             python-indent-offset)))

这是我的.emacs设置:

(setq-default c-basic-offset   4
              tab-width        4
              indent-tabs-mode nil)

(add-hook 'c-mode-common-hook
          (lambda ()
            (c-set-offset 'arglist-intro '+)
            (c-set-offset 'arglist-close 0)))

(add-hook 'python-mode-hook
          (lambda ()
            (c-set-offset 'arglist-intro '+)
            (c-set-offset 'arglist-close 0)))
4

4 回答 4

28

当您打开 python 文件时,emacs 会根据该文件样式猜测缩进偏移量(要缩进的空格数)。当您创建文件(您描述的情况)时,emacs 无法猜测(文件为空),因此它使用您的默认值(4)并通知用户。

换句话说:这是一个无害的警告;如果您发现这是一个错误,请照此报告。

如果您不喜欢 emacs 猜测偏移量,请将变量自定义python-indent-guess-indent-offset为 nil,然后 emacs 将始终使用您的默认值(在 python 中非常不安全,缩进有意义,您可能正在编辑由其他人创建的具有其他默认值的文件) .

于 2013-09-13T07:34:06.747 回答
11

如果您想要的只是使警告静音,同时让 emacs 仍然按照 juanleon 的回答所解释的那样猜测偏移量,您可以关闭python-indent-guess-indent-offset-verbose变量。

(setq python-indent-guess-indent-offset t)  
(setq python-indent-guess-indent-offset-verbose nil)

根据emacs SE 上的这个综合答案。

于 2018-08-22T12:15:14.813 回答
0

往里看python.el,不是python.elc。如果你没有python.el,然后谷歌它(至少看看它 - 你不需要它来使用 Emacs)。 *.elc是一个字节编译的文件,对于人类来说是非常难以理解的。

中的源代码python.el将告诉您究竟做了什么python-indent-guess-indent-offset,以及为什么您会看到您看到的结果。

于 2013-09-13T05:37:19.167 回答
0

除了前面的答案和消除警告之外,此过程还处理了该问题,并提供了两个示例来说明警告为何有用。

使用 获取当前打开的缓冲区列表C-x C-b。使用 Python 扩展过滤那些,在它们周围添加引号,然后在这个命令中替换它们:

(dolist (f '(
    "/path/to/file1"
    "/path/to/file2"
    ))
  (message (concat "Opening file: " f))
  (find-file (expand-file-name f)))

执行命令(选择区域,然后M-x evaluate-region)。然后*Messages*看起来像这样:

打开文件:/path/to/file1
打开文件:/path/to/file2
无法猜测 python-indent-offset,使用默认值:4
有关 GNU Emacs 和 GNU 系统的信息,请键入 Ch Ca。

我有一些用于测试的文件,但我忘记了,例如:

from time import sleep

sleep(10000)

多亏了这条消息,我才意识到这一点,然后我删除了文件。

在另一种情况下,我有一个只有全局变量的有用文件,所以我添加了这一行:

# -*- mode: python; python-indent-offset: 4 -*-

SOME_GLOBAL_VAR = 0

尽管这确实设置了缓冲区局部变量(通过更改为 6 来检查,然后使用 来检查值C-h v python-indent-offset),但它只在警告消息之后才这样做,而不是之前。我决定容忍这个消息。

于 2019-09-26T15:02:51.467 回答