如何使用函数参数在vim中切换缓冲区作用域变量?

时间:2014-11-21 21:33:12

标签: 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 Toggle
    endif
endfunction
function! ToggleOne()
    call Toggle(b:toggleThis)
endfunction

function! ToggleTwo()
    call Toggle(b:toggleThisAlso)
endfunction

它没有用。当然,还有更多的事情发生,但这并不影响功能。我只是根据的值执行不同的normnorm xppinorm xpa)命令,在这种情况下,b:toggleThis或b:toggleThisAlso。这里发生了什么?

2 个答案:

答案 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是缓冲区变量的名称
  • vim的变量基本上是字典。 a:name是缓冲区的整个字典
  • 变量内部的
  • b:语法将运行表达式作为名称的一部分(参见{...}
  • 使用:h curly-braces-names函数获取变量并返回默认值
  • 也许可以考虑将get()范围用于您的功能:s:

现在您可以执行其他切换功能:function! s:toggle(...)ToggleOne,如下所示:

ToggleTwo

警告:此function! ToggleOne() execute "normal! " . (Toggle('toggleThis') ? 'xa' : 'xppi') endfunction 功能会导致副作用,因此请务必妥善记录您的代码。

我不知道Togglenorm! xa命令应该做什么。像这样的函数中的norm! xppia基本上只是移动光标而不是让你处于插入模式。可能值得描述一下你实际想要完成什么,而不是你想要如何完成某些事情。

如需更多帮助,请参阅以下内容:

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
相关问题