我正在使用
: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})+
答案 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