2011-02-11 54 views
2

VIM中的字符串格式令我頭疼。VIM中的字符串格式(填充)

我想我非常習慣在Python中使用字符串格式,您可以指定 輸出字符串將如何分隔,中間有多少空格等等。

所以我有一個VIM插件,以看起來像一個臨時緩衝區輸出信息:

Line: 1 ==>> ErrorName ==>> File Path: /foo 

我建立一個字符串追加到緩衝區之前,一切工作太棒了。但是,只要你有不同的行號(數字明智的),你得到的東西是這樣的:

Line: 1 ==>> Error ==>> File Path: /foo 
Line: 123 ==>> ErrorNameLong ==>> File Path: /foo 
Line: 12 ==>> ErrorShort ==>> File Path: /foo 

我曾嘗試做着做着標籤,而不是空間,但它只能使情況變得更糟(空間更大發展)。所以,我的理想最終結果必須是這樣的:

Line: 1 ==>> Error   ==>> File Path: /foo 
Line: 123 ==>> ErrorNameLong ==>> File Path: /foo 
Line: 12 ==>> ErrorShort ==>> File Path: /foo 

我清楚地意識到,幫助插件(比如tabular.vim),但因爲這是一個插件本身,我不想需要依賴在一個不同的插件只是爲了簡單的字符串格式。

這是到目前爲止,我已經嘗試過的事情:

  • 標籤(和標籤+空格)
  • 搜索和(在緩衝渲染後和標籤用空格)與選項卡代替

在我看來,必須有一個好辦法,我只是想念它。

如何在VIM中實現我需要的字符串格式?

回答

3

我使用了兩個小函數,沒什麼特別的,一個在字符串之後添加填充,另一個如果我想在字符串之前添加。 PrePad函數允許填充字符的可選參數,我有時使用它填充前面的0的數字。

function! Pad(s,amt) 
    return a:s . repeat(' ',a:amt - len(a:s)) 
endfunction 

" Pad('abc', 5) == 'abc ' 
" Pad('ab', 5) == 'ab ' 


function! PrePad(s,amt,...) 
    if a:0 > 0 
     let char = a:1 
    else 
     let char = ' ' 
    endif 
    return repeat(char,a:amt - len(a:s)) . a:s 
endfunction 

" PrePad('832', 4)  == ' 823' 
" PrePad('832', 4, '0') == '0823' 

在構建原始日誌消息時Pad()會很簡單。例如:

echo 'Line: ' . Pad(linenum,8) . '==>> ' . Pad(errmsg,12) . '==>> FilePath: ' . path 
+0

起初我懷疑這種方法會起作用。最初拋棄我的是'a:amt - len(a:s)',因爲你需要ENOUGH填充才能使它工作。這解決了我的問題,感謝您花時間在這裏獲取功能。 – alfredodeza

+1

@alfredodeza只有當你接受ascii時,你才應該使用'len()'。嘗試用'strwidth()'(僅vim-7.3)或'len(split(a:s,'\ zs'))'(不處理全角字符)替換每個len。 – ZyX

+3

@alfredodeza雖然如果只處理ascii是正常的,那麼你可以扔掉這兩個函數,並使用內置的printf:'echo printf('Line:% - * u == >>% - * s == >> FilePath%s',8,linenum,12,errmsg,path)'。對於'PrePad',在'%'後面刪除'-'。 – ZyX