Установить отступ python в 2 пробела в emacs 23?

18

Я использую emacs 23.1.1 на Ubuntu 10.04. Я хочу запрограммировать в Python с 2-х сторонним отступом. У emacs есть режим по умолчанию для python (python.el?).

Я помещаю следующее в мои .emacs:

    ;; Only spaces, no tabs
    (setq indent-tabs-mode nil)

    ;; Always end a file with a newline
    (setq require-final-newline nil)

    ;; Don't know which of these might work
    (setq-default tab-width 2)
    (setq-default python-indent 2)
    (setq-default py-indent-offset 2)

Когда я редактирую файл Python, он использует отступ в 4 пробела. Когда я пытаюсь использовать C-h v python-indent, он говорит:

    python-indent's value is 4
    Local in buffer webpage_cache.py; global value is 2

        This variable is safe as a file local variable if its value
        satisfies the predicate 'integerp'.

    Documentation:
    Number of columns for a unit of indentation in Python mode.
    See also 'M-x python-guess-indent'

    You can customize this variable.

То есть, это 4, а не 2. Grr. Я попробовал настроить переменную и сохранить, все еще 4. Я пробовал отступ по группе, еще 4.

Как мне получить emacs, чтобы обратить внимание?

    
задан dfrankow 23.11.2010 в 00:11
источник

3 ответа

14

Либо в файле .emacs, либо в файле, на который ссылается ваш .emacs, добавьте:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 2)

Вы можете поместить крючок, если хотите локализовать

;; Python Hook
(add-hook 'python-mode-hook
          (function (lambda ()
                      (setq indent-tabs-mode nil
                            tab-width 2))))

EDIT: я обнаружил, что следующие проблемы могут испортиться с моими настройками:

  • установка переменной перед загрузкой библиотеки
  • другие пакеты / конфиги, возвращающие глобальные переменные

Для обеих этих проблем я обнаружил, что создание крючков и локализация переменных могут помочь.

    
ответ дан dietbuddha 23.11.2010 в 00:43
источник
  • Этот ответ игнорирует тот факт, что у меня уже была ширина табуляции 2 в моем .emacs и не объясняет, что я видел. Тем не менее, моя настройка работает сейчас (не знаю почему), поэтому я соглашусь. –  dfrankow 23.11.2010 в 18:49
  • Спасибо за ваше редактирование! –  dfrankow 24.11.2010 в 05:02
  • Просто из любопытства, зачем обертывать (лямбда ...) в (функция ...)? Раньше я не видел (функция ...), и руководство предполагает, что это необязательно. –  Tyler 13.12.2010 в 05:21
  • Тайлер: Исторически это имело значение. Это уже не нужно, но все же привычка для многих людей. Подробнее см. В статье stackoverflow.com/questions/1852844/.... –  phils 13.12.2010 в 10:16
  • это не сработало для меня. –  Chris Morris 08.06.2013 в 22:20
14

Вы можете поместить это в ваш файл .emacs:

(add-hook 'python-mode-hook '(lambda () 
 (setq python-indent 2)))

Причина, по которой

    (setq-default python-indent 2)

не работает, потому что эта переменная не выходит при загрузке .emacs. (Но я новичок в emacs. Я не уверен в своих объяснениях.)

Однако, PEP 8 - Style Guide для Python кодекса рекомендует «4 пробела на уровень отступа «и я нахожу 4 пробела более удобочитаемыми. Я действительно использую этот кусок кода, чтобы форсировать отступ в 4 пространства.

    
ответ дан Vulpecula 13.12.2010 в 04:33
источник
  • Если вы используете этот код, чтобы установить отступ таким же, как и по умолчанию, уверены ли вы, что он работает? –  bk1e 17.11.2011 в 05:08
  • Я фактически использовал исправление Вульпекулы (мой вкладка был в 8), и она исправила проблему –  arthur johnston 06.01.2012 в 19:39
13

Я сам столкнулся с этой проблемой, и я думаю, что помощь для python-indent содержит большой ключ, который никто не упоминал:

See also 'M-x python-guess-indent'

Если вы не настроите python-guess-indent , установив его в nil , то python.el автоматически установит python-indent для каждого буфера Python (который содержит отступы), что делает вашу настройку python-indent неэффективной. (С другой стороны, когда в Риме ...)

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

(custom-set-variables
 '(python-guess-indent nil)
 '(python-indent 2))
    
ответ дан bk1e 17.11.2011 в 05:04
источник
  • Для работы с существующим кодом Python мне нужно было установить python-guess-indent для того, чтобы все работало так, как я этого хотел. Однако для нового кода Python этого не требовалось. Это было немного запутанно, пока я не попытался исправить это. –  andybauer 25.11.2013 в 17:00