【问题标题】:Vim boolean functionVim 布尔函数
【发布时间】:2011-10-17 14:15:10
【问题描述】:

我正在尝试在 Vim 中实现一个布尔函数,但遇到了一些麻烦,我确信我缺少一些东西。

为了清楚起见,我希望实现一个函数,当用 ! 调用它时,它会做相反的事情。

Vim 有很多布尔函数,例如 listpaste。就我而言,如果我有一个函数可以打开一个缓冲区,例如:

:call MyFunction()

然后我希望它在使用! 调用时关闭缓冲区:

:call MyFunction()!

不确定这是否可能,我不是在寻找如何打开或关闭缓冲区,而是寻找实际的布尔实现。

编辑:

如果我们谈论用户定义的命令,这似乎更可行,例如:

:MyCommand action

也可以这样称呼:

:MyCommand action!

【问题讨论】:

  • 你很困惑:可选的 bang 位于命令名称之后::MyCommand! action。见:help :command:help :command-bang

标签: function vim boolean


【解决方案1】:

在创建命令时,给它-bang 选项,然后使用<bang>,它将扩展为一个爆炸或什么都没有。然后,要将其重定向到您的函数,请创建一个特殊参数并对其进行分析以查看它是否包含爆炸。像这样:(包括 ZyX 的建议)

function! Bang(bang)
    echo "With".((a:bang)?"":"out")." bang."
endfunction

command! -bang Bg call Bang(<bang>0)

当然,我在这里没有做正确的测试来检查a:bang 是否真的很成功,但你明白了。

:Bg
Without bang.  

:Bg!
With bang.

【讨论】:

  • 一个巧妙的技巧是在函数参数中使用&lt;bang&gt;0:它可以直接转换为0,也可以转换为1。也不要在布尔上下文中使用len(...),而是使用!empty(...)
  • 感谢 ZyX!真的很好,我正在寻找一种更好的方法来传递论点。但是empty() 真的有必要吗?使用 a:bang 值作为条件似乎就足够了。
  • 我从来没有说过你应该在 this 的情况下使用empty()。我只是说没有必要使用len(...)(在字符串上它比!empty(...)慢得多)。
  • 对不起@ZyX,我以为您指的是使用empty() 和传递参数的新方法。
猜你喜欢
  • 2013-05-06
  • 2012-01-23
  • 2011-11-05
  • 2015-10-07
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多