许多人使用空格而不是制表符。我两个都用。行首的制表符和第一个非空白字符的空格。开始新文档没问题,以防我必须修改一个更好地适应使用格式。有时我仍然需要解决空格问题。
根据搜索和替换,我可以做到:%s/spaces_for_tab/tab/g
。它很简单,适用于许多情况。无论如何,我只想重构行首的空格。
这更像是一个正则表达式问题。要锚定在行的开头,请使用插入符号,例如
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
)。
我为它写了一个简单的函数。无论如何,它只适用于 4 空格制表符。
fu! Fixspaces()
while search('^\t* \{4}') != 0
execute ':%s/^\t*\zs \{4}/\t/g'
endwhile
endfu
如果存在,您可以提出更好的解决方案,我会很乐意使用它。问题是这个函数也替换了字符串中的空格。
如果有人感兴趣,我接受了马丁的回答并对其进行了一些改进:
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
此函数根据expandtab
和tabstop
设置的值执行适当的操作,并记住光标所在的位置。