功能吃掉了我的太空人物

时间:2014-12-14 00:39:25

标签: function vim escaping statusline

我写了一个函数

function! BrickWrap(data, icon_align, icon_left, icon_right)
    if empty(a:data)
        return ''
    endif

    let l:brick = (a:icon_align ==# 'left') ? a:icon_left . a:data :
                \ (a:icon_align ==# 'right') ? a:data . a:icon_right :
                \ (a:icon_align ==# 'surround') ? a:icon_left . a:data . a:icon_right :
                \ (a:icon_align ==# 'none') ? a:data :
                \ ''

    if empty(l:brick)
        echom 'BrickWrap(): Argument "icon_align" must be "left", "right", "surround" or "none".'
        return ''
    endif

    return l:brick
endfunction

为了格式化在我的状态行中显示的一些数据,例如:

set statusline+=%#User2#%{BrickWrap('some_data','surround','\ ','\ ')}

上面的示例应该在每一侧用空格字符包装数据。但实际上发生的事情是,它只向右侧添加空格字符,而不向左侧添加空格字符。为了获得左侧显示的空格字符,我必须传递两个转义的空格字符('\ \ ')。我必须提到它只发生在状态线上。如果我:call它的功能按预期工作。 为什么会这样?

1 个答案:

答案 0 :(得分:2)

要在:set中使用反斜杠和空格,您需要进行其他转义,请参阅:help option-backslash。因此,:set命令已经在空格前面反斜杠了。 (您可以通过:set stl?

进行检查

如果提出正确的转义太难了,另一种方法是使用:let命令:

:let &statusline = '...'

但是,您必须只在状态行值中使用双引号,或者处理引用内引用的引用。