如何在启用Visual Studio环境的情况下运行SublimeText

概述

现在我的Windows任务栏上有这2个程序:

  • SublimeText3目标:

    "D:\software\SublimeText 3_x64\sublime_text.exe" 
  • VS2015 x64本地工具命令提示符目标:

     %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64 

这里的目标是在启用vs2015环境下运行Sublime Text。

  1. 一个选项是打开vs命令提示符,然后从那里运行崇高的文本, > sublime_text (这是不好的,我希望它是一个非交互式的过程
  2. 另一个select是修改某种sublimetext符号链接目标从任务栏,所以我可以打开崇高vs2015环境启用只需点击图标

我怎样才能实现选项2?

NS:我想让Sublime Text 3在启动时只运行一次 vcvarsall.bat(不是在构build系统的时候)

ATTEMPTS

我第一次尝试了解如何执行bat文件,所以我testing了一些基本的batch file:

  • bat1.bat:成功打开崇高的文本

     sublime_text 
  • bat2.bat:它会成功打开vs命令提示符,等待用户input命令

     cmd /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64 
  • bat3.bat:打开vs命令提示符,但不会打开ST,除非在显示命令提示符后键入exit

     %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64 sublime_text 
  • bat4.bat:打开vs命令提示符,但不打开ST,与bat3.bat相同

     %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64 && sublime_text 
  • bat5.bat:打开vs命令提示符,但不打开ST,与bat {4,3} .bat相同

     %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64 & sublime_text 

经过这些尝试,我已经决定阅读一些文档,试图find关于cmd的一些提示,但没有任何区别。

另一个想法是使用conemu定制任务,如:

 {vs2015}: cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64 & sublime_text 

然后有一个bat文件调用conemu像这样:

 D:\software\ConEmuPack.151205\ConEmu64.exe /single -cmd {vs2015} 

结果是+/-我想要的,但是会产生2个terminal和一个新的崇高会话。 我正在寻找的只是打开一个适当的环境SublimeText会议,所以我认为这不是一个好的解决scheme,此外,它需要安装conemu。

所有这些尝试后,我想也许使用python打开命令提示符,键入&运行“神奇”一些命令可能会有所帮助,但我不知道该怎么做。

结论:直到问题仍然没有解决的date…

Solutions Collecting From Web of "如何在启用Visual Studio环境的情况下运行SublimeText"

除了问题和上一个答案中已经提到的方法之外,另一种方法类似于@LinuxDisciple在他们的答案中提到的东西。 在Sublime启动时,Sublime会在内部激活批处理文件,以便执行您所需要的操作。

下面的插件就是一个例子。 首先,将以下设置添加到您的用户首选项( Preferences > SettingsPreferences > Settings - User )。 在这里,我使用我自己的本地机器的设置; 更新适合您的Visual Studio版本的路径:

 "vc_vars_cmd": "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat", "vc_vars_arch": "amd64", 

下面的插件需要vc_vars_cmd设置,但是vc_vars_arch设置是可选的; 如果没有给出,则默认为amd64

接下来,从菜单中选择Tools > Developer > New Plugin ,并用下面的代码替换存根插件代码,并将其保存在Sublime默认的默认位置,如set_vc_vars.py

 import sublime import sublime_plugin from threading import Thread from subprocess import Popen, PIPE from os import environ SENTINEL="SUBL_VC_VARS" def _get_vc_env(): """ Run the batch file specified in the vc_vars_cmd setting (with an optional architecture type) and return back a dictionary of the environment that the batch file sets up. Returns None if the preference is missing or the batch file fails. """ settings = sublime.load_settings("Preferences.sublime-settings") vars_cmd = settings.get("vc_vars_cmd") vars_arch = settings.get("vc_vars_arch", "amd64") if vars_cmd is None: print("set_vc_vars: Cannot set Visual Studio Environment") print("set_vc_vars: Add 'vc_vars_cmd' setting to settings and restart") return None try: # Run the batch, outputting a sentinel value so we can separate out # any error messages the batch might generate. shell_cmd = "\"{0}\" {1} && echo {2} && set".format( vars_cmd, vars_arch, SENTINEL) output = Popen(shell_cmd, stdout=PIPE, shell=True).stdout.read() lines = [line.strip() for line in output.decode("utf-8").splitlines()] env_lines = lines[lines.index(SENTINEL) + 1:] except: return None # Convert from var=value to dictionary key/value pairs. We upper case the # keys, since Python does that to the mapping it stores in environ. env = {} for env_var in env_lines: parts = env_var.split("=", maxsplit=1) env[parts[0].upper()] = parts[1] return env def install_vc_env(): """ Try to collect the appropriate Visual Studio environment variables and set them into the current environment. """ vc_env = _get_vc_env() if vc_env is None: print("set_vc_vars: Unable to fetch the Visual Studio Environment") return sublime.status_message("Error fetching VS Environment") # Add newly set environment variables for key in vc_env.keys(): if key not in environ: environ[key] = vc_env[key] # Update existing variables whose values changed. for key in environ: if key in vc_env and environ[key] != vc_env[key]: environ[key] = vc_env[key] # Set a sentinel variable so we know not to try setting up the path again. environ[SENTINEL] = "BOOTSTRAPPED" sublime.status_message("VS Environment enabled") def plugin_loaded(): if sublime.platform() != "windows": return sublime.status_message("VS is not supported on this platform") # To reload the environment if it changes, restart Sublime. if SENTINEL in environ: return sublime.status_message("VS Environment already enabled") # Update in the background so we don't block the UI Thread(target=install_vc_env).start() 

一旦你保存了插件,Sublime将加载它,并执行plugin_loaded函数,这将完成所有的工作。你应该看到状态栏说VS Environment Enabled如果它的工作。

如果您看到Error Fetching VS Environment请检查批处理文件的路径是否正确(请注意,您需要将所有路径分隔符加倍以使其符合JSON)。

这与Fix Mac Path软件包的操作非常类似(并且基于此),它类似于在MacOS上更新Sublime中的路径,其中操作系统变幻莫测导致GUI应用程序的环境设置方式不同于终端应用。

一般的想法是批处理文件在一个子进程中执行,然后在返回之前,我们也执行set命令让命令解释器将其整个环境转储到插件捕获的控制台。

一旦我们有了这些数据,我们可以很容易地将它与当前的环境进行比较,以添加批处理文件设置但尚未存在的任何环境变量,并更新任何已更改的环境变量的值(例如PATH )。

作为这个过程的一部分,我们还设置了一个新的环境变量,告诉插件已经设置了环境,所以如果插件重新加载,它不会尝试再次运行该操作。

因此,如果您需要将路径更改为批处理文件或您要设置的体系结构,则需要更改首选项并重新启动Sublime。

这可以通过在修改之前存储当前环境,然后观察首选项以确定该设置是否已更改并采取相应措施,从而实现更强大的功能,但大概不需要修改这些设置。

出于测试目的,我创建了以下简单的C程序:

 #include <stdio.h> int main(int argc, char const *argv[]) { printf("Hello VC World!\n"); return 0; } 

我还创建了以下的Sublime sublime-build文件,它基于松散地与Sublime一起提供的C++ Single File.sublime-build

 { "shell_cmd": "cl \"${file}\" /Fe\"${file_base_name}\"", "working_dir": "${file_path}", "selector": "source.c, source.c++", "variants": [ { "name": "Run", "shell_cmd": "cl \"${file}\" /Fe\"${file_base_name}\" && \"${file_base_name}\"" } ] } 

如果您尝试构建不带插件的示例C文件,则会生成一个关于无法找到cl的错误(除非您已经从开发人员提示开始Sublime或以其他方式设置了路径)。 使用插件后,您将得到类似于以下内容的输出:

示例C程序正在执行

  1. 完全如上所述是不可能的,但崇高的文本有运行其他程序的选项。

创建一个批处理文件,转到vcvarsall.bat所需的目录(它查看运行的目录,因此需要从适当的目录启动)并运行vcvarsall.bat:

 @ECHO OFF REM vcdir is the directory where you should be set vcdir="c:\program files (x86)\Microsoft Visual Studio 14.0\VC" REM go into that directory push "%vcdir%" REM Run vcvarsall.bat to set the env vars call vcvarsall.bat amd64 REM Get back to the directory we were in initially popd 

如果你可以在构建过程中运行这个批处理文件(如果你只需要它的构建过程,你不介意每次重新运行),然后按照这些说明将该批处理文件添加到你的构建设置的崇高文本3

一个更优雅的方法是找出如何让Sublime Text 3在启动时(而不是在编译时)运行一个程序。 我敢打赌,这是可能的,但我现在需要回去工作了…