5

许多人使用空格而不是制表符。我两个都用。行首的制表符和第一个非空白字符的空格。开始新文档没问题,以防我必须修改一个更好地适应使用格式。有时我仍然需要解决空格问题。

根据搜索和替换,我可以做到:%s/spaces_for_tab/tab/g。它很简单,适用于许多情况。无论如何,我只想重构行首的空格。

4

3 回答 3

6

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

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 不能很好地处理这个(我不知道其他编辑器是做什么的),所以我主要使用:set expandtab(也许见:set softtabstop)。

于 2012-07-22T09:13:01.513 回答
2

我为它写了一个简单的函数。无论如何,它只适用于 4 空格制表符。

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

如果存在,您可以提出更好的解决方案,我会很乐意使用它。问题是这个函数也替换了字符串中的空格。

于 2012-07-22T14:34:22.207 回答
-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设置的值执行适当的操作,并记住光标所在的位置。

于 2017-06-14T01:34:29.833 回答