vimscript使用全局计数器进行模板化

时间:2013-08-23 19:50:48

标签: markdown vim

我正在尝试使用vimscript创建一个通用的降价模板。 每次调用模板时,我都想增加一个计数器。

功能1

从降价文件中读取/解析

#CNTR=,递增

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

我从last-line - 1读到。打印last(行号)。但是,item(值为 list index)不:

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

我对用于循环列表的vimscript模式感到有些困惑。我尝试了几件事,包括#CNTR=* ......但找不到比赛真的没有运气!

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

调用该函数时,我看不到打印indxcntCNTR

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

函数2

调用 function1 ,获取g:CNTR,然后将模板写入markdown文件

功能3

递增g:CNTR并将更新写入文件

2 个答案:

答案 0 :(得分:1)

我不确定你要做什么,但你在这个剧本中做的一些事情没有意义(主要是for循环)。

我将尝试解释我认为你在做什么以及你应该做什么

let yogaf = readfile("yoga.js")

这会将文件作为字符串列表读入yagaf。 (这很好)

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

这是最后一行。但是,这可以简化为仅使用从列表末尾开始索引的负索引。然而,这整行是无用的,并且没有任何因素导致您所做的只是打印项目

let item = yogaf[-1]

接下来你有一个for循环,在那里你迭代这些行并尝试找到一个匹配模式#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似乎返回第一行,可能不是&#39你想要什么。

行<{1}}的

我认为您正试图从匹配的字符串前面删除cnt[6:]。然而,cnt并不包含你想要的东西。

因此,我们只需修改for循环,将#CNTR设置为正确的值,如果找到匹配的行则返回。

g:CNTR

在此循环结束时for i in g:yogaf if i =~ '#CNTR=' let g:CNTR = i[6:] return g:CNTR endif endfor 将被设置,或者您找不到任何内容。如果你没找到任何东西我设置g:CNTR等于-1并返回。

g:CNTR

所以完成的函数应该看起来像这样(删除了所有无关的东西)

let g:CNTR = -1
return g:CNTR

虽然我甚至不确定这是你想要的,因为你实际上没有提出问题。

答案 1 :(得分:1)

对于模板,请考虑使用ultisnips之类的插件(如果您的vim是使用Python支持构建的)或snipmate

Ultisnips允许您在片段中使用Python。两者都允许您在片段中使用vimscript。