From cff88988e2e483633d4b38ef831564d3f854d0e4 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Mon, 23 Jan 2023 12:33:13 +0100 Subject: [PATCH] Update the vcvarsall situation, build before debugging, update readme --- README.md | 9 ++- Remedy.sublime-settings | 12 ++++ remedy.py | 70 +++++++++++++++++------- other/setup_vsvars.py => setup_vsvars.py | 7 +++ 4 files changed, 73 insertions(+), 25 deletions(-) create mode 100644 Remedy.sublime-settings rename other/setup_vsvars.py => setup_vsvars.py (95%) diff --git a/README.md b/README.md index 69be48c..8d337ba 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,8 @@ Launch Sublime (maybe you will need Package Control + and call Package Control: Optional: -* add remedy_executable to your settings if remedybg is not on your path or has different name. +* Add remedy_executable to your settings if remedybg is not on your path or has different name. +* Setup vcvarsall, Look at vcvarsall section in readme. ### Remedy build system @@ -57,11 +58,9 @@ you will need to add a field called ```remedy_build_system```, here is an exampl ``` ### Setting up Microsoft compiler enviroment with vcvarsall.bat -If you are developing using remedybg it seems pretty obvious that you would want access to the Microsoft compiler so additionally the package is shipping with the ```setup_vsvars.py```. You can find it in the ```other``` folder. It sets up the vcvarsall paths for you, it was created by one of the sublime developers, I found it on Stack Overflow. You need to: - -* Copy it into your User folder ```copy "%appdata%\Sublime Text\Packages\Sublime_RemedyBG\other\setup_vsvars.py" "%appdata%\Sublime Text\Packages\User\setup_vsvars.py"``` -* Add to your sublime settings the path to vcvarsall, like this: +If you are developing using remedybg it seems pretty obvious that you would want access to the Microsoft compiler so additionally the package is shipping with the ```setup_vsvars.py```. You need to update the path to your vcvarsall inside ```Remedy.sublime-settings``` or your global ```Preferences.sublime-settings```. THIS ONLY WORKS FOR REMEDY_BUILD!!! If you want to setup vcvarsall for the builtin ```build``` command, copy setup_vsvars.py to your ```User``` folder. You will have 2 copies one in remedy folder and the other in user folder. You need 2 copies because it seems that sublime heavily sandboxes packages from eachother so this package cannot influence the global enviroment. If anyone has any ideas how to make it global I would be happy to hear them. +Update these settings: (you can put them into global settings ```Preferences.sublime-settings``` or ```Remedy.sublime-settings```) ``` "vc_vars_cmd": "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat", "vc_vars_arch": "amd64", diff --git a/Remedy.sublime-settings b/Remedy.sublime-settings new file mode 100644 index 0000000..dc143b8 --- /dev/null +++ b/Remedy.sublime-settings @@ -0,0 +1,12 @@ +{ + // NOTE to build_before_debugging + // You need a project and a build system inside that project if you want build_before_debugging, + // Sublime API doesnt allow for querying of the selected build system, I need to essentially emulate that process. + // Look here to figure out the project format: https://www.sublimetext.com/docs/projects.html + // Additionally you need a field called "remedy_build_system" to signal which + // build system was chosen if you have more then 1 build system. + "build_before_debugging": true, + "executable": "remedybg.exe", + "vc_vars_cmd": "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/Build/vcvarsall.bat", + "vc_vars_arch": "amd64", +} \ No newline at end of file diff --git a/remedy.py b/remedy.py index 3066678..369eff7 100644 --- a/remedy.py +++ b/remedy.py @@ -8,6 +8,7 @@ import os, io, ctypes import sublime import sublime_plugin + from Default.exec import ExecCommand import win32pipe, win32file, pywintypes @@ -59,7 +60,6 @@ class RemedyInstance: elif cmd == COMMAND_GET_TARGET_STATE: pass elif cmd == COMMAND_ADD_WATCH: - print(cmd_args) expr = cmd_args['expr'] cmd_buffer.write(ctypes.c_uint8(1)) # watch window 1 cmd_buffer.write(ctypes.c_uint16(len(expr))) @@ -267,8 +267,8 @@ remedy_instance = RemedyInstance() def get_remedy_executable(): window = sublime.active_window() - settings = window.settings() - result = settings.get("remedy_executable", "remedybg") + settings = sublime.load_settings("Remedy.sublime-settings") + result = settings.get("executable", "remedybg") return result def execute_process(view, cmd, offset = 1): @@ -280,27 +280,39 @@ def execute_process(view, cmd, offset = 1): print(cmd) subprocess.Popen(cmd) +def get_build_system(window): + project = window.project_data() + build = None + if project: + bs = project.get("build_systems") + rbs = project.get("remedy_build_system") + if bs: + if len(bs) == 1: + build = bs[0] + elif rbs: + for i in bs: + if rbs == i["name"]: + build = i + break + return project, build + +def should_build_before_debugging(window): + settings = sublime.load_settings("Remedy.sublime-settings") + build_before = settings.get("build_before_debugging", False) + if build_before: + project, build = get_build_system(window) + if project == None or build == None: + build_before = False + + return build_before + class RemedyBuildCommand(ExecCommand): def run(self, **kwargs): self.command = kwargs.get("command") if self.command == None: sublime.message_dialog("RemedyBG: remedy_build expects a command, one of [run_to_cursor, start_debugging, goto_cursor]\n\nexample :: \"args\":{\"command\": \"run_to_cursor\"}") - project = self.window.project_data() - build = None - if project: - bs = project.get("build_systems") - rbs = project.get("remedy_build_system") - if bs: - if len(bs) == 1: - build = bs[0] - elif rbs: - for i in bs: - if rbs == i["name"]: - build = i - break - - + project, build = get_build_system(self.window) if project == None or build == None: sublime.error_message(""" RemedyBG: You need a project and a build system inside that project to call this function, @@ -329,6 +341,17 @@ class RemedyBuildCommand(ExecCommand): "word_wrap": build.get("word_wrap", True), "syntax": build.get("syntax", "Packages/Text/Plain text.tmLanguage"), } + + variables = self.window.extract_variables() + for key in ["cmd", "shell_cmd", "file_regex", "line_regex", "working_dir"]: + if kwargs.get(key) != None: + kwargs[key] = sublime.expand_variables(kwargs[key], variables) + + print(os.environ) + for key in os.environ.keys(): + if key not in kwargs["env"]: + kwargs["env"][key] = os.environ[key] + super().run(**kwargs) def on_finished(self, proc): super().on_finished(proc) @@ -351,7 +374,10 @@ class RemedyStartDebuggingCommand(sublime_plugin.WindowCommand): state = remedy_instance.send_command(COMMAND_GET_TARGET_STATE) if state == TARGETSTATE_NONE: - remedy_instance.send_command(COMMAND_START_DEBUGGING) + if should_build_before_debugging(self.window): + self.window.run_command("remedy_build", {"command": "start_debugging"}) + else: + remedy_instance.send_command(COMMAND_START_DEBUGGING) elif state == TARGETSTATE_SUSPENDED: remedy_instance.send_command(COMMAND_CONTINUE_EXECUTION) @@ -369,7 +395,11 @@ class RemedyRestartDebuggingCommand(sublime_plugin.WindowCommand): class RemedyRunToCursorCommand(sublime_plugin.TextCommand): def run(self, edit): if remedy_instance.try_launching(): return - remedy_instance.run_to_cursor() + window = sublime.active_window() + if should_build_before_debugging(sublime.active_window()): + window.run_command("remedy_build", {"command": "run_to_cursor"}) + else: + remedy_instance.run_to_cursor() class RemedyGotoCursorCommand(sublime_plugin.TextCommand): def run(self, edit): diff --git a/other/setup_vsvars.py b/setup_vsvars.py similarity index 95% rename from other/setup_vsvars.py rename to setup_vsvars.py index 5cbf534..9fe513c 100644 --- a/other/setup_vsvars.py +++ b/setup_vsvars.py @@ -49,6 +49,13 @@ def _get_vc_env(): vars_cmd = settings.get("vc_vars_cmd") vars_arch = settings.get("vc_vars_arch", "amd64") + if vars_cmd is None: + settings = sublime.load_settings("Remedy.sublime-settings") + if 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")