【问题标题】:Two consecutive identical calls to echo have different output in Vim function对 echo 的两个连续相同调用在 Vim 函数中具有不同的输出
【发布时间】:2019-09-28 11:43:20
【问题描述】:

Original post on Vi and Vim Beta,曾经有过one interesting answer,但目前关注度不高。很抱歉交叉发布,我会要求关闭/删除原件。

给定.vimrc文件中的以下函数,

fu! MyFun(count)
  echo a:count
  echo a:count
  if a:count > 0
    normal ,
    call MyFun(a:count - 1)
  endif
endf

调用:call MyFun(3) 会生成以下输出。

3
3
2
2
1
1
0
0

但是,如果我定义了映射 nn , :<C-U>execute "call MyFun(" . v:count . ")"<CR>,那么对 :call MyFun(3) 的调用就会生成

3
0
2
0
1
0
0
0

我明白, 的映射使MyFun 函数调用自身两次(if a:count > 0),但是我不明白这如何导致两次连续调用echo a:count 的结果不同。

【问题讨论】:

  • [对刚刚删除的评论的回答] 实际上不是,a:count 是具有参数count 的函数中的有效参数标识符,MyFun 的情况也是如此(什么传递给函数的实际参数是无关紧要的);请检查:h a:var。另一方面,v:count 用于检索为最后一个正常模式命令提供的计数;请参考:h v:count
  • 也许避免交叉发布和删除这个问题是有意义的?那么我可以为 vim.se 重写我的答案。
  • 嗯,我同意你的观点,这个问题最合适的网站是https://vi.stackexchange.com/,而不是 StackOverflow。但是,如果没有交叉发布,我就不会受到任何关注。既然您可以在那里发布问题,那就请这样做,我会关闭这个。不过,以后我想我会在这里发布“核心”问题,因为那里没有太多关注。

标签: recursion vim scripting keymapping


【解决方案1】:

问题在于 Vim 中的屏幕重绘(参见 :h echo-redraw)。

echo 更改为echom 仍会产生相同的(损坏的)屏幕输出(3 0 2 0 1 0 0 0),但:mess 揭示了隐藏的内容:3 3 0 0 2 2 0 0 1 1 0 0 0 0

【讨论】:

  • :mess 触发的最后一个输出确实是original question 的评论者所期望的输出。
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2010-09-22
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多