两次连续相同的 echo 调用在 Vim 函数中有不同的输出

Two consecutive identical calls to echo have different output in Vim function

Original post on Vi and Vim Beta, which has had one interesting answer,不过目前关注的不多。很抱歉交叉张贴,我会要求原件是 closed/deleted.

给定 .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.

问题全在于 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 .