【问题标题】:Vim display in statusline after delay延迟后状态行中的 Vim 显示
【发布时间】:2011-09-06 22:45:12
【问题描述】:

是否可以让 Vim 中的状态栏在给定事件之后某时更新?

如果是这样,如何做到这一点?

【问题讨论】:

  • 您能提供更多信息吗?比如您要解决的问题是什么?
  • 在我的 vimrc 中有一个实现功能的快捷方式。我想让脚本报告该功能已成功实现。但我不希望功能成功的报告无限期地停留在状态行上。
  • @Hermann:那么您希望状态栏何时恢复为默认设置?即,哪个事件?例如,当你写一个缓冲区时?
  • 我希望它在 3 秒后恢复到默认设置。所以这不是一个真正的事件。
  • 运气不好。 :timer 尚未实现(但在 todo list 上)。您要选择一个活动吗?

标签: vim delay statusline


【解决方案1】:

正如其他人已经指出的那样,目前无法对状态行使用定时更改。但是,如果您可以选择一个合适的事件,在该事件中状态恢复为默认值,那么您可能会很幸运。例如,如果您的工作流程是:

  1. Esc 进入正常模式并调用您的快捷方式
  2. 在状态行查看结果并返回插入模式继续工作

然后您可以在自动命令中使用InsertEnter 事件在正常模式下点击i 后将状态更改为默认值。

这是一个有趣的小例子,您可以根据自己的需要进行修改。

正常状态行:

"statusline
hi green term=bold cterm=bold ctermfg=107
hi red term=bold cterm=bold ctermfg=167
hi gray term=bold cterm=bold ctermfg=0
hi lblue term=bold cterm=bold ctermfg=12

function! Palpatine()
    let str='At last, the Jedi are no more' 
    return str
endfunction

function! Force()
    let str=',~`,~`,~`,~`,~`,~`,~`,~'
    return str
endfunction

function! DefaultStatus()
    let statusStr='%#red#Palpatine: %#gray#%{Palpatine()} %#lblue#%{Force()} %=%#green#Yoda'
    return statusStr
endfunction

set laststatus=2
set statusline=%!DefaultStatus()

函数调用的状态变化:

function! Yoda()
    let str='Not if anything to say about it, I have'
    return str
endfunction

function! MyStatus()
    let statusStr='%#red#Palpatine %=%#lblue#%{Force()} %#gray#%{Yoda()} %#green#:Yoda'
    return statusStr
endfunction

function! MyFunc()
    set statusline=%!MyStatus()
endfunction

noremap <C-m> :call MyFunc()<CR>

有了上面的定义,每按一次Ctrlm,statusline就变成上面那个了。

现在通过设置自动命令,我们可以在您进入插入模式时将其恢复为默认值。

autocmd InsertEnter * set statusline=%!DefaultStatus()

返回插入:

【讨论】:

  • 您只需在 vim 状态栏中重演《星球大战》即可获得 +1!但是在这个系列的所有台词中,你选择了西斯的复仇????
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2019-10-26
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多