你原有的替換是這樣(我與#
的可讀性取代/
分隔符):
%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)
)。這確保我們獲得剛剛開始的空白的一半(可能是空格和製表符的混合)。
如果你知道的空白將只包含空格或ONLY選項卡,這可能有所簡化,例如:
%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>
希望有所幫助!
美麗!我嘗試過這樣的事情,但我不知道你可以在第一個替代塊中使用'\ 1'。簡單而有效! – 2012-02-03 07:56:59
@PrinceGoulash:謝謝!它有點習慣於模式。您可能已經注意到了一個非凡的例子,它是可用於測試非負整數是否爲素數的正則表達式。在Vim腳本中,測試看起來像'repeat'('1',n)!〜'^ 1 \?$ \ |^\(1 \ { - 2,} \)\ 1 \ + $'', n'是有問題的數字。 – 2012-02-03 09:17:18
謝謝,這真是優雅的解決方案。 – 2012-02-03 18:05:02