mirror of
https://github.com/sstent/sublime-text-3.git
synced 2026-01-25 14:41:38 +00:00
67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
from __future__ import absolute_import, unicode_literals, print_function, division
|
|
|
|
import os
|
|
import os.path
|
|
import sys
|
|
import json
|
|
import sublime
|
|
import sublime_plugin
|
|
|
|
SUBLIMEREPL_DIR = None
|
|
SUBLIMEREPL_USER_DIR = None
|
|
|
|
def plugin_loaded():
|
|
global SUBLIMEREPL_DIR
|
|
global SUBLIMEREPL_USER_DIR
|
|
SUBLIMEREPL_DIR = "Packages/SublimeREPL"
|
|
SUBLIMEREPL_USER_DIR = os.path.join(sublime.packages_path(), "User", "SublimeREPL")
|
|
|
|
PY2 = False
|
|
if sys.version_info[0] == 2:
|
|
SUBLIMEREPL_DIR = os.getcwdu()
|
|
SUBLIMEREPL_USER_DIR = os.path.join(sublime.packages_path(), "User", "SublimeREPL")
|
|
PY2 = True
|
|
|
|
# yes, CommandCommmand :)
|
|
class RunExistingWindowCommandCommand(sublime_plugin.WindowCommand):
|
|
def run(self, id, file):
|
|
"""Find and run existing command with id in specified file.
|
|
SUBLIMEREPL_USER_DIR is consulted first, and then SUBLIMEREPL_DIR"""
|
|
for prefix in (SUBLIMEREPL_USER_DIR, SUBLIMEREPL_DIR):
|
|
path = os.path.join(prefix, file)
|
|
json_cmd = self._find_cmd(id, path)
|
|
if json_cmd:
|
|
break
|
|
if not json_cmd:
|
|
return
|
|
args = json_cmd["args"] if "args" in json_cmd else None
|
|
self.window.run_command(json_cmd["command"], args)
|
|
|
|
def _find_cmd(self, id, file):
|
|
return self._find_cmd_in_file(id, file)
|
|
|
|
def _find_cmd_in_file(self, id, file):
|
|
try:
|
|
if PY2 or os.path.isfile(file):
|
|
with open(file) as f:
|
|
bytes = f.read()
|
|
else:
|
|
bytes = sublime.load_resource(file)
|
|
except (IOError, ValueError):
|
|
return None
|
|
else:
|
|
data = json.loads(bytes)
|
|
return self._find_cmd_in_json(id, data)
|
|
|
|
def _find_cmd_in_json(self, id, json_object):
|
|
if isinstance(json_object, list):
|
|
for elem in json_object:
|
|
cmd = self._find_cmd_in_json(id, elem)
|
|
if cmd:
|
|
return cmd
|
|
elif isinstance(json_object, dict):
|
|
if "id" in json_object and json_object["id"] == id:
|
|
return json_object
|
|
elif "children" in json_object:
|
|
return self._find_cmd_in_json(id, json_object["children"])
|
|
return None |