找回密码
 立即注册!
搜索

小喇叭+ 发布

系统消息:尊敬的用户,动象论坛的邮件系统已经完美修复,您现在可以顺利使用自助注册和找回密码功能了。万分感谢你对动象论坛的喜爱与支持~
06-10 15:28
系统消息:很抱歉的通知您,当前论坛的邮件系统暂时出现故障,因此自助注册和找回密码的功能将无法使用。如有任何需要,您可以直接添加客服QQ:230273459进行人工操作。对此给您带来的不便,我们深感歉意。
06-10 09:11
admin动象论坛祝大家端午快乐~悠悠粽草,人间芳华,年年岁岁皆如愿,岁岁年年长安康。
06-10 09:09
系统消息:动象论坛祝大家高考加油~
06-09 15:13
系统消息:各位坛友,由于“两会”封网原因,动象论坛服务中止了约一个星期,对于由此给您造成的麻烦我们感到万分抱歉。
03-18 23:04
admin动象论坛在这里祝大家2024龙年新年快乐~
02-09 14:58
系统消息:论坛端口问题已经解决~您可以直接访问论坛域名mcmc.ltd(www.mcmc.ltd)啦~(Tips:如访问时提示“连接被重置”报错,请清空您的DNS缓存与浏览器缓存。)
02-05 19:14
系统消息:论坛预计今天晚间将端口问题修复完成,请留意论坛动态,感谢您对动象论坛的支持~
02-05 14:06
系统消息:动象论坛目前正在紧急迁移服务器,目前请您先访问https://mcmc.ltd:150。论坛正在全力找CDN以修复端口问题,由此给您造成影响亿常抱歉。。
02-05 11:23
系统消息:动象论坛祝大家2024年新年快乐吖~祝大家前路浩浩荡荡,万事皆可期待~
12-31 22:41
系统消息:动象论坛拟于7月20日至7月21日进行服务器迁移和域名更换,届时论坛服务将暂时不可用。对此给您带来的麻烦,我们感到十分抱歉。
07-18 19:51
Mozillahello world
07-04 17:39
系统消息:高考倒计时2天!动象论坛祝大家2023高考完胜!加油!!!!!!
06-04 23:44
神秘人:
03-21 07:20
系统消息:向各位论坛坛友公开一下,我们现在吸收了@luoying2334 为论坛管理团队成员,管理讨论区、软件分享区和得闲饮茶区。如您有任何质疑,请您在【意见与建议】版块发帖,感谢您的支持~
03-20 23:23
admin论坛没啥人气啊emmm,欢迎大家来推荐退荐~
03-12 22:34
02-05 11:11
luoying2334给我学狗叫啊,三回啊三回
02-05 11:11
Civilmafia追尾黑色高级车
02-04 14:27
Civilmafia仙家军
02-03 19:08
查看: 1117|回复: 6

Sublime_plugin源代码免费分享!

[复制链接]

54

主题

156

回帖

371

积分

试剑江湖

致敬·Mozilla Firefox

积分
371

最佳新人活跃会员

发表于 2020-5-3 15:31:35 | 显示全部楼层 |阅读模式 IP:江苏苏州
本帖最后由 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
复制代码




[我是一个默认签名,快去设置里设置一个个性签名吧(*^ワ^*)] 动象论坛欢迎您!(´∇ノ`*)ノ
188

106

主题

1154

回帖

3684

积分

惊鸿侠影

积分
3684

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

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

使用道具 举报

666

261

主题

1391

回帖

1万

积分

清正廉明~管理员

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

积分
10642

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

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









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

使用道具 举报

188

106

主题

1154

回帖

3684

积分

惊鸿侠影

积分
3684

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

发表于 2020-5-3 15:38:55 | 显示全部楼层 IP:江西赣州

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

使用道具 举报

666

261

主题

1391

回帖

1万

积分

清正廉明~管理员

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

积分
10642

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

QQ
发表于 2020-5-3 15:39:33 | 显示全部楼层 IP:江西南昌













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

使用道具 举报

188

106

主题

1154

回帖

3684

积分

惊鸿侠影

积分
3684

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

发表于 2020-5-3 15:40:30 | 显示全部楼层 IP:江西赣州

ernrnrnrnrnrnrnrnrn
水帖使我快乐
回复

使用道具 举报

666

261

主题

1391

回帖

1万

积分

清正廉明~管理员

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

积分
10642

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

QQ
发表于 2020-5-3 15:51:04 | 显示全部楼层 IP:江西南昌


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

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册!

本版积分规则

QQ|手机版|小黑屋|网站地图|动象论坛

GMT+8, 2024-9-8 10:05 , Processed in 0.311989 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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