2011-03-02 36 views
7

我使用雷泰公司的Vim仅空间

:set noet|retab! 

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

如果我删除!在retab结束时,空间不会被替换。

我使用自定义功能,有人创建尝试:

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

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

但我得到一个可爱的小错误信息,当我运行:检测

:RetabIndents 

错误而处理功能RetabIndents :

第2行:

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

+0

你确定你还没有取代所有标签开始空间?你使用的是原始文件还是已经运行':set noet | retab!'的已修改文件(或缓冲区)? – gotgenes

+0

好吧,这是问题,我没有任何空间来替换。如果找不到匹配,是不是应该忽略修饰符? –

+1

另请参阅http://stackoverflow.com/questions/5144284/force-vi-vim-to-use-leading-tabs-only-on-retab – wimh

回答

9

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

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

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

所以,现在该功能将自动按每行的开始更换标签的空间。

+2

您可以在':substitute'末尾使用'e'标志命令而不是'silent!',请参阅':h s_flags'。 – ZyX

+0

这就是我一直在寻找的!谢谢!添加了e标志并取消了沉默! –

0

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

使用BSD sed的:

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

*注:(ⅰ)在方括号中的字符是一个制表符(ⅱ)aftger的/ \ 1的字符也是制表符。两个制表符cgharacters都使用Ctrl + v + Tab组合键输入终端。

使用GNU sed的:

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