使用 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.
插件宿主负责完成启动,然后加载并激活所有已安装的插件。这主要有两个原因:
它使 Sublime 启动得更快(特别是如果你有一些安装了插件的包)因为它启动并让你在包仍在加载时开始工作
如果一个插件做了一些导致崩溃或挂起的事情,那么插件主机就会发生这种情况,而 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
);您希望将值微调到足够长以至于不会引起问题,但又要足够短以至于您不必等待太久。
我正在尝试将 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.
插件宿主负责完成启动,然后加载并激活所有已安装的插件。这主要有两个原因:
它使 Sublime 启动得更快(特别是如果你有一些安装了插件的包)因为它启动并让你在包仍在加载时开始工作
如果一个插件做了一些导致崩溃或挂起的事情,那么插件主机就会发生这种情况,而 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
);您希望将值微调到足够长以至于不会引起问题,但又要足够短以至于您不必等待太久。