2012-03-20 48 views
1

我想改变其被示出而VIM是忙于执行外部命令的VIM状态线。 我有一个vim脚本,管道从VIM文本行到使用一些外部程序“!”。在执行之后,vim等待命令的输出以用它替换这些行。在等待时,我想在状态行中显示外部命令的状态。 这可能吗?变化VIM状态线在执行命令

回答

1

我将使用临时全局变量解决这个问题。这里是返回的,如果它存在的变量g:temp_var值的简单功能,否则它返回一个空字符串:

function! TemporaryStatus() 
    if exists("g:temp_var") 
     return g:temp_var 
    else 
     return "" 
    endif 
endfunction 

您可以设置状态行使用此功能的这样的返回值:

set statusline=%!TemporaryStatus() 

然后,当你调用慢外部命令,只需设置临时变量事先(使用要显示的信息),并unlet它之后。例如:

... 
let g:temp_var = "I am calling a slow external command" 
redraw! 
call SlowExternalCommand() 
unlet g:temp_var 
redraw! 
... 

注意,redraw!命令是必要的,以确保Vim的更新显示(因此使用的g:temp_var更新值在状态)。

编辑

当然,这将是简单得多呼应它,之后清除显示,这样的显示消息:

... 
redraw! 
echo "I am calling a slow external command" 
call SlowExternalCommand() 
redraw! 
... 

这样将在显示的消息Vim命令行,而不是在状态行中。你不需要任何上面定义的函数。

+0

我明白了。但我需要的是一个更新的状态行。例如。它应该显示缓慢外部命令的进度:5%10%15%(注意进度信息​​本身是由外部命令产生的,可以写入vim可以读取的管道或文件)。但关键问题是状态行是否允许在执行外部命令时进行更新。 – highsciguy 2012-03-20 16:30:20

+0

你不能用'!'来做这个,恐怕。 '!'在系统调用期间暂停Vim。您可以尝试使用'!start'(请参阅':help:!start'),它声称不会暂停Vim - 但我从来没有使用它。如果有效,那么可以在命令运行时更新'g:temp_var'。 – 2012-03-20 16:37:02

+0

但这可能意味着我不能在文件中插入命令的输出,我可以吗? – highsciguy 2012-03-20 21:34:51