Электрический режим отступа ломает мой код Python

У меня есть этот код на Emacs с python-mode включено:

def func(a):
    if a:
        return True
    return False

Когда я перемещаю курсор между return False а также def func( код автоматически отступает, нарушая его:

def func(a):
    if a:
        return True
        return False #Oops!

Я узнал, что это происходит из-за electric-indent-modeвторостепенный глобальный режим. Тем не менее, я пытался отключить его, но проблема остается.

Код elisp, который я использую, таков:

(defun disable-electric-indent ()
  (set (make-local-variable 'electric-indent-functions)
       (list (lambda (arg) 'no-indent))))

а это как мой python-mode-hook выглядит:

(add-hook 'python-mode-hook
          (lambda ()
              (flyspell-prog-mode)
              (auto-complete-mode)
              (nlinum-mode)
              (toggle-truncate-lines t)
              (setq autopair-handle-action-fns
                    (list 'autopair-default-handle-action 'autopair-python-triple-quote-action))
              (centered-cursor-mode)
              (auto-indent-mode)
              (autopair-mode)
              (column-marker-1 80)
              (flycheck-mode)
              (setq ac-auto-start 2)
              (disable-electric-indent) ;; esto deberia hacer que emacs deje de romper las pelotas con el codigo en python
              (jedi:setup)))

Если я выключу auto-indent-mode это поведение прекращается (однако, я не получаю авто отступ, glol).

моя версия Emacs: GNU Emacs 24.3.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.8.1) of 2013-04-29 on eric

РЕДАКТИРОВАТЬ: я использую python пакет (встроенная поддержка летающего цирка Python для Emacs, вы знаете) в своей версии 0.24.2По словам Мелпа. Может быть, я должен удалить его и использовать python-mode пакет в его версии 6.0.10?

4 ответа

Вы можете попробовать

(defun my-disable-electric-indent ()
  (set (make-local-variable 'electric-indent-mode) nil))

Я только что мигрировал в python-mode.el и оставьте код, чтобы выключить electric-indent-mode:)

Вы должны использовать (setq electric-indent-inhibit t) в любом режиме, когда переиндентирование не должно происходить, например в режиме Python. Это официальный способ сделать это, как документ в C-h v electric-indent-inhibit,

Предположим, что есть ошибка, она никогда не должна иметь отступ, как показывает ваш пример.

Кроме того, можно ожидать несколько конфликтов от режима авто-отступа, считая это плохим в режиме Python. Не в вашем примере, но в других местах есть отступ только выбор. Авто-отступ не может знать, где отступ тогда. В качестве символа новой строки и отступа он выберет наиболее вероятный вариант, который в некоторых случаях будет неправильным. Это может стать неприятным.

Другие вопросы по тегам