Replace tabs with spaces in vim

前端 未结 11 1008
青春惊慌失措
青春惊慌失措 2020-12-02 03:38

I would like to convert tab to spaces in gVim. I added the following line to my _vimrc:

set tabstop=2

It works to stop at two

相关标签:
11条回答
  • 2020-12-02 03:44

    This article has an excellent vimrc script for handling tabs+spaces, and converting in between them.

    These commands are provided:

    Space2Tab Convert spaces to tabs, only in indents.

    Tab2Space Convert tabs to spaces, only in indents.

    RetabIndent Execute Space2Tab (if 'expandtab' is set), or Tab2Space (otherwise).

    Each command accepts an argument that specifies the number of spaces in a tab column. By default, the 'tabstop' setting is used.

    Source: http://vim.wikia.com/wiki/Super_retab#Script

    " Return indent (all whitespace at start of a line), converted from
    " tabs to spaces if what = 1, or from spaces to tabs otherwise.
    " When converting to tabs, result has no redundant spaces.
    function! Indenting(indent, what, cols)
      let spccol = repeat(' ', a:cols)
      let result = substitute(a:indent, spccol, '\t', 'g')
      let result = substitute(result, ' \+\ze\t', '', 'g')
      if a:what == 1
        let result = substitute(result, '\t', spccol, 'g')
      endif
      return result
    endfunction
    
    " Convert whitespace used for indenting (before first non-whitespace).
    " what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
    " cols = string with number of columns per tab, or empty to use 'tabstop'.
    " The cursor position is restored, but the cursor will be in a different
    " column when the number of characters in the indent of the line is changed.
    function! IndentConvert(line1, line2, what, cols)
      let savepos = getpos('.')
      let cols = empty(a:cols) ? &tabstop : a:cols
      execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
      call histdel('search', -1)
      call setpos('.', savepos)
    endfunction
    
    command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
    command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
    command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)
    

    This helped me a bit more than the answers here did when I first went searching for a solution.

    0 讨论(0)
  • 2020-12-02 03:48

    If you want to keep your \t equal to 8 spaces then consider setting:

       set softtabstop=2 tabstop=8 shiftwidth=2
    

    This will give you two spaces per <TAB> press, but actual \t in your code will still be viewed as 8 characters.

    0 讨论(0)
  • 2020-12-02 03:49

    Add following lines to your .vimrc

    set expandtab
    set tabstop=4
    set shiftwidth=4
    map <F2> :retab <CR> :wq! <CR>
    

    Open a file in vim and press F2 The tabs will be converted to 4 spaces and file will be saved automatically.

    0 讨论(0)
  • 2020-12-02 03:51

    This worked for me:

    you can see tabs with first doing this:

    :set list
    

    then to make it possible to replace tabs then do this:

    :set expandtab
    

    then

    :retab
    

    now all tabs have been replaced with spaces you can then go back to normal viewing like this :

    :set nolist
    
    0 讨论(0)
  • 2020-12-02 03:52

    gg=G will reindent the entire file and removes most if not all the tabs I get in files from co-workers.

    0 讨论(0)
  • 2020-12-02 03:54

    expand is a unix utility to convert tabs to spaces. If you do not want to set anything in vim, you can use a shell command from vim:

    :!% expand -t8
    
    0 讨论(0)
提交回复
热议问题