将Vim中每行开头的空格数减半

Gor*_*sel 4 vim removing-whitespace

有人能告诉我如何在Vim中执行与此映射相反的操作:

nnoremap <leader>iw :let _s=@/<Bar>:let _s2=line(".")<Bar>:%s/^\s*/&&/ge<Bar>:let @/=_s<Bar>:nohl<Bar>exe ':'._s2<CR>
Run Code Online (Sandbox Code Playgroud)

作为澄清,该映射&&将每行开头的空白数量加倍(部分).只有第一个常规字符前的空格才会受到影响.保留当前搜索字符串(可变_s).此转换后位置恢复(变量_s2)

所以基本上我正在寻找一个映射,如果它们被一个接一个地执行,它将撤消这个映射.

我无法弄清楚如何限制这个新操作只能在第一个常规字符之前的空格上工作.

ib.*_*ib. 5

以下替换命令会反转其对应的前导空格加倍的效果.

:%s/^\(\s*\)\1/\1/
Run Code Online (Sandbox Code Playgroud)

要为此命令构造的映射需要遵循与问题语句中使用的模式相同的模式(当然,除了要执行的替换之外).为了减少定义中的重复,可以将状态保留代码分成一个小函数:

nnoremap <silent> <leader>>    :call PinnedCursorDo('%s/^\s*/&&/')<cr>
nnoremap <silent> <leader><lt> :call PinnedCursorDo('%s/^\(\s*\)\1/\1/')<cr>
function! PinnedCursorDo(cmd)
    let [s, c] = [@/, getpos('.')]
    exe a:cmd
    let @/ = s
    call setpos('.', c)
endfunction
Run Code Online (Sandbox Code Playgroud)