在vim中进行三态切换的最佳方法是什么? 我能做点什么吗? (C):
void toggle(void)
{
static int var = 3-1;
var=(var+1)%3;
printf("%d\n", var);
}
int main()
{
toggle(); //0
toggle(); //1
toggle(); //2
toggle(); //0
toggle(); //1
toggle(); //2
}
我试过
fun! Toggle()
let l:var=0
let l:var+=1
echom l:var
endfun
但这总是打印1。
答案 0 :(得分:2)
您的变量是本地变量(因此preload="none"
中的l
),因此每次调用l:var
时,它都会“重置”为零。您可以使用前缀Toggle()
来使用全局变量。
g
然后在vim里面:
let g:var=0
fun! Toggle()
let g:var = (g:var + 1) % 3
echom g:var
endfun
我建议为全局变量添加一些标识符(例如:call Toggle()
0
:call Toggle()
1
:call Toggle()
2
:call Toggle()
0
),以防止与插件和其他脚本发生冲突。
答案 1 :(得分:0)
与C静态变量最接近的是脚本本地s:变量。顾名思义,它们不是功能的本地,而是脚本。
在旁注中,我在我的库插件中为此提供了一个函数:lh#menu#def_toggle_item()
。
我的关联单元测试是over there。
它的作用:
:Toggle MenuSubmenuVariable [value]
,它允许循环显示一系列可能的值 - 支持完成例如,这是一个触发事件的复杂示例:
let Data4 = {
\ "variable": "yesno",
\ "values": [ 1, 2, 3 ],
\ "text": [ "No", "Yes", "Perhaps" ],
\ "actions": [ function("s:No"), function("s:Yes"), function('s:Perhaps') ],
\ "menu": { "priority": '42.50.20', "name": '&LH-Tests.&TogMenu.&yesno'}
\}
call lh#menu#def_toggle_item(Data4)
允许切换/循环:
:Toggle LHTestsTogMenuyesno " to go to the next state
:Toggle LHTestsTogMenuyesno no " to force a value
:echo g:yesno " -> 1 (associated to "no")