自己写sublime插件

2019-10-12  本文已影响0人  学无止境吧

写lua脚本,没找到比较好用的格式化插件。
求人不如求己,就自己简单写个sublime插件试试手。
代码如下:

#LuaPrettify.py
import sys
from os.path import dirname
from sublime_plugin import TextCommand

sys.path.insert(0, dirname(__file__))
from src.py.commands import *
from src.py.event_listeners import *
from src.py.main import *
import sublime
import subprocess
from sublime import Region
import re  

#sublime版本
version = int(sublime.version()) 
package = "LuaPretty"

#弹出式的窗口
# sublime.error_message(sublime.version())
# class LuamixCommand(TextCommand):
#   def run(self, edit):
#       sublime.error_message(sublime.version())
#       
#   

def lua_line_format(txt):
    next_tab = 0; # 0 不变化  1,比上一行顶4个半角空格 -1 比上一行少4个空格
    current_tab = 0; # 当前tab
    # then 结尾,next_tab = 4
    # 替换单引号 双引号 字符串,替换为空串
    tp_line = txt.strip()
    if tp_line.find('--') >= 0:
        #看是否是字符串中包含
        arr = tp_line.split('--',2)
        tp_line = arr[0]
        tp_line = tp_line.strip()

    if tp_line == 'end': # 单独一个end,则前进4个tab
        next_tab = -0
        current_tab = -4

    if tp_line == 'else': 
        current_tab = -4
        next_tab = 4

    if tp_line.startswith('elseif ') and tp_line.endswith(' then'): 
        current_tab = -4
        next_tab = 4

    if tp_line.endswith(' then'):
        current_tab = current_tab
        next_tab = 4

    if tp_line.startswith('or') and tp_line.endswith(' then'):
        current_tab = 4
        next_tab = 0

    if tp_line.startswith('and') and tp_line.endswith(' then'):
        current_tab = 4
        next_tab = 0

    if tp_line.endswith('function ()') or tp_line.endswith('function()') :
        current_tab = 0
        next_tab = 4

    if tp_line.startswith('while') and tp_line.endswith(' do'):
        next_tab = 4
        current_tab = 0

    if tp_line.startswith('for') and tp_line.endswith(' do'):
        next_tab = 4
        current_tab = 0

    if tp_line.startswith('function') and tp_line.endswith(')'):
        next_tab = 4
        current_tab = 0

    if tp_line.endswith('= {'):
        current_tab = 0
        next_tab = 4

    if tp_line == '}': 
        current_tab = -4
        next_tab = 0

    return txt.strip(),next_tab,current_tab

def tab_cnt(txt):
    txt = txt.replace("\t", '    ')
    cnt = 0
    for i in txt:
        if i == ' ':
            cnt = cnt + 1
        else:
            break
    return cnt

def tab_space(cnt):
    return ''.rjust(cnt)

class LuaprettifyCommand(TextCommand):

    def run(self, edit):
        view = self.view
        regions = view.sel()
        first_selected_region = view.sel()[0]
        lines = view.lines(first_selected_region)
        space = -1 #前面空着的
        ret_str = ''
        size = len(lines)
        if size > 0:
            s = lines[0]
            e = lines[size-1]
            replace_region = sublime.Region(s.a, e.b)

            for line_regin in lines:
                line_str = view.substr(line_regin)
                if space == -1:
                    space = tab_cnt(line_str)
                    print(space)
                new_line,next_tab,current_tab = lua_line_format(line_str)
                new_line_space = space + current_tab
                if new_line_space < 0:
                    new_line_space = 0
                new_line_all = tab_space(new_line_space) + new_line
                print(new_line_all)
                ret_str = ret_str + new_line_all+'\n'
                space = new_line_space+next_tab
            view.replace(edit,replace_region,ret_str)
          
class LuamixCommand(TextCommand):
    def run(self, edit):
        sublime.error_message('mix')

#打开控制台
class OpenterminalCommand(TextCommand):
    def run(self, edit):
        view = self.view
        path = view.file_name()
        window = sublime.active_window()
        ev = window.extract_variables()
        folder = ev['folder']
        cmd = "open -n /Applications/Utilities/Terminal.app  --args '"+folder+"'"
        print(cmd)
        os.system(cmd)

#变大写小写
class UppercaseCommand(TextCommand):
    def run(self, edit):
        view = self.view
        regions = view.sel()
        first_selected_region = view.sel()[0]
        txt = view.substr(first_selected_region)
        an = re.search('[a-z]+', txt)
        if an:
            txt = txt.upper() #str.lower() 
        else:
            txt = txt.lower()
        view.replace(edit,first_selected_region,txt)
上一篇下一篇

猜你喜欢

热点阅读