Set python indent to 2 spaces in emacs 23?
Asked Answered
E

3

24

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?

Envelop answered 22/11, 2010 at 23:11 Comment(0)
S
19

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.

Swetiana answered 22/11, 2010 at 23:43 Comment(4)
This answer ignores the fact that I already had tab-width 2 in my .emacs, and doesn't explain any of what I was seeing. Still, my setup works now (don't know why), so I'll accept.Envelop
Just out of curiosity, why wrap (lambda ...) in (function ...)? I hadn't seen (function ...) before, and the manual suggests it's not necessary.Brawley
Tyler: Historically, it made a difference. It's no longer necessary, but still a habit for many people. See #1853344 for details.Istanbul
I have python-indent at 2 and tab-indent at two and I still get an actual indent of 1. That stuff like this is this finicky in emacs is not at all good.Smirk
F
23

You can put this into your .emacs file:

(add-hook 'python-mode-hook '(lambda () 
 (setq python-indent 2)))

The reason why

    (setq-default python-indent 2)

does not work may because this variable does not exit when .emacs is loaded. (But I am an emacs newbie. I am not sure about my explanation.)

However, PEP 8 -- Style Guide for Python Code recommends "4 spaces per indentation level" and I find 4 spaces more readable. I actually use this piece of code to force a 4 spaces indentation.

Faxon answered 13/12, 2010 at 3:33 Comment(2)
If you use this code to set the indentation to be the same as the default, are you sure it even works?Busyness
I actually used Vulpecula's fix (my tab indentation was at 8) and it fixed the problemDivorce
S
19

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.

Swetiana answered 22/11, 2010 at 23:43 Comment(4)
This answer ignores the fact that I already had tab-width 2 in my .emacs, and doesn't explain any of what I was seeing. Still, my setup works now (don't know why), so I'll accept.Envelop
Just out of curiosity, why wrap (lambda ...) in (function ...)? I hadn't seen (function ...) before, and the manual suggests it's not necessary.Brawley
Tyler: Historically, it made a difference. It's no longer necessary, but still a habit for many people. See #1853344 for details.Istanbul
I have python-indent at 2 and tab-indent at two and I still get an actual indent of 1. That stuff like this is this finicky in emacs is not at all good.Smirk
B
15

I just ran into this problem myself, and I think the help for python-indent contains a big clue that no one else mentioned:

See also `M-x python-guess-indent'

If you don't customize python-guess-indent by setting it to nil, then python.el will automatically set python-indent for each Python buffer (that contains indented text), making your python-indent customization ineffective. (On the other hand, when in Rome...)

In the end, this is what went into my .emacs file (ignoring all other custom variables):

(custom-set-variables
 '(python-guess-indent nil)
 '(python-indent 2))
Busyness answered 17/11, 2011 at 4:4 Comment(2)
For working with existing Python code I needed to set python-guess-indent to nil for things to work the way I wanted it to. For new Python code it wasn't required though. This was a bit confusing until I tried this fix.Vespine
Now in Emacs v26 the python-mode variables have longer names. I ended up with this added to my custom-set-variables. I'm just trying to make it quit guessing and force it to 4. '(python-indent-guess-indent-offset nil) '(python-indent-offset 4)Yand

© 2022 - 2024 — McMap. All rights reserved.