Вашей оригинальная замена этого (я заменил /
разделителей с #
для удобства чтения):
%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>
Надеюсь, что это поможет!
Красивая! Я пробовал что-то вроде этого, но я не знал, что вы можете использовать '\ 1' в первом блоке-заменителе. Простой и эффективный! –
@PrinceGoulash: Спасибо! Это несколько идиоматический тип узоров. Замечательным примером, о котором вы, вероятно, знаете, является регулярное выражение, которое можно использовать для проверки того, является ли неотрицательное целое число простым числом. В скрипте Vim тест будет выглядеть как 'repeat ('1', n)! ~ '^ 1 \? $ \ |^\ (1 \ {- 2,} \) \ 1 \ + $'', где ' n' - число, о котором идет речь. –
Спасибо, это действительно изящное решение. –