您的原始替换是这样的(为了便于阅读,我已将/
分隔符替换#
为):
%s#^\s*#&&#
这是我提出的反向替换(深呼吸......):
%s#^\s*#\=matchstr(submatch(0),'^.\{'.string(float2nr(len(submatch(0))/2)).'\}')#
假设匹配的字符串 ( submatch(0)
) 包含n
空格字符。我正在做的是计算这个数字的一半(n/2
= string(float2nr(len(submatch(0))/2))
),然后从匹配中提取那么多字符(基本上matchstr(n/2)
)。这确保我们得到的空白正好是我们开始时的一半(可能是空格和制表符的混合)。
如果您知道空格将仅包含空格或仅包含制表符,则可以稍微简化一下,例如:
%s#^\s*#\=repeat(" ",indent(".")/2)#
另一方面,我建议重新设计您的地图以使其更具可读性,从而更易于修改和维护。我的方法是定义两个函数:
function! DoubleWS()
let pos = getpos('.')
let reg = getreg('@')
exe '%s/^\s*/&&/e'
call setreg('@',reg)
call setpos('.',pos)
endfunction
function! HalfWS()
let pos = getpos('.')
let reg = getreg('@')
exe '%s#^\s*#\=matchstr(submatch(0),"^.\\{".string(float2nr(len(submatch(0))/2))."\}")#e'
call setreg('@',reg)
call setpos('.',pos)
endfunction
请注意,这些get/set
pos/reg
函数是维护光标位置和寄存器的更强大的方法。然后,您可以根据需要映射这些函数:
nnoremap <silent> <leader>iw :call DoubleWS()<CR>
nnoremap <silent> <leader>rw :call HalfWS()<CR>
希望有帮助!