vim中的三(n状态)变量切换

时间:2017-06-17 07:00:12

标签: vim

在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。

2 个答案:

答案 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")