2014-12-14 1 views
1

Я написал функциюФункция ест мои пробела

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, она работает так, как ожидалось. Почему это происходит?

ответ

2

Чтобы использовать обратную косую черту и пробелы с :set, вам необходимо дополнительное экранирование, см. :help option-backslash. Таким образом, ваша обратная косая черта перед пространством уже занята командой :set. (Вы можете проверить это с помощью :set stl?)

Если подходя с правильным побегом слишком сложно, альтернативой является использование :let команды вместо:

:let &statusline = '...' 

Однако, вы должны использовать только двойные кавычки в ваше значение статусной линии или сделка с кавычками в кавычках.

+0

Нет, это не слишком сложно. Это просто факт, который нужно знать, чтобы избежать «неожиданных» сюрпризов :) Хороший намек на использование 'let' вместо этого! – Saucier