Markdown 使用全局计数器的vimscript模板

Markdown 使用全局计数器的vimscript模板,markdown,vim,Markdown,Vim,我正在尝试使用vimscript创建一个通用的标记模板。 每次调用模板时,我都希望增加一个计数器 功能1 #CNTR=从标记文件中读取/解析,递增 function! GetCNTR() let yogaf = readfile("yoga.js") 我读了最后一行-1last(行号)打印。但是,项(在 列表索引)不: let last=len(yogaf)-1 let item= yogaf[last] echo item let in

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

功能1

#CNTR=
从标记文件中读取/解析,递增

function! GetCNTR()
    let yogaf = readfile("yoga.js")
我读了
最后一行-1
last
(行号)打印。但是,
(在 列表索引)不:

    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
调用函数时,我看不到打印
indx
cnt
、或
CNTR

    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
,然后将模板写入标记文件

功能3


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

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

我要试着解释一下我认为你在做什么,你应该做什么

let yogaf = readfile("yoga.js")
这会将文件作为字符串列表读入yagaf。(这很好)

这是最后一行。但是,这可以简化为只使用从列表末尾开始索引的负索引。然而,这整行是无用的,什么也不做,因为你所做的只是打印项目

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似乎返回第一行,这可能不是您想要的

对于
cnt[6://code>行,我认为您试图从匹配字符串的前面剥离
#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
因此,完成的函数应该是这样的(删除所有无关的内容)


虽然我甚至不确定这是你想要的,因为你并没有问一个问题。

模板考虑使用一个插件(如果你的VIM是用Python支持构建的)或者


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

谢谢!我更喜欢python快速编写脚本,所以这看起来很有趣。
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