元の置換はこれです(読みやすく/
するために区切り記号をに置き換えました#
):
%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)#
別の注意として、マップを再構成して読みやすくし、変更と保守を容易にすることをお勧めします。私のアプローチは、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>
それが役立つことを願っています!