Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用函数参数在vim中切换缓冲区范围的变量?_Vim - Fatal编程技术网

如何使用函数参数在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()
    函数获取变量并返回默认值
  • 请考虑使用<代码>:作用域:函数>代码>函数!s:切换(…)
现在您可以执行其他切换功能:
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) 在我看来,你的问题是“为什么我的切换功能不工作?”。如果这不再是你的问题或者你有一个不同的问题,那么用你的实际问题创建一个新的帖子。我刚刚发布了我的解决方案。我对我的原始代码进行了一些编辑,我认为这会使全局有点混乱。