注意:提供的解决方案适用于 Ubuntu (14.04) + Sublime Text 2/3
我最终得到了一个非常棘手的技巧,但我对此感到非常高兴。 IntelliJ Idea 在两种情况下更新资源(如果在设置中启用):
- 当 IDE 窗口失去焦点时
- 在运行部分中按下按钮或使用快捷键Ctrl+F10
所以我从第一个案例开始为我的操作系统 (Ubuntu 14.04) 寻找一个实用程序,它可以聚焦 IntelliJ Idea 窗口并取消聚焦,以使其更新资源。我偶然发现了xdotool,它允许通过标题获取窗口的ID,并通过它的ID 聚焦窗口。我创建了一个简单的 .sh 脚本:
current_id="$(xdotool getactivewindow)" # get id of current window
idea_id="$(xdotool search --name 'IntelliJ IDEA')"
xdotool windowfocus "${idea_id}" # switch to idea
xdotool windowfocus "${current_id}" # switch to current window
windowfocus 只是聚焦窗口,这意味着如果窗口在背景或另一个工作区,你不会切换到它,你会留在原来的位置,但窗口只会获得焦点.但它不适用于 IntelliJ Idea,资源没有更新,似乎需要充分关注。
所以我尝试将windowfocus 替换为windowactivate - 它会在任何时候切换到窗口(即使它位于另一个工作区),因此它变得专注、活跃且可见。但是结合切换回原始进程,它会产生两个窗口之间的可见切换(就像您在窗口之间进行 Alt+Tab 时一样),这非常明显,但它确实起到了作用 -资源得到更新。
还有第二个选项 - 使用快捷方式。 xdotool 还可以选择通过 id 向窗口发送击键:
xdotool key --window "{$idea_id}" --clearmodifiers CTRL+F10
但它不起作用,即使与聚焦窗口结合使用,也会留下按下 Ctrl 键的后遗症。 xdotool 文档中有一个Sendevent Notes 部分,告诉 xdotool 生成的关键事件设置了一个特殊标志,因此接收该事件的应用程序可能分析它是否存在标志并忽略该事件,IntelliJ Idea 可能就是这种情况。
经过一番研究,我发现了另一个密钥发送工具 - xvkdb - 它的工作原理非常棒,因为我猜它使用了另一种发送/生成密钥事件的方式:
xvkbd -window "*IntelliJ IDEA*" -text "\C\[F10]"
单独运行时,此命令将焦点保持在 Intellij Idea 窗口上,我使用 xdotool 将焦点带回当前进程。这是脚本的最终版本:
current_id="$(xdotool getactivewindow)"
xvkbd -window "*IntelliJ IDEA*" -text "\C\[F10]"
xdotool windowfocus "${current_id}"
为了将它与我用作代码编辑器的 Sublime Text 3 集成,我安装了一个插件 SublimeOnSaveBuild,当您在 Sublime Text 中保存文件时,它可以运行自定义构建(终端命令或脚本) .这是一个简单的构建设置:
{
"shell_cmd": "/path/to/script/idea_update_resources.sh"
}
所以现在我在另一个工作区打开了一个 Intellij Idea,当我在 Sublime Text 中保存文件时,通过向 Intellij Idea 窗口发送快捷方式来更新资源.我可以说,使用此实现聚焦窗口的时间并不明显。因此,它比 Grunt 或 Gulp 任务要快得多,我会说即时,因为 IntelliJ Idea 会自行更新,并且如果 IntelliJ Idea 在更新资源时做了一些额外的操作,也可以安全使用。
感谢@BenJamin 提出的问题,希望对某人有所帮助。
更新:
使用此设置一段时间后,它无法按预期工作:如果 IntelliJ Idea 在另一个工作区上,或者它的界面被另一个窗口完全覆盖,xvkdb 的解决方案em> 不幸的是会失败并且不会执行资源更新。我切换回使用windowactivate。