2013-06-13 1 views
2

У меня есть этот код на Emacs с python-mode Enabled:электродуговой отступа режим ломает мой код Python

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

EDIT: Я использую python пакет (встроенный в летающий цирк поддержки Пайтона для Emacs, вы знаете) в своей версии 0.24.2, согласно melpa. Может быть, я должен удалить его и использовать пакет python-mode в своей версии 6.0.10?

+1

Если вы ссылаетесь на python-mode.el, попробуйте текущую магистраль через базар, ветвь bzr lp: python-mode, resp. скачать с https://launchpad.net/python-mode –

+0

На самом деле, это поведение исчезло, если я использую '' 'python-mode.el'''. У меня есть некоторые незначительные проблемы с этим пакетом сейчас, но ничего важного, что я не могу исправить, спасибо! (пожалуйста, ваш комментарий как ответ пожалуйста!) – shackra

+1

Привыкнуть к 'C-j' вместо' RET' или привязать 'RET' к' newline-and-indent'. Это дает вам автоматический отступ. – lunaryorn

ответ

3

Вы хотели бы попробовать

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

Спасибо, но поведение по-прежнему ... – shackra

+0

Очевидно, вам также необходимо вызвать эту функцию. Или просто добавьте 'set' в свой' python-mode-hook'. Но если вы все еще видите проблему, когда «электрический-indent-mode» равен нулю, проблема, скорее всего, не в режиме электрического отступа.Возможно, в 'auto-indent-mode'. – Stefan

+0

Превосходно, это решило это для меня! Спасибо ... – mzuther

0

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

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

0

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

+1

Поздравляем! Там есть несколько электрических функций. Когда вы чувствуете себя дома с обычным делом, попробуйте «py-electric-backspace» - при редактировании списков, например. –

0

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