我正在尝试使用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
调用该函数时,我看不到打印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
,然后将模板写入markdown文件
功能3
递增g:CNTR
并将更新写入文件
答案 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)