Vim:在选择中居中文本

AnC*_*AnC 1 vim

每隔一段时间,我发现自己在Vim中绘制简单的ASCII图:

        +-----------+
... --> | foo       | --> ...
        +-----------+
Run Code Online (Sandbox Code Playgroud)

大部分时间都花在确保文本居中的上面:

        +-----------+
... --> |    foo    | --> ...
        +-----------+
Run Code Online (Sandbox Code Playgroud)

不幸的是,到目前为止我一直无法自动完成这个过程:我想在视觉模式中选择框(即"foo"加上前导/尾随空格),然后输入一个命令来集中选择(Vim的内置:center适用于整条线,这对我没有帮助.)

这样的事情已经存在吗?如果没有,我将如何为此特定操作创建一个简单的脚本?

Ken*_*ent 7

有一个调整功能,你可以测试你的需求.

注意

  • 这只适用于单行选择.
  • |也不应选择边界字符(例如,在您的示例中).
  • 它仅适用于视觉选择
  • 如果你愿意,可以创建v-mapping.
  • 如果它不能完全满足您的需求,请修改该功能.

    function! GetVisual()
        try
            let v_save = @v
            normal! gv"vy
            return @v
        finally
            let @v = v_save
        endtry
    endfunction
    
    fun! CenterMe()
        let v = GetVisual()
        "let l = getline('.')
        let lre = '^\zs\s*\ze\S'
        let rre = '\s*$'
        let sp= matchstr(v,lre)
        let sp .= matchstr(v,rre)
        let ln=len(sp)
        let v = substitute(v,lre,sp[:ln/2-1],'')
        let v = substitute(v,rre,sp[ln/2:],'')
        let ve_save = &virtualedit
        let v_save = @v
        let &virtualedit = 'all'
        call setreg('v', v,visualmode())
        normal! gvx"vP
        let @v = v_save
        let &virtualedit = ve_save
    endf
    
    Run Code Online (Sandbox Code Playgroud)

这就像:

在此输入图像描述