Подтвердить что ты не робот

Emacs 24.3 python: не могу догадаться о смещении python-indent-offset, используя значения по умолчанию 4

Может ли кто-нибудь, кто понимает Lisp, помочь разрешить это предупреждение?

Я обновился до Emacs 24.3, и всякий раз, когда я создаю файл Python с использованием Emacs, я получаю это предупреждение. Поиск в 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)))
4b9b3361

Ответ 1

Когда вы открываете файл python, emacs угадывает смещение отступа (количество пробелов до отступа) на основе этого стиля файла. Когда вы создаете файл (случай, который вы описываете), emacs не может угадать (файл пуст), поэтому он использует ваш по умолчанию (4) и уведомляет пользователя.

Другими словами: tt - безобидное предупреждение; если вы обнаружите, что это ошибка, сообщите об этом как таковом.

Если вам не нравится emacs, угадывающий смещение, настройте переменную python-indent-guess-indent-offset на nil, а затем emacs будет всегда использовать ваш по умолчанию (очень небезопасный в python, где имеет смысл отступ, и вы можете редактировать файл, созданный кто-то другой с другими значениями по умолчанию).

Ответ 2

Если все, что вам нужно, это заставить замолчать предупреждения, а 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.

Ответ 3

Посмотрите python.el, а не python.elc. Если у вас нет python.el, то google для него (по крайней мере, посмотрите на него - вам не нужно использовать Emacs). *.elc - это байт-скомпилированный файл, который для людей почти непонятен.

Исходный код в python.el расскажет вам, что именно делает python-indent-guess-indent-offset, и, следовательно, почему вы видите результат, который видите.

Ответ 4

В дополнение к предыдущим ответам и глушению предупреждения, эта процедура решает проблему и дает два примера того, почему предупреждение полезно.

Получить список открытых в данный момент буферов с помощью 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* выглядит так:

Opening file: /path/to/file1
Opening file: /path/to/file2
Cant guess python-indent-offset, using defaults: 4
For information about GNU Emacs and the GNU system, type C-h C-a.

У меня были файлы, которые я использовал для тестирования и которые я забыл, например:

from time import sleep

sleep(10000)

Я понял это только благодаря этому сообщению и удалил файлы.

В другом случае у меня был полезный файл только с глобальными переменными, поэтому я добавил это линия:

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

SOME_GLOBAL_VAR = 0

Хотя при этом устанавливается локальная переменная буфера (проверьте, изменив значение на 6, затем проверяя значение с помощью C-h v python-indent-offset), он делает это только после предупреждающее сообщение, не раньше. Я решил терпеть это сообщение.