我试图执行以下操作:
let b:toggleThisAlso = 1
let b:toggleThis = 1
function! Toggle(Toggle)
if !exists('Toggle')
let Toggle=1
endif
if Toggle == 1
let Toggle = 0
return Toggle
else
let Toggle = 1
return Toggle
endif
endfunction
function! ToggleOne()
call Toggle(b:toggleThis)
endfunction
function! ToggleTwo()
call Toggle(b:toggleThisAlso)
endfunction
它没有用。当然,还有更多的事情发生,但这并不影响功能。我只是根据的值执行不同的norm
(norm xppi
或norm xpa
)命令,在这种情况下,b:toggleThis或b:toggleThisAlso。这里发生了什么?
答案 0 :(得分:1)
问题是vim的变量有范围。就像有一个缓冲区范围b:
一样,还有其他范围:全局(g:
),窗口(w:
),脚本(s:
),vim({{ 1}})和参数(v:
)。
让我们首先修复你的"切换"功能:
a:
那么这里发生了什么:
function! Toggle(name)
let b:{a:name} = !get(b:, a:name, 0)
return b:{a:name}
endfunction
来引用函数参数a:name
是缓冲区变量的名称a:name
是缓冲区的整个字典b:
语法将运行表达式作为名称的一部分(参见{...}
):h curly-braces-names
函数获取变量并返回默认值get()
范围用于您的功能:s:
现在您可以执行其他切换功能:function! s:toggle(...)
和ToggleOne
,如下所示:
ToggleTwo
警告:此function! ToggleOne()
execute "normal! " . (Toggle('toggleThis') ? 'xa' : 'xppi')
endfunction
功能会导致副作用,因此请务必妥善记录您的代码。
我不知道Toggle
和norm! xa
命令应该做什么。像这样的函数中的norm! xppi
或a
基本上只是移动光标而不是让你处于插入模式。可能值得描述一下你实际想要完成什么,而不是你想要如何完成某些事情。
如需更多帮助,请参阅以下内容:
i
答案 1 :(得分:0)
事实证明,Peter Rinckler有一个解决方案,问题的根本原因与他所说的相同。这是我提出的解决方案。我没有正确确定我的变量范围。由于我是Vim脚本的新手,所以这个更清晰,但可能不是最好的,所以我会暂时不接受它,看看是否有更好的版本。
function! Toggle(Toggle)
if a:Toggle == 1
norm xppi
let l:T = a:Toggle
let l:T = 0
return l:T
else
norm xa
let l:T = a:Toggle
let l:T = 1
return l:T
endif
endfunction
function! ToggleThis()
if !exists('b:toggleThis')
let b:toggleThis=1
endif
let b:toggleThis = Toggle(b:toggleThis)
return b:toggleThis
endfunction