Emacs 23 python.el auto-indent style - можно ли это настроить?

Я использую emacs 23 (python.el) чуть больше месяца, и я недоволен настройками автоматической отступов по умолчанию.

В настоящее время мои файлы Python автоматически отступаются следующим образом:

x = a_function_with_dict_parameter({
                                   'test' : 'Here is a value',
                                   'second' : 'Another value',
                                   })
a_function_with_multiline_parameters(on='First', line='Line',
                                     now_on='Second', next_line='Line',
                                     next='Third', finally='Line')

Я бы предпочел, чтобы установить параметры автоматического отступа, чтобы тот же код можно было легко отформатировать:

x = a_function_with_dict_parameter({
    'test' : 'Here is a value',
    'second' : 'Another value',
})
a_function_with_multiline_parameters(on='First', line='Line',
    now_on='Second', next_line='Line', next='Third', finally='Line')

Кажется, что логика для того, как мне хотелось бы выполнить автоматическое отступы, будет:

Если последний символ (не-комментарий/пробел) предыдущей строки равен:, увеличьте уровень отступа на 1. Иначе, используйте тот же уровень отступов.

Но используя эту логику, TAB нужно будет фактически увеличить уровень отступа текущей строки. (В настоящее время TAB перемещает линию только на уровень автоматического отступа)

Кто-нибудь знает, как я могу изменить автоиндексацию emacs для достижения желаемого стиля?

Ответ 1

Вы можете попробовать этот мир кода:

(require 'python)

; indentation
(defadvice python-calculate-indentation (around outdent-closing-brackets)
  "Handle lines beginning with a closing bracket and indent them so that
  they line up with the line containing the corresponding opening bracket."
(save-excursion
  (beginning-of-line)
  (let ((syntax (syntax-ppss)))
    (if (and (not (eq 'string (syntax-ppss-context syntax)))
             (python-continuation-line-p)
             (cadr syntax)
             (skip-syntax-forward "-")
             (looking-at "\\s)"))
        (progn
          (forward-char 1)
          (ignore-errors (backward-sexp))
          (setq ad-return-value (current-indentation)))
      ad-do-it))))

(ad-activate 'python-calculate-indentation)

Теперь простой python прописывает так:

a = {'foo': 'bar',
     'foobar': 'barfoo'
    }

становится...

a = {'foo': 'bar',
     'foobar': 'barfoo'
}

Ответ 2

Попробуйте использовать последнюю версию fgallina python.el. Он содержит много других улучшений.

Я использую эту версию, а TAB имеет поведение, которое вы хотите, но я сделал несколько изменений для python.el, поэтому я не могу быть уверен, что вы получите то же поведение. Если да, то дайте мне знать.

Ответ 3

M-x настроить группу RET python RET