emacs 23 python.el auto-indent style — can this be configured?

自作多情 提交于 2019-12-20 10:37:05

问题


I have been using emacs 23 (python.el) for just over a month now and I'm unhappy with the default auto-indentation settings.

Currently, my Python files are auto-indented as follows:

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')

I would prefer if I could set the auto-indentation settings so the same code could easily be formatted:

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')

It seems that the logic for how I'd like the auto-indentation to perform would be:

If the last character (non-comment/whitespace) of the previous line is a :, increase the indent-level by 1. Else, use the same indentation level.

But using that logic, TAB would need to actually increase the indent-level of the current line. (Currently, TAB only moves the line to the auto-indent level)

Does anyone know how I can modify emacs auto-indentation to achieve my desired style?


回答1:


You can try this peace of code :

(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)

Now, a simple python dict like this :

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

becomes...

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



回答2:


Try with the last fgallina's python.el version. It contains many other improvements.

I use this version and TAB has the behavior that you want, but I made several modifications to python.el, so I can't be sure that you'll get the same behavior. If so, Let me know.




回答3:


M-x customize-group RET python RET



来源:https://stackoverflow.com/questions/5094649/emacs-23-python-el-auto-indent-style-can-this-be-configured

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!