2013-08-23 38 views
0

我想創建一個通用的降價模板,使用vimscript。 每次調用模板時,我都想增加一個計數器。vimscript與全球計數器模板

函數1

#CNTR=是讀/從降價文件解析,遞增

function! GetCNTR() 
    let yogaf = readfile("yoga.js") 

我從last-line - 1讀取。打印行號last(行號)。然而,item(在 列表索引值)不:

let last=len(yogaf)-1 
    let item= yogaf[last] 
     echo item 
     let indx = 0 

我用vim腳本模式有點困惑,通過列表循環。我嘗試了幾件事情,包括#CNTR=* ...但找到一場比賽沒有運氣!

for i in yogaf 
     if i =~ "#CNTR=\&" 
      let indx = i 
      break 
     else 
      let indx = len(yogaf)-1 
     endif 
    endfor 

當函數被調用時,我沒有看到indxcnt,或CNTR打印。

echo indx 
    let cnt = yogaf[indx] 
    echo string(cnt) 
    let [g:CNTR] = cnt[6:] 
    echo g:CNTR 
    return g:CNTR 
endfunction 

函數2

電話功能1,得到g:CNTR,然後寫入模板降價文件

功能3

增量g:CNTR,並寫入更新文件

回答

1

我不確定你想做什麼,但是你在這個腳本中做的一些事情沒有意義(主要是for循環)。

我要去嘗試,並解釋什麼,我認爲你做的,哪些是你應該做的

let yogaf = readfile("yoga.js") 

這讀取文件作爲字符串到yagaf列表英寸(這很好)

let last=len(yogaf)-1 
let item= yogaf[last] 

這會得到最後一行。但是,這可以簡化爲僅使用列表末尾的負數索引。然而,這整條生產線是無用的,什麼也不做導致所有你要做的就是打印項目

let item = yogaf[-1] 

接下來你有一個循環,你遍歷的線條和嘗試,並找到了,如果你找到匹配模式#CNTR=\&線它存儲在索引中。如果您沒有找到它,則將索引中的最後一行存儲起來。

for i in yogaf 
    if i =~ '#CNTR=\&' 
     let indx = i 
     break 
    else 
     let indx = len(yogaf)-1 
    endif 
endfor 

在這段結束for循環INDX要麼是包含匹配線或在文件中的行數的字符串。我真的懷疑這是你的意思。

我想你的意思是找到匹配#CNTR=的行,這就是我要改變它做的事情。

您可以將其與該行匹配i =~# '#CNTR='這將匹配其中包含#CNTR=的任何行(並且具有相同大小寫)。你的其他正則表達式#CNTR=*的意思是任何符合#CNTR=*的行都有零個或多個=等號。這可能會匹配,但你可能等號這將是以後想要什麼#CNTR=.*.匹配任何*零次或多次)

for循環你有後

echo indx 
let cnt = yogaf[indx] 
echo string(cnt) 
let [g:CNTR] = cnt[6:] 
echo g:CNTR 
return g:CNTR 

CNT會(幾乎)從不是你想要的,你可以得到幸運,但如果你的字符串匹配(它可能做到了),你會用一個字符串索引列表,而vim似乎返回可能不是你想要的第一行。

cnt[6:]我認爲你試圖從你匹配的字符串的前面剝離#CNTR。但是cnt不包含你想要的東西。

因此,讓我們修改for循環,將g:CNTR設置爲正確的值,並在找到匹配的行時返回。

for i in g:yogaf 
    if i =~ '#CNTR=' 
     let g:CNTR = i[6:] 
     return g:CNTR 
    endif 
endfor 

在此循環結束時,將會設置g:CNTR或者您未找到任何內容。如果你沒有找到任何我設置的g:CNTR等於-1並返回。

let g:CNTR = -1 
return g:CNTR 

所以完成的功能應該是這個樣子(去除所有多餘的東西)

function! GetCNTR() 
    let l:yogaf = readfile("yoga.js") 
    for i in l:yogaf 
     if i =~ '^#CNTR=' 
      let g:CNTR = i[6:] 
      return g:CNTR 
     endif 
    endfor 
    let g:CNTR = -1 
    return g:CNTR 
endfunction 

雖然我什至不知道這是你想要的,因爲你實際上並沒有問題。

1

對於模板,考慮使用像ultisnips這樣的插件(如果您的vim是用Python支持構建的)或者snipmate

Ultisnips允許您在片段中使用Python。兩者都允許您在片段中使用vimscript。

+0

謝謝!我更喜歡python快速腳本,所以這看起來很有趣。 – syntax