简体   繁体   中英

Reformat a Python file to have 4 space indentations

I'm editing a Python file that uses two spaces for programmatic indents - I prefer 4 spaces. In my .vimrc I have the following settings related to indentation:

set tabstop=4                     "Indentation levels every four columns
set expandtab                     "Convert all tabs typed to spaces
set shiftwidth=4                  "Indent/outdent by four columns
set softtabstop=4

How do I get Vim to convert all the existing 2 space indents to be 4 space indents?

In other words:

if something:
  dothis()

becomes

if something:
    dothis()

When I tried gg=G

def check():
  for a in list:
    for  b in list2:
      check(a, b)
      while (len > MAX) :
        poll()

  while(len(thelist) > 0) :
    poll()  

  return results

became

def check():
    for a in list:
    for  b in list2:
    check(a, b)
    while (len > MAX) : 
        poll()

        while(len(thelist) > 0) :
            poll()

            return results

In order to double the number of spaces at the beginning of every line (and only at the beginning):

:%s/^\s*/&&/g

& in replacement pattern is the matched pattern.

Probably it will not have any side-effect for you.

Pressing gg=G is the command to re-indent everything in a file. If you have other elements that can be re-indented, vim will indent these as well, which doesn't always give the desired effects. You'll have to clean these up manually if they're ugly.

Alternately, you can use the > command to indent, with ranges to go through the file somewhat efficiently manually. 99>k , for example, would indent the 99 lines below the cursor by one level.

I've found the reindent script http://pypi.python.org/pypi/Reindent/0.1.0 works well for me. Not pure vim, but really easy!

After its installed you can use it in vim with

:%! reindent

(ie pipe the entire buffer through the reindent program) and it's done.

From the command line it can be used to reindent multiple files (eg all files in a directory, or even recursively down a directory tree).

try the following substitution command:

:%s/  /    /g

(To clarify: there are two spaces between the first and second '/' and four the second and third '/'.)

One helpful command when working with whitespace issues is also the set list command which will visually show all whitespace. Use set nolist to unset.

The best current way to reformat Python, fix many other issues, and also make it PEP8 compliant is to use autopep8 . See this related question . So after you've installed autopep8 (eg pip install autopep8 ) in vim you do:

:%! autopep8 -

There's also a vim-autopep8 plugin to make things even simpler.

The vim plugin vim-autoformat integrates the formatter autopep8 into vim automatically, if it is installed. You can format the whole file, or the visually selected part using a single keystroke.

More importantly, vim-autoformat takes the relevant settings of your .vimrc into account, eg if you have

set shiftwidth=4

in your .vimrc , it will pass this information on to autopep8.

Have you tried?

:retab

I'm not in front of a machine with Vim at the moment so I can't verify this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM