如何将前导空格转换为制表符?

时间:2012-07-22 08:50:25

标签: vim

许多人使用空格而不是标签。我用它们两个。行的开头和第一个非空白字符的空格。启动新文档没有问题,如果我需要修改一个更好的适应使用格式。有时我仍然需要解决空间问题。

根据Search and replace我可以做:%s/spaces_for_tab/tab/g。它很简单,适用于很多情况。无论如何,我想只在行的开头重构空格。

3 个答案:

答案 0 :(得分:5)

这更多是正则表达式问题。要锚定在行的开头,请使用插入符号,例如

s/^        /\t/

或者使用vim的内置功能:

:set tabstop=4  "four spaces will make up for one tab
:set noexpandtab  "tell vim to keep tabs instead of inserting spaces
:retab            "let vim handle your case

顺便说一下,我也更喜欢缩进的标签和对齐的空格。不幸的是,vim doesn't handle this well(我不知道其他编辑会做什么),所以我主要使用:set expandtab(可能会看到:set softtabstop)。

答案 1 :(得分:2)

我为它编写了一个简单的函数。无论如何它只适用于4空格标签。

fu! Fixspaces()
        while search('^\t* \{4}') != 0
                execute ':%s/^\t*\zs \{4}/\t/g'
        endwhile
endfu

你可以建议更好的解决方案,如果存在的话,我将愉快地使用它。 问题是这个func也替换了字符串中的空格。

答案 2 :(得分:-1)

如果有人感兴趣的话,我接受了马丁的回答并对其进行了改进:

function Fixspaces()
  let ts = &tabstop
  let pos = getpos('.')

  if &expandtab
    while search('^ *\t') != 0
      silent execute ':%s/^ *\zs\t/'.repeat(' ', ts).'/g'
    endwhile

    echo 'Changed tabs to spaces'
  else
    while search('^\t* \{'.ts.'}') != 0
      silent execute ':%s/^\t*\zs \{'.ts.'}/\t/g'
    endwhile

    echo 'Changed spaces to tabs'
  endif

  call setpos('.', pos)
endfunction

此函数根据expandtabtabstop设置的值执行相应的操作,并记住光标所在的位置。