Ваша первоначальная замена такова (я заменил разделители /
на #
для удобства чтения):
%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>
Надеюсь, это поможет!