Search code examples
emacspython-mode

Set python indent to 2 spaces in emacs 23?


I am using emacs 23.1.1 on Ubuntu 10.04. I wish to program in Python with a 2-space indent. emacs looks to have a default mode for python (python.el?).

I put the following in my .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)

When I edit a Python file, it uses a 4-space indent. When I try C-h v python-indent it says:

    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.

That is, it is 4, not 2. Grr. I tried customizing the variable and saving, still 4. I tried customize-group indent, still 4.

How do I get emacs to pay attention?


Solution

  • Either in you .emacs file or in a file referenced by your .emacs add:

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

    You can put in a hook if you want to localize

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

    EDIT: I have found the following the following issues can mess with my settings:

    • setting the variable before the library is loaded
    • other packages/configs resetting the global variables

    For both those issues I have found creating hooks and localizing the variables can help.