动象论坛

 找回密码
 立即注册

搜索
查看: 46 | 回复: 6

Sublime_plugin源代码免费分享!

[复制链接]

该用户从未签到

55

主题

267

帖子

687

积分

清正廉明~版主

致敬·Mozilla Firefox

Rank: 16Rank: 16Rank: 16Rank: 16

积分
687

论坛官方最佳新人活跃会员

发表于 2020-5-3 15:31:35 | 显示全部楼层 |阅读模式
本帖最后由 Mozilla 于 2020-5-3 16:02 编辑

sublime_text3组件Sublime_plugin源代码免费分享!请不要翻译此页!
  1. import imp
  2. import importlib
  3. import os
  4. import sys
  5. import threading
  6. import time
  7. import traceback
  8. import zipfile

  9. import sublime
  10. import sublime_api


  11. api_ready = False

  12. application_command_classes = []
  13. window_command_classes = []
  14. text_command_classes = []

  15. view_event_listener_classes = []
  16. view_event_listeners = {}

  17. all_command_classes = [
  18.     application_command_classes,
  19.     window_command_classes,
  20.     text_command_classes]

  21. all_callbacks = {
  22.     'on_new': [],
  23.     'on_clone': [],
  24.     'on_load': [],
  25.     'on_pre_close': [],
  26.     'on_close': [],
  27.     'on_pre_save': [],
  28.     'on_post_save': [],
  29.     'on_modified': [],
  30.     'on_selection_modified': [],
  31.     'on_activated': [],
  32.     'on_deactivated': [],
  33.     'on_query_context': [],
  34.     'on_query_completions': [],
  35.     'on_hover': [],
  36.     'on_text_command': [],
  37.     'on_window_command': [],
  38.     'on_post_text_command': [],
  39.     'on_post_window_command': [],
  40.     'on_modified_async': [],
  41.     'on_selection_modified_async': [],
  42.     'on_pre_save_async': [],
  43.     'on_post_save_async': [],
  44.     'on_activated_async': [],
  45.     'on_deactivated_async': [],
  46.     'on_new_async': [],
  47.     'on_load_async': [],
  48.     'on_clone_async': []}

  49. pending_on_activated_async_lock = threading.Lock()

  50. pending_on_activated_async_callbacks = {
  51.     'EventListener': [],
  52.     'ViewEventListener': []}

  53. profile = {}


  54. def unload_module(module):
  55.     if "plugin_unloaded" in module.__dict__:
  56.         module.plugin_unloaded()
  57.     # Check unload_handler too, for backwards compat
  58.     if "unload_handler" in module.__dict__:
  59.         module.unload_handler()

  60.     # Unload the old plugins
  61.     if "__plugins__" in module.__dict__:
  62.         for view_id, listener_instances in view_event_listeners.items():
  63.             for vel in listener_instances[:]:
  64.                 if vel.__class__ in module.__plugins__:
  65.                     listener_instances.remove(vel)

  66.         for p in module.__plugins__:
  67.             for cmd_cls_list in all_command_classes:
  68.                 try:
  69.                     cmd_cls_list.remove(p)
  70.                 except ValueError:
  71.                     pass
  72.             for c in all_callbacks.values():
  73.                 try:
  74.                     c.remove(p)
  75.                 except ValueError:
  76.                     pass

  77.             try:
  78.                 view_event_listener_classes.remove(p)
  79.             except ValueError:
  80.                 pass


  81. def unload_plugin(modulename):
  82.     print("unloading plugin", modulename)

  83.     was_loaded = modulename in sys.modules
  84.     if was_loaded:
  85.         m = sys.modules[modulename]
  86.         unload_module(m)
  87.         del sys.modules[modulename]


  88. def reload_plugin(modulename):
  89.     print("reloading plugin", modulename)

  90.     if modulename in sys.modules:
  91.         m = sys.modules[modulename]
  92.         unload_module(m)
  93.         m = imp.reload(m)
  94.     else:
  95.         m = importlib.import_module(modulename)

  96.     module_plugins = []
  97.     on_activated_targets = []
  98.     vel_on_activated_classes = []
  99.     el_on_activated_async_targets = []
  100.     vel_on_activated_async_targets = []
  101.     module_view_event_listener_classes = []
  102.     for type_name in dir(m):
  103.         try:
  104.             t = m.__dict__[type_name]
  105.             if t.__bases__:
  106.                 is_plugin = False
  107.                 if issubclass(t, ApplicationCommand):
  108.                     application_command_classes.append(t)
  109.                     is_plugin = True
  110.                 if issubclass(t, WindowCommand):
  111.                     window_command_classes.append(t)
  112.                     is_plugin = True
  113.                 if issubclass(t, TextCommand):
  114.                     text_command_classes.append(t)
  115.                     is_plugin = True

  116.                 if is_plugin:
  117.                     module_plugins.append(t)

  118.                 if issubclass(t, EventListener):
  119.                     obj = t()
  120.                     for p in all_callbacks.items():
  121.                         if p[0] in dir(obj):
  122.                             p[1].append(obj)

  123.                     if "on_activated" in dir(obj):
  124.                         on_activated_targets.append(obj)

  125.                     if "on_activated_async" in dir(obj):
  126.                         el_on_activated_async_targets.append(obj)

  127.                     module_plugins.append(obj)

  128.                 if issubclass(t, ViewEventListener):
  129.                     view_event_listener_classes.append(t)
  130.                     module_view_event_listener_classes.append(t)
  131.                     if "on_activated" in dir(t):
  132.                         vel_on_activated_classes.append(t)
  133.                     if "on_activated_async" in dir(t):
  134.                         vel_on_activated_async_targets.append(t)
  135.                     module_plugins.append(t)

  136.         except AttributeError:
  137.             pass

  138.     if el_on_activated_async_targets or vel_on_activated_async_targets:
  139.         with pending_on_activated_async_lock:
  140.             pending_on_activated_async_callbacks['EventListener'].extend(
  141.                 el_on_activated_async_targets
  142.             )
  143.             pending_on_activated_async_callbacks['ViewEventListener'].extend(
  144.                 vel_on_activated_async_targets
  145.             )

  146.     if len(module_plugins) > 0:
  147.         m.__plugins__ = module_plugins

  148.     if api_ready:
  149.         if "plugin_loaded" in m.__dict__:
  150.             try:
  151.                 m.plugin_loaded()
  152.             except:
  153.                 traceback.print_exc()

  154.         # Create any require ViewEventListener objects
  155.         if len(module_view_event_listener_classes) > 0:
  156.             for w in sublime.windows():
  157.                 for v in w.views():
  158.                     create_view_event_listeners(
  159.                         module_view_event_listener_classes, v)

  160.         # Synthesize any required on_activated calls
  161.         w = sublime.active_window()
  162.         if w:
  163.             v = w.active_view()
  164.             if v:
  165.                 for el in on_activated_targets:
  166.                     try:
  167.                         el.on_activated(v)
  168.                     except:
  169.                         traceback.print_exc()

  170.                 for vel_cls in vel_on_activated_classes:
  171.                     vel = find_view_event_listener(v, vel_cls)
  172.                     if not vel:
  173.                         continue
  174.                     try:
  175.                         vel.on_activated()
  176.                     except:
  177.                         traceback.print_exc()


  178. def synthesize_on_activated_async():
  179.     if not api_ready:
  180.         return

  181.     with pending_on_activated_async_lock:
  182.         els = pending_on_activated_async_callbacks['EventListener']
  183.         vels = pending_on_activated_async_callbacks['ViewEventListener']
  184.         pending_on_activated_async_callbacks['EventListener'] = []
  185.         pending_on_activated_async_callbacks['ViewEventListener'] = []

  186.     for el in els:
  187.         w = sublime.active_window()
  188.         if not w:
  189.             continue
  190.         v = w.active_view()
  191.         if not v:
  192.             continue
  193.         try:
  194.             el.on_activated_async(v)
  195.         except:
  196.             traceback.print_exc()

  197.     for vel_cls in vels:
  198.         w = sublime.active_window()
  199.         if not w:
  200.             continue
  201.         v = w.active_view()
  202.         if not v:
  203.             continue
  204.         vel = find_view_event_listener(v, vel_cls)
  205.         if not vel:
  206.             continue
  207.         try:
  208.             vel.on_activated_async()
  209.         except:
  210.             traceback.print_exc()


  211. def create_application_commands():
  212.     cmds = []
  213.     for class_ in application_command_classes:
  214.         cmds.append(class_())
  215.     sublime_api.notify_application_commands(cmds)


  216. def create_window_commands(window_id):
  217.     window = sublime.Window(window_id)
  218.     cmds = []
  219.     for class_ in window_command_classes:
  220.         cmds.append(class_(window))
  221.     return cmds


  222. def create_text_commands(view_id):
  223.     view = sublime.View(view_id)
  224.     cmds = []
  225.     for class_ in text_command_classes:
  226.         cmds.append(class_(view))
  227.     return cmds


  228. def on_api_ready():
  229.     global api_ready
  230.     api_ready = True

  231.     for m in list(sys.modules.values()):
  232.         if "plugin_loaded" in m.__dict__:
  233.             try:
  234.                 m.plugin_loaded()
  235.             except:
  236.                 traceback.print_exc()

  237.     # Create ViewEventListener instances
  238.     if len(view_event_listener_classes) > 0:
  239.         for w in sublime.windows():
  240.             for v in w.views():
  241.                 attach_view(v)

  242.     # Synthesize an on_activated call
  243.     w = sublime.active_window()
  244.     if w:
  245.         view_id = sublime_api.window_active_view(w.window_id)
  246.         if view_id != 0:
  247.             try:
  248.                 on_activated(view_id)
  249.             except:
  250.                 traceback.print_exc()


  251. def is_view_event_listener_applicable(cls, view):
  252.     if not cls.is_applicable(view.settings()):
  253.         return False

  254.     if cls.applies_to_primary_view_only() and not view.is_primary():
  255.         return False

  256.     return True


  257. def create_view_event_listeners(classes, view):
  258.     if len(classes) > 0:
  259.         if view.view_id not in view_event_listeners:
  260.             view_event_listeners[view.view_id] = []

  261.         for c in classes:
  262.             if is_view_event_listener_applicable(c, view):
  263.                 view_event_listeners[view.view_id].append(c(view))


  264. def check_view_event_listeners(view):
  265.     if len(view_event_listener_classes) > 0:
  266.         if view.view_id not in view_event_listeners:
  267.             view_event_listeners[view.view_id] = []

  268.         listeners = view_event_listeners[view.view_id]

  269.         for cls in view_event_listener_classes:
  270.             found = False
  271.             instance = None
  272.             for l in listeners:
  273.                 if l.__class__ == cls:
  274.                     found = True
  275.                     instance = l
  276.                     break

  277.             want = is_view_event_listener_applicable(cls, view)

  278.             if want and not found:
  279.                 listeners.append(cls(view))
  280.             elif found and not want:
  281.                 listeners.remove(instance)


  282. def attach_view(view):
  283.     check_view_event_listeners(view)

  284.     view.settings().add_on_change(
  285.         "check_view_event_listeners",
  286.         lambda: check_view_event_listeners(view))


  287. check_all_view_event_listeners_scheduled = False


  288. def check_all_view_event_listeners():
  289.     global check_all_view_event_listeners_scheduled
  290.     check_all_view_event_listeners_scheduled = False
  291.     for w in sublime.windows():
  292.         for v in w.views():
  293.             check_view_event_listeners(v)


  294. def detach_view(view):
  295.     if view.view_id in view_event_listeners:
  296.         del view_event_listeners[view.view_id]

  297.     # A view has closed, which implies 'is_primary' may have changed, so see if
  298.     # any of the ViewEventListener classes need to be created.
  299.     # Call this in a timeout, as 'view' will still be reporting itself as a
  300.     # primary at this stage
  301.     global check_all_view_event_listeners_scheduled
  302.     if not check_all_view_event_listeners_scheduled:
  303.         check_all_view_event_listeners_scheduled = True
  304.         sublime.set_timeout(check_all_view_event_listeners)


  305. def event_listeners_for_view(view):
  306.     if view.view_id in view_event_listeners:
  307.         return view_event_listeners[view.view_id]
  308.     else:
  309.         return []


  310. def find_view_event_listener(view, cls):
  311.     if view.view_id in view_event_listeners:
  312.         for vel in view_event_listeners[view.view_id]:
  313.             if vel.__class__ == cls:
  314.                 return vel
  315.     return None


  316. def on_new(view_id):
  317.     v = sublime.View(view_id)

  318.     attach_view(v)

  319.     for callback in all_callbacks['on_new']:
  320.         try:
  321.             callback.on_new(v)
  322.         except:
  323.             traceback.print_exc()


  324. def on_new_async(view_id):
  325.     v = sublime.View(view_id)
  326.     for callback in all_callbacks['on_new_async']:
  327.         try:
  328.             callback.on_new_async(v)
  329.         except:
  330.             traceback.print_exc()


  331. def on_clone(view_id):
  332.     v = sublime.View(view_id)

  333.     attach_view(v)

  334.     for callback in all_callbacks['on_clone']:
  335.         try:
  336.             callback.on_clone(v)
  337.         except:
  338.             traceback.print_exc()


  339. def on_clone_async(view_id):
  340.     v = sublime.View(view_id)
  341.     for callback in all_callbacks['on_clone_async']:
  342.         try:
  343.             callback.on_clone_async(v)
  344.         except:
  345.             traceback.print_exc()


  346. class Summary(object):
  347.     def __init__(self):
  348.         self.max = 0.0
  349.         self.sum = 0.0
  350.         self.count = 0

  351.     def record(self, x):
  352.         self.count += 1
  353.         self.sum += x
  354.         self.max = max(self.max, x)

  355.     def __str__(self):
  356.         if self.count > 1:
  357.             return "{0:.3f}s total, mean: {1:.3f}s, max: {2:.3f}s".format(self.sum, self.sum / self.count, self.max)
  358.         elif self.count == 1:
  359.             return "{0:.3f}s total".format(self.sum)
  360.         else:
  361.             return "0s total"


  362. def run_callback(event, callback, expr):
  363.     t0 = time.time()

  364.     try:
  365.         expr()
  366.     except:
  367.         traceback.print_exc()

  368.     elapsed = time.time() - t0

  369.     if event not in profile:
  370.         profile[event] = {}

  371.     p = profile[event]

  372.     name = callback.__module__
  373.     if name not in p:
  374.         p[name] = Summary()

  375.     p[name].record(elapsed)


  376. def run_view_listener_callback(view, name):
  377.     for vel in event_listeners_for_view(view):
  378.         if name in vel.__class__.__dict__:
  379.             run_callback(name, vel, lambda: vel.__class__.__dict__[name](vel))


  380. def run_async_view_listener_callback(view, name):
  381.     for vel in event_listeners_for_view(view):
  382.         if name in vel.__class__.__dict__:
  383.             try:
  384.                 vel.__class__.__dict__[name](vel)
  385.             except:
  386.                 traceback.print_exc()


  387. def on_load(view_id):
  388.     v = sublime.View(view_id)

  389.     attach_view(v)

  390.     for callback in all_callbacks['on_load']:
  391.         run_callback('on_load', callback, lambda: callback.on_load(v))
  392.     run_view_listener_callback(v, 'on_load')


  393. def on_load_async(view_id):
  394.     v = sublime.View(view_id)
  395.     for callback in all_callbacks['on_load_async']:
  396.         try:
  397.             callback.on_load_async(v)
  398.         except:
  399.             traceback.print_exc()
  400.     run_async_view_listener_callback(v, 'on_load_async')


  401. def on_pre_close(view_id):
  402.     v = sublime.View(view_id)
  403.     for callback in all_callbacks['on_pre_close']:
  404.         run_callback('on_pre_close', callback, lambda: callback.on_pre_close(v))
  405.     run_view_listener_callback(v, 'on_pre_close')


  406. def on_close(view_id):
  407.     v = sublime.View(view_id)

  408.     run_view_listener_callback(v, 'on_close')
  409.     detach_view(v)

  410.     for callback in all_callbacks['on_close']:
  411.         run_callback('on_close', callback, lambda: callback.on_close(v))


  412. def on_pre_save(view_id):
  413.     v = sublime.View(view_id)
  414.     for callback in all_callbacks['on_pre_save']:
  415.         run_callback('on_pre_save', callback, lambda: callback.on_pre_save(v))
  416.     run_view_listener_callback(v, 'on_pre_save')


  417. def on_pre_save_async(view_id):
  418.     v = sublime.View(view_id)
  419.     for callback in all_callbacks['on_pre_save_async']:
  420.         try:
  421.             callback.on_pre_save_async(v)
  422.         except:
  423.             traceback.print_exc()
  424.     run_async_view_listener_callback(v, 'on_pre_save_async')


  425. def on_post_save(view_id):
  426.     v = sublime.View(view_id)
  427.     for callback in all_callbacks['on_post_save']:
  428.         run_callback('on_post_save', callback, lambda: callback.on_post_save(v))
  429.     run_view_listener_callback(v, 'on_post_save')


  430. def on_post_save_async(view_id):
  431.     v = sublime.View(view_id)
  432.     for callback in all_callbacks['on_post_save_async']:
  433.         try:
  434.             callback.on_post_save_async(v)
  435.         except:
  436.             traceback.print_exc()
  437.     run_async_view_listener_callback(v, 'on_post_save_async')


  438. def on_modified(view_id):
  439.     v = sublime.View(view_id)
  440.     for callback in all_callbacks['on_modified']:
  441.         run_callback('on_modified', callback, lambda: callback.on_modified(v))
  442.     run_view_listener_callback(v, 'on_modified')


  443. def on_modified_async(view_id):
  444.     v = sublime.View(view_id)
  445.     for callback in all_callbacks['on_modified_async']:
  446.         try:
  447.             callback.on_modified_async(v)
  448.         except:
  449.             traceback.print_exc()
  450.     run_async_view_listener_callback(v, 'on_modified_async')


  451. def on_selection_modified(view_id):
  452.     v = sublime.View(view_id)
  453.     for callback in all_callbacks['on_selection_modified']:
  454.         run_callback('on_selection_modified', callback, lambda: callback.on_selection_modified(v))
  455.     run_view_listener_callback(v, 'on_selection_modified')


  456. def on_selection_modified_async(view_id):
  457.     v = sublime.View(view_id)
  458.     for callback in all_callbacks['on_selection_modified_async']:
  459.         try:
  460.             callback.on_selection_modified_async(v)
  461.         except:
  462.             traceback.print_exc()
  463.     run_async_view_listener_callback(v, 'on_selection_modified_async')


  464. def on_activated(view_id):
  465.     v = sublime.View(view_id)
  466.     for callback in all_callbacks['on_activated']:
  467.         run_callback('on_activated', callback, lambda: callback.on_activated(v))
  468.     run_view_listener_callback(v, 'on_activated')


  469. def on_activated_async(view_id):
  470.     v = sublime.View(view_id)
  471.     for callback in all_callbacks['on_activated_async']:
  472.         try:
  473.             callback.on_activated_async(v)
  474.         except:
  475.             traceback.print_exc()
  476.     run_async_view_listener_callback(v, 'on_activated_async')


  477. def on_deactivated(view_id):
  478.     v = sublime.View(view_id)
  479.     for callback in all_callbacks['on_deactivated']:
  480.         run_callback('on_deactivated', callback, lambda: callback.on_deactivated(v))
  481.     run_view_listener_callback(v, 'on_deactivated')


  482. def on_deactivated_async(view_id):
  483.     v = sublime.View(view_id)
  484.     for callback in all_callbacks['on_deactivated_async']:
  485.         try:
  486.             callback.on_deactivated_async(v)
  487.         except:
  488.             traceback.print_exc()
  489.     run_async_view_listener_callback(v, 'on_deactivated_async')


  490. def on_query_context(view_id, key, operator, operand, match_all):
  491.     v = sublime.View(view_id)
  492.     for callback in all_callbacks['on_query_context']:
  493.         try:
  494.             val = callback.on_query_context(v, key, operator, operand, match_all)
  495.             if val:
  496.                 return True
  497.         except:
  498.             traceback.print_exc()

  499.     for vel in event_listeners_for_view(v):
  500.         if 'on_query_context' in vel.__class__.__dict__:
  501.             try:
  502.                 val = vel.on_query_context(key, operator, operand, match_all)
  503.                 if val:
  504.                     return True
  505.             except:
  506.                 traceback.print_exc()

  507.     return False


  508. def normalise_completion(c):
  509.     if len(c) == 1:
  510.         return (c[0], "", "")
  511.     elif len(c) == 2:
  512.         return (c[0], "", c[1])
  513.     else:
  514.         return c


  515. def on_query_completions(view_id, prefix, locations):
  516.     v = sublime.View(view_id)

  517.     completions = []
  518.     flags = 0
  519.     for callback in all_callbacks['on_query_completions']:
  520.         try:
  521.             res = callback.on_query_completions(v, prefix, locations)

  522.             if isinstance(res, tuple):
  523.                 completions += [normalise_completion(c) for c in res[0]]
  524.                 flags |= res[1]
  525.             elif isinstance(res, list):
  526.                 completions += [normalise_completion(c) for c in res]
  527.         except:
  528.             traceback.print_exc()

  529.     for vel in event_listeners_for_view(v):
  530.         if 'on_query_completions' in vel.__class__.__dict__:
  531.             try:
  532.                 res = vel.on_query_completions(prefix, locations)

  533.                 if isinstance(res, tuple):
  534.                     completions += [normalise_completion(c) for c in res[0]]
  535.                     flags |= res[1]
  536.                 elif isinstance(res, list):
  537.                     completions += [normalise_completion(c) for c in res]
  538.             except:
  539.                 traceback.print_exc()

  540.     return (completions, flags)


  541. def on_hover(view_id, point, hover_zone):
  542.     v = sublime.View(view_id)
  543.     for callback in all_callbacks['on_hover']:
  544.         run_callback('on_hover', callback, lambda: callback.on_hover(v, point, hover_zone))

  545.     for vel in event_listeners_for_view(v):
  546.         if 'on_hover' in vel.__class__.__dict__:
  547.             try:
  548.                 vel.on_hover(point, hover_zone)
  549.             except:
  550.                 traceback.print_exc()


  551. def on_text_command(view_id, name, args):
  552.     v = sublime.View(view_id)

  553.     for vel in event_listeners_for_view(v):
  554.         if 'on_text_command' in vel.__class__.__dict__:
  555.             try:
  556.                 res = vel.on_text_command(name, args)
  557.                 if isinstance(res, tuple):
  558.                     return res
  559.                 elif res:
  560.                     return (res, None)
  561.             except:
  562.                 traceback.print_exc()

  563.     for callback in all_callbacks['on_text_command']:
  564.         try:
  565.             res = callback.on_text_command(v, name, args)
  566.             if isinstance(res, tuple):
  567.                 return res
  568.             elif res:
  569.                 return (res, None)
  570.         except:
  571.             traceback.print_exc()

  572.     return ("", None)


  573. def on_window_command(window_id, name, args):
  574.     window = sublime.Window(window_id)
  575.     for callback in all_callbacks['on_window_command']:
  576.         try:
  577.             res = callback.on_window_command(window, name, args)
  578.             if isinstance(res, tuple):
  579.                 return res
  580.             elif res:
  581.                 return (res, None)
  582.         except:
  583.             traceback.print_exc()

  584.     return ("", None)


  585. def on_post_text_command(view_id, name, args):
  586.     v = sublime.View(view_id)
  587.     for callback in all_callbacks['on_post_text_command']:
  588.         try:
  589.             callback.on_post_text_command(v, name, args)
  590.         except:
  591.             traceback.print_exc()

  592.     for vel in event_listeners_for_view(v):
  593.         if 'on_post_text_command' in vel.__class__.__dict__:
  594.             try:
  595.                 vel.on_post_text_command(name, args)
  596.             except:
  597.                 traceback.print_exc()


  598. def on_post_window_command(window_id, name, args):
  599.     window = sublime.Window(window_id)
  600.     for callback in all_callbacks['on_post_window_command']:
  601.         try:
  602.             callback.on_post_window_command(window, name, args)
  603.         except:
  604.             traceback.print_exc()


  605. class CommandInputHandler(object):
  606.     def name(self):
  607.         clsname = self.__class__.__name__
  608.         name = clsname[0].lower()
  609.         last_upper = False
  610.         for c in clsname[1:]:
  611.             if c.isupper() and not last_upper:
  612.                 name += '_'
  613.                 name += c.lower()
  614.             else:
  615.                 name += c
  616.             last_upper = c.isupper()
  617.         if name.endswith("_input_handler"):
  618.             name = name[0:-14]
  619.         return name

  620.     def next_input(self, args):
  621.         return None

  622.     def placeholder(self):
  623.         return ""

  624.     def initial_text(self):
  625.         return ""

  626.     def preview(self, arg):
  627.         return ""

  628.     def validate(self, arg):
  629.         return True

  630.     def cancel(self):
  631.         pass

  632.     def confirm(self, arg):
  633.         pass

  634.     def create_input_handler_(self, args):
  635.         return self.next_input(args)

  636.     def preview_(self, v):
  637.         ret = self.preview(v)

  638.         if ret is None:
  639.             return ("", 0)
  640.         elif isinstance(ret, sublime.Html):
  641.             return (ret.data, 1)
  642.         else:
  643.             return (ret, 0)

  644.     def validate_(self, v):
  645.         return self.validate(v)

  646.     def cancel_(self):
  647.         self.cancel()

  648.     def confirm_(self, v):
  649.         self.confirm(v)


  650. class BackInputHandler(CommandInputHandler):
  651.     def name(self):
  652.         return "_Back"


  653. class TextInputHandler(CommandInputHandler):
  654.     def description(self, text):
  655.         return text

  656.     def setup_(self, args):
  657.         props = {
  658.             "initial_text": self.initial_text(),
  659.             "placeholder_text": self.placeholder(),
  660.             "type": "text",
  661.         }

  662.         return ([], props)

  663.     def description_(self, v, text):
  664.         return self.description(text)


  665. class ListInputHandler(CommandInputHandler):
  666.     def list_items(self):
  667.         return []

  668.     def description(self, v, text):
  669.         return text

  670.     def setup_(self, args):
  671.         items = self.list_items()

  672.         selected_item_index = -1

  673.         if isinstance(items, tuple):
  674.             items, selected_item_index = items

  675.         for i in range(len(items)):
  676.             it = items[i]
  677.             if isinstance(it, str):
  678.                 items[i] = (it, it)

  679.         props = {
  680.             "initial_text": self.initial_text(),
  681.             "placeholder_text": self.placeholder(),
  682.             "selected": selected_item_index,
  683.             "type": "list",
  684.         }

  685.         return (items, props)

  686.     def description_(self, v, text):
  687.         return self.description(v, text)


  688. class Command(object):
  689.     def name(self):
  690.         clsname = self.__class__.__name__
  691.         name = clsname[0].lower()
  692.         last_upper = False
  693.         for c in clsname[1:]:
  694.             if c.isupper() and not last_upper:
  695.                 name += '_'
  696.                 name += c.lower()
  697.             else:
  698.                 name += c
  699.             last_upper = c.isupper()
  700.         if name.endswith("_command"):
  701.             name = name[0:-8]
  702.         return name

  703.     def is_enabled_(self, args):
  704.         ret = None
  705.         try:
  706.             args = self.filter_args(args)
  707.             if args:
  708.                 ret = self.is_enabled(**args)
  709.             else:
  710.                 ret = self.is_enabled()
  711.         except TypeError:
  712.             ret = self.is_enabled()

  713.         if not isinstance(ret, bool):
  714.             raise ValueError("is_enabled must return a bool", self)

  715.         return ret

  716.     def is_enabled(self):
  717.         return True

  718.     def is_visible_(self, args):
  719.         ret = None
  720.         try:
  721.             args = self.filter_args(args)
  722.             if args:
  723.                 ret = self.is_visible(**args)
  724.             else:
  725.                 ret = self.is_visible()
  726.         except TypeError:
  727.             ret = self.is_visible()

  728.         if not isinstance(ret, bool):
  729.             raise ValueError("is_visible must return a bool", self)

  730.         return ret

  731.     def is_visible(self):
  732.         return True

  733.     def is_checked_(self, args):
  734.         ret = None
  735.         try:
  736.             args = self.filter_args(args)
  737.             if args:
  738.                 ret = self.is_checked(**args)
  739.             else:
  740.                 ret = self.is_checked()
  741.         except TypeError:
  742.             ret = self.is_checked()

  743.         if not isinstance(ret, bool):
  744.             raise ValueError("is_checked must return a bool", self)

  745.         return ret

  746.     def is_checked(self):
  747.         return False

  748.     def description_(self, args):
  749.         try:
  750.             args = self.filter_args(args)
  751.             if args is not None:
  752.                 return self.description(**args)
  753.             else:
  754.                 return self.description()
  755.         except TypeError:
  756.             return ""

  757.     def description(self):
  758.         return ""

  759.     def filter_args(self, args):
  760.         if args:
  761.             if 'event' in args and not self.want_event():
  762.                 args = args.copy()
  763.                 del args['event']

  764.         return args

  765.     def want_event(self):
  766.         return False

  767.     def input(self, args):
  768.         return None

  769.     def input_description(self):
  770.         return ""

  771.     def create_input_handler_(self, args):
  772.         return self.input(args)


  773. class ApplicationCommand(Command):
  774.     def run_(self, edit_token, args):
  775.         args = self.filter_args(args)
  776.         try:
  777.             if args:
  778.                 return self.run(**args)
  779.             else:
  780.                 return self.run()
  781.         except (TypeError) as e:
  782.             if 'required positional argument' in str(e):
  783.                 if sublime_api.can_accept_input(self.name(), args):
  784.                     sublime.active_window().run_command(
  785.                         'show_overlay',
  786.                         {
  787.                             'overlay': 'command_palette',
  788.                             'command': self.name(),
  789.                             'args': args
  790.                         }
  791.                     )
  792.                     return
  793.             raise

  794.     def run(self):
  795.         pass


  796. class WindowCommand(Command):
  797.     def __init__(self, window):
  798.         self.window = window

  799.     def run_(self, edit_token, args):
  800.         args = self.filter_args(args)
  801.         try:
  802.             if args:
  803.                 return self.run(**args)
  804.             else:
  805.                 return self.run()
  806.         except (TypeError) as e:
  807.             if 'required positional argument' in str(e):
  808.                 if sublime_api.window_can_accept_input(self.window.id(), self.name(), args):
  809.                     sublime_api.window_run_command(
  810.                         self.window.id(),
  811.                         'show_overlay',
  812.                         {
  813.                             'overlay': 'command_palette',
  814.                             'command': self.name(),
  815.                             'args': args
  816.                         }
  817.                     )
  818.                     return
  819.             raise

  820.     def run(self):
  821.         pass


  822. class TextCommand(Command):
  823.     def __init__(self, view):
  824.         self.view = view

  825.     def run_(self, edit_token, args):
  826.         args = self.filter_args(args)
  827.         try:
  828.             if args:
  829.                 edit = self.view.begin_edit(edit_token, self.name(), args)
  830.                 try:
  831.                     return self.run(edit, **args)
  832.                 finally:
  833.                     self.view.end_edit(edit)
  834.             else:
  835.                 edit = self.view.begin_edit(edit_token, self.name())
  836.                 try:
  837.                     return self.run(edit)
  838.                 finally:
  839.                     self.view.end_edit(edit)
  840.         except (TypeError) as e:
  841.             if 'required positional argument' in str(e):
  842.                 if sublime_api.view_can_accept_input(self.view.id(), self.name(), args):
  843.                     sublime_api.window_run_command(
  844.                         sublime_api.view_window(self.view.id()),
  845.                         'show_overlay',
  846.                         {
  847.                             'overlay': 'command_palette',
  848.                             'command': self.name(),
  849.                             'args': args
  850.                         }
  851.                     )
  852.                     return
  853.             raise

  854.     def run(self, edit):
  855.         pass


  856. class EventListener(object):
  857.     pass


  858. class ViewEventListener(object):
  859.     @classmethod
  860.     def is_applicable(cls, settings):
  861.         return True

  862.     @classmethod
  863.     def applies_to_primary_view_only(cls):
  864.         return True

  865.     def __init__(self, view):
  866.         self.view = view


  867. class MultizipImporter(object):
  868.     def __init__(self):
  869.         self.loaders = []
  870.         self.file_loaders = []

  871.     def find_module(self, fullname, path=None):
  872.         if not path:
  873.             for l in self.loaders:
  874.                 if l.name == fullname:
  875.                     return l

  876.         for l in self.loaders:
  877.             if path == [l.zippath]:
  878.                 if l.has(fullname):
  879.                     return l

  880.         return None


  881. class ZipLoader(object):
  882.     def __init__(self, zippath):
  883.         self.zippath = zippath
  884.         self.name = os.path.splitext(os.path.basename(zippath))[0]
  885.         self._scan_zip()

  886.     def has(self, fullname):
  887.         name, key = fullname.split('.', 1)
  888.         if name == self.name and key in self.contents:
  889.             return True

  890.         override_file = os.path.join(override_path, os.sep.join(fullname.split('.')) + '.py')
  891.         if os.path.isfile(override_file):
  892.             return True

  893.         override_package = os.path.join(override_path, os.sep.join(fullname.split('.')))
  894.         if os.path.isdir(override_package):
  895.             return True

  896.         return False

  897.     def load_module(self, fullname):
  898.         # Only if a module is being reloaded and hasn't been scanned recently
  899.         # do we force a refresh of the contents of the .sublime-package. This
  900.         # allows proper code upgrades using Package Control.
  901.         if fullname in imp._RELOADING:
  902.             if self.refreshed < time.time() - 5:
  903.                 self._scan_zip()

  904.         source, source_path, is_pkg = self._read_source(fullname)

  905.         if source is None:
  906.             raise ImportError("No module named '%s'" % fullname)

  907.         is_new = False
  908.         if fullname in sys.modules:
  909.             mod = sys.modules[fullname]
  910.             old_mod_file = mod.__file__
  911.         else:
  912.             is_new = True
  913.             mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
  914.             mod.__name__ = fullname
  915.             mod.__path__ = [self.zippath]
  916.             mod.__loader__ = self

  917.         mod.__file__ = source_path

  918.         if is_pkg:
  919.             mod.__package__ = mod.__name__
  920.         else:
  921.             mod.__package__ = fullname.rpartition('.')[0]

  922.         try:
  923.             exec(compile(source, source_path, 'exec'), mod.__dict__)
  924.             return mod

  925.         except:
  926.             if is_new:
  927.                 del sys.modules[fullname]
  928.             else:
  929.                 mod.__file__ = old_mod_file
  930.             raise

  931.     def get_source(self, fullname):
  932.         name, key = fullname.split('.', 1)
  933.         if name != self.name:
  934.             return None
  935.         source, _, _ = self._read_source(fullname)
  936.         return source

  937.     def _read_source(self, fullname):
  938.         name_parts = fullname.split('.')
  939.         override_basename = os.path.join(override_path, *name_parts)
  940.         override_py = override_basename + '.py'
  941.         override_init = os.path.join(override_basename, '__init__.py')

  942.         if os.path.isfile(override_py):
  943.             try:
  944.                 with open(override_py, 'r', encoding='utf-8') as f:
  945.                     return (f.read(), override_py, False)
  946.             except (Exception) as e:
  947.                 print(override_py, 'could not be read:', e)

  948.         if os.path.isfile(override_init):
  949.             try:
  950.                 with open(override_init, 'r', encoding='utf-8') as f:
  951.                     return (f.read(), override_init, True)
  952.             except (Exception) as e:
  953.                 print(override_init, 'could not be read:', e)

  954.         key = '.'.join(name_parts[1:])
  955.         if key in self.contents:
  956.             source = self.contents[key]
  957.             source_path = os.path.join(self.zippath, self.filenames[key]).rstrip(os.sep)
  958.             is_pkg = key in self.packages
  959.             return (source, source_path, is_pkg)

  960.         # This allows .py overrides to exist in subfolders that:
  961.         #  1. Do not exist in the .sublime-package file
  962.         #  2. Do not contain an __init__.py
  963.         if os.path.isdir(override_basename):
  964.             return ('', override_basename, True)

  965.         return (None, None, False)

  966.     def _scan_zip(self):
  967.         self.contents = {"": ""}
  968.         self.filenames = {"": ""}
  969.         self.packages = {""}
  970.         self.refreshed = time.time()

  971.         try:
  972.             with zipfile.ZipFile(self.zippath, 'r') as z:
  973.                 files = [i.filename for i in z.infolist()]

  974.                 for f in files:
  975.                     base, ext = os.path.splitext(f)
  976.                     if ext != ".py":
  977.                         continue

  978.                     paths = base.split('/')
  979.                     if len(paths) > 0 and paths[len(paths) - 1] == "__init__":
  980.                         paths.pop()
  981.                         self.packages.add('.'.join(paths))

  982.                     try:
  983.                         pkg_path = '.'.join(paths)
  984.                         self.contents[pkg_path] = z.read(f).decode('utf-8')
  985.                         self.filenames[pkg_path] = f
  986.                     except UnicodeDecodeError:
  987.                         print(f, "in", self.zippath, "is not utf-8 encoded, unable to load plugin")
  988.                         continue

  989.                     while len(paths) > 1:
  990.                         paths.pop()
  991.                         parent = '.'.join(paths)
  992.                         if parent not in self.contents:
  993.                             self.contents[parent] = ""
  994.                             self.filenames[parent] = parent
  995.                             self.packages.add(parent)
  996.         except (Exception) as e:
  997.             print("Error loading %s:" % self.zippath, e)


  998. override_path = None
  999. multi_importer = MultizipImporter()
  1000. sys.meta_path.insert(0, multi_importer)


  1001. def update_compressed_packages(pkgs):
  1002.     multi_importer.loaders = []
  1003.     for p in pkgs:
  1004.         try:
  1005.             multi_importer.loaders.append(ZipLoader(p))
  1006.         except (FileNotFoundError, zipfile.BadZipFile) as e:
  1007.             print("error loading " + p + ": " + str(e))


  1008. def set_override_path(path):
  1009.     global override_path
  1010.     override_path = path
复制代码




动象论坛欢迎您!文明发帖,理性交流!(๑`・ᴗ・´๑)

该用户从未签到

84

主题

927

帖子

636

积分

试剑江湖

Rank: 3Rank: 3

积分
636

最佳新人活跃会员灌水之王

发表于 2020-5-3 15:34:21 | 显示全部楼层
可以哇,但我懒得看hhh
毕竟不是学这东西的
水帖使我快乐
回复

使用道具 举报

  • TA的每日心情
    开心
    2021-4-11 23:04
  • 135

    主题

    1023

    帖子

    2767

    积分

    清正廉明~管理员

    用心做好论坛,用心创造精品!

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    2767

    论坛官方最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老论坛财主在线王比特币王

    发表于 2020-5-3 15:36:57 | 显示全部楼层
    文外缪朴奂 发表于 2020-5-3 15:34
    可以哇,但我懒得看hhh
    毕竟不是学这东西的









    动象论坛
    点滴纯粹 简单自然
    动象论坛,用心做好论坛!用心创造精品!
    [点我进入]dxbbs.twxne.top
    回复

    使用道具 举报

    该用户从未签到

    84

    主题

    927

    帖子

    636

    积分

    试剑江湖

    Rank: 3Rank: 3

    积分
    636

    最佳新人活跃会员灌水之王

    发表于 2020-5-3 15:38:55 | 显示全部楼层

    made,我才发两行
    水帖使我快乐
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-4-11 23:04
  • 135

    主题

    1023

    帖子

    2767

    积分

    清正廉明~管理员

    用心做好论坛,用心创造精品!

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    2767

    论坛官方最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老论坛财主在线王比特币王

    发表于 2020-5-3 15:39:33 | 显示全部楼层













    动象论坛
    点滴纯粹 简单自然
    动象论坛,用心做好论坛!用心创造精品!
    [点我进入]dxbbs.twxne.top
    回复

    使用道具 举报

    该用户从未签到

    84

    主题

    927

    帖子

    636

    积分

    试剑江湖

    Rank: 3Rank: 3

    积分
    636

    最佳新人活跃会员灌水之王

    发表于 2020-5-3 15:40:30 | 显示全部楼层

    ernrnrnrnrnrnrnrnrn
    水帖使我快乐
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-4-11 23:04
  • 135

    主题

    1023

    帖子

    2767

    积分

    清正廉明~管理员

    用心做好论坛,用心创造精品!

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    2767

    论坛官方最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老论坛财主在线王比特币王

    发表于 2020-5-3 15:51:04 | 显示全部楼层


    叫我你从说的你重新金色的放假你手机发的那就哦端午节你肯定放假女粉丝
    O(∩_∩)O
    动象论坛
    点滴纯粹 简单自然
    动象论坛,用心做好论坛!用心创造精品!
    [点我进入]dxbbs.twxne.top
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

     QQ 手机版小黑屋网站地图

    GMT+8, 2021-5-12 10:25 Processed in 0.160961 second(s), 26 queries .

    CopyRight © 2020-2021 DongXiang BBS. All Rights Reserved.

    ICP备案号:粤ICP备17035028号-1

    MySSL 安全签章

    快速回复 返回顶部 返回列表