Vim仅在行的开头处保留空格

时间:2011-03-02 19:08:27

标签: vim tabs whitespace

我正在使用

:set noet|retab!

但是我遇到的问题是它将整个文件中的4个空格的所有实例替换为标签。 我需要vim只在行的开头替换4个空格的实例。

如果我删除了!在重新结束时,空格不会在任何地方被替换。

我尝试过使用某人创建的自定义函数:

" Retab spaced file, but only indentation
command! RetabIndents call RetabIndents()

" Retab spaced file, but only indentation
func! RetabIndents()
    let saved_view = winsaveview()
    execute '%s@^\( \{'.&ts.'}\)\+@\=repeat("\t", len(submatch(0))/'.&ts.')@'
    call winrestview(saved_view)
endfunc

但是当我跑步时,我收到一条不错的小错误信息:

:RetabIndents
  

处理函数RetabIndents时检测到错误:

     

第2行:

     

E486:未找到模式:^({4})+

2 个答案:

答案 0 :(得分:9)

在与其他人谈论此事后,我需要添加无声!执行前的命令。 所以这就是我现在所做的工作:

autocmd BufWritePre * :RetabIndents
command! RetabIndents call RetabIndents()

func! RetabIndents()
    let saved_view = winsaveview()
    execute '%s@^\(\ \{'.&ts.'\}\)\+@\=repeat("\t", len(submatch(0))/'.&ts.')@e'
    call winrestview(saved_view)
endfunc

所以现在这个函数会自动用每行开头的制表符替换空格。

答案 1 :(得分:0)

我使用不同的方法在shell脚本开头将空格更改为制表符。我只是从命令行使用sed。

使用BSD sed:

sed -i "" -e ':loop' -e "s/^\([ ]*\)  /\1   /" -e 't loop' somefile.sh

*注意:(i)方括号中的字符是制表符(ii)后面的字符/ \ 1也是制表符。使用Ctrl + v + Tab组合键在终端中输入两个选项卡cgharacters。

使用GNU sed:

sed -i -e ':loop' -e 's/^\([\t]*\)  /\1\t/' -e 't loop' somefile.sh