0

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

功能一

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

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

我对循环列表的 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,然后将模板写入降价文件

功能3

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

4

2 回答 2

1

我不确定您要做什么,但是您在此脚本中执行的某些操作没有意义(主要是 for 循环)。

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

let yogaf = readfile("yoga.js")

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

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

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

let item = yogaf[-1]

接下来,您有一个 for 循环,您可以在其中迭代其中的行并尝试找到与该模式匹配的行,#CNTR=\&如果找到它,则将其存储在 index.html 中。如果找不到,则将最后一行号存储在 index.html 中。

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

在这个 for 循环的末尾,indx 是包含匹配行的字符串或文件中的行数。我真的怀疑这是你的意思。

我认为你的意思是找到匹配的行,#CNTR=这就是我要改变它来做的事情。

您可以将其与 linei =~# '#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

尽管我什至不确定这是您想要的,因为您实际上并没有问问题。

于 2013-08-24T03:36:28.887 回答
1

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

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

于 2013-08-25T18:23:43.763 回答