使用 Sublime Text 作为 SVN 并排比较工具

Use Sublime Text as SVN side-by-side diff tool

我正在尝试将 Sublime Text (3.2.2) 用作 SVN diff 命令(我在 Scientific Linux 下)。我安装了 Sublimerge,如果我 select 两个文件,右键单击,select Sublimerge 和“比较所选文件”,并排视图正确打开。

现在,如果我按照 those instrcuctions 尝试打开相同的视图来比较在 SVN 工作副本中更改的文件。

我创建 diff.sh:

#!/bin/bash

/home/prog/sublime-text/sublime_text/sublime_text -n --wait   --command "sublimerge_diff_views {\"left_read_only\": true, \"right_read_only\": true}"

# Always return 0. There is no way to pass exit code from Sublimerge.
exit 0

当我 运行 svn diff --diff-cmd ./diff.sh myfile 打开 Sublime Text 时,两个文件在不同的选项卡中可见,并且没有差异操作。

我做错了什么? 有什么方法可以调试 Sublime Text 以查看当我通过“比较所选文件”菜单项进行比较时它 运行 的确切命令,然后找出我的 diff.sh 脚本可能有什么问题?

您 运行 遇到的问题在您上面发布的 Sublimerge 集成页面的页面下方有进一步概述,即:

ST3: running Sublimerge from command line (only when Sublime Text was not already running) only opens files without doing diff. Otherwise, when launching Sublimerge while ST is running, everything works fine.

  • This is caused by asynchronous plugins loader in ST3 and cannot be fixed from plugin level.

问题源于这样一个事实,即在 ST3 及更高版本中,插件在外部 plugin_host 中执行(相比之下,在 ST2 中,插件主机内置于核心中)。当 Sublime 启动时,它将插件主机作为单独的应用程序启动,然后重新加载会话信息以设置 window.

插件宿主负责完成启动,然后加载并激活所有已安装的插件。这主要有两个原因:

  1. 它使 Sublime 启动得更快(特别是如果你有一些安装了插件的包)因为它启动并让你在包仍在加载时开始工作

  2. 如果一个插件做了一些导致崩溃或挂起的事情,那么插件主机就会发生这种情况,而 Sublime 仍然 运行;这允许您保存您的工作并恢复,而在 ST2 中它会导致您丢失未保存的更改。

有一个名为 subl 的命令行助手(在 Linux 上只是一个直接执行 sublime_text 的 symlink/script,尽管它在其他平台上是不同的东西)可用于从命令行与 Sublime 交互。

当你执行 subl 时,它会将你要求它做的事情交给 Sublime 的 运行 实例,然后终止。如果 Sublime 尚未 运行,它会先启动 Sublime,然后再继续。

在 Sublime 还没有 运行 的情况下,这是你在这里所做的事情的一个问题,因为 subl 立即将 command 交付给 Sublime,但是如果plugin host还没有启动完毕,core收到命令,但是因为host还没有准备好而无法执行,所以忽略了。

要解决此问题,您需要执行以下两项操作之一:

  • 确保 Sublime 已经 运行
  • 修改 shell 脚本,使其检查 sublime_text 当前是否为 运行;如果是,您可以继续。如果没有,则需要先启动Sublime,然后等待它完成后再启动命令。

一个例子如下:

#!/bin/bash

# Set up where Sublime is (this could also be on the PATH)
SUBL=/home/prog/sublime-text/sublime_text/sublime_text 

# If Sublime is not running, start it and wait for plugins to load
pgrep -x sublime_text > /dev/null
if [ $? -ne 0 ]; then
    $SUBL
    sleep 2
fi

# Perform the diff
$SUBL -n --wait   --command "sublimerge_diff_views {\"left_read_only\": true, \"right_read_only\": true}"

# Always return 0. There is no way to pass exit code from Sublimerge.
exit 0

这里我们检查 sublime_text 是否为 运行,如果不是,我们暂停并延迟 2 秒再继续。您想为自己的特定设置调整 2 秒。

要做到这一点,请不要使用 Sublime 运行 启动它,然后使用 View > Show Console 在控制台中检查;直到您看到 plugins loaded 文本出现在控制台中,插件才被完全加载和激活。如果您安装了很多外部包,那可能需要一些时间。在速度更快的机器上或外部包更少的情况下,它可能会更短。

sleep以秒为单位给出,但可以是小数(如0.5);您希望将值微调到足够长以至于不会引起问题,但又要足够短以至于您不必等待太久。