有没有一个很好的方法从gvim启动程序而不会失去焦点?

时间:2013-01-21 09:10:10

标签: vim

Vim有一种执行程序的内置方式,即Windows的:!start foo和Unix的:!bar &。但是,我遇到的问题是他们从Vim那里抢走了焦点。我想推出我的版本和版本测试脚本,当它在其命令窗口中工作和显示输出时,永远不必手动切换回GVim。

我想到了3种可能的解决方案:

  • 使用Auto-It / AutoHotkey将焦点设置回Gvim。不幸的是,它只适用于Windows,而且很脆弱。
  • 让另一个进程观察我的源代码,并让该进程在sourecode更改时自动启动脚本。 (创建新窗口的另一个过程不会窃取焦点)。这有点花哨,因为你需要暂停编写文件,直到你想要启动脚本,如果你想重新测试,有时会写一个无用的更改,即使源中没有任何内容发生变化。
  • 使用客户端 - 服务器架构,其中Vim通过套接字或类似的东西发送命令。如果有任何现有的跨平台方式,这实际上是我的首选解决方案。 (我希望不会为此运行额外的GVim实例。)

那么这样做的好方法是什么?我试过AsyncCommander,但不幸的是它也抢走了焦点。

2 个答案:

答案 0 :(得分:3)

当我没有使用像sbt这样的好的构建系统来监视源代码并为我重新构建/重新测试时,我倾向于想出这样的黑客:

 :map <F9> :!touch and-go<CR><CR>

此处点击F9更新文件。选择您喜欢的任何键绑定。 (当然,对于vim的插入模式,你也可以对imap做同样的事情。)

然后所有人都需要一个shell脚本来监视这个文件并执行 用于构建/测试项目的命令。在unix上,我只是这样做:

 while stat -c "%Y" and-go; do sleep 1; done | 
 stdbuf -i0 -o0 uniq -c | 
 while read l; do 
    echo build...;  # Your build/test execution commands here.
 done

在一个单独的窗口中运行它会很整洁,因为你的vim / gvim窗口将始终保持它的焦点,而你只是继续点击F9(或其他)并浏览另一个窗口以查看你的构建方式去了。

如果您要编写Windows批处理脚本(或者PowerShell,我不知道)的版本,那么您应该很高兴。

答案 1 :(得分:1)

我认为这应该有效:

:silent! !cmd /c start /b dir

此外,start.exe可以选择启动最小化而不是使用共享/后台控制台。

当然,dir将被替换:)