如何使用函数参数在vim中切换缓冲区范围的变量?
我正在努力做到以下几点:如何使用函数参数在vim中切换缓冲区范围的变量?,vim,Vim,我正在努力做到以下几点: 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
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
:h variables
:h E121
:h get(
:h curly-braces-names
:h :funciton
:h a:var
:h local-variables
它不起作用了。当然,还有一些事情正在发生,但这并不是影响功能的原因。我只是根据b:toggleThis或b:toggleThis的值执行一个不同的
norm
(或者norm xppi
或者norm xpa
)命令。这是怎么回事?问题是vim的变量有作用域。就像有一个缓冲区作用域一样,b:
,还有其他作用域:全局(g:
)、窗口(w:
)、脚本(s:
)、vim(v:
)和参数(a:
)
让我们从修复“切换”功能开始:
function! Toggle(name)
let b:{a:name} = !get(b:, a:name, 0)
return b:{a:name}
endfunction
那么这里发生了什么:
- 使用
引用函数参数a:name
是缓冲区变量的名称a:name
- vim的变量基本上是字典<代码>b:是缓冲区的整个字典
变量内部的语法将作为名称的一部分运行表达式(请参见{…}
):h花括号名称
- 使用
函数获取变量并返回默认值get()
ToggleOne
和ToggleTwo
如下所示:
function! ToggleOne()
execute "normal! " . (Toggle('toggleThis') ? 'xa' : 'xppi')
endfunction
警告:此切换
功能会产生副作用,因此请确保妥善记录代码
我不知道什么是规范!xa
和标准!xppi
命令应该正在执行<在这样的函数中,code>a或i
基本上只需移动光标,而不会使您处于插入模式。也许值得描述的是你实际上想要完成什么,而不是你是如何试图完成某件事的
有关更多帮助,请参阅以下内容:
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
:h variables
:h E121
:h get(
:h curly-braces-names
:h :funciton
:h a:var
:h local-variables
事实证明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
我没有进一步看,但是引号的使用是向后的:do
calltoggle('b:toggleThis')
和if!exists(Toggle)
。如果我按照您的建议交换引号,vim会因为exists()上的无效函数参数和一些相关错误而对我大喊大叫。很酷,但是现在我如何合并其他命令?大括号语法很酷,非常有用,但我不知道我是否把问题说清楚了。我也解决了这个问题,但没有那么优雅。如果Stackoverflow允许,我会将我的解决方案作为答案发布,如果您愿意,您可以对其进行评论。@Jonathan 1)我如何合并其他命令?我给了您一个新的ToggleOne
函数的示例。2) 在我看来,你的问题是“为什么我的切换功能不工作?”。如果这不再是你的问题或者你有一个不同的问题,那么用你的实际问题创建一个新的帖子。我刚刚发布了我的解决方案。我对我的原始代码进行了一些编辑,我认为这会使全局有点混乱。