Sublime 플러그인을 어떻게 쓰는지 (3)

7310 단어
Sublime 플러그인을 어떻게 쓰는지 (3)
생방송으로 여러분과 함께 Sublime 플러그인을 쓰세요.
[TOC]
플러그인 디자인 사고방식
나는 이 플러그인이 너무 많은 단축키를 쓰지 않고 F1만 있으면 되기를 바란다.
  • F1, 플러그인을 시작하고 시간 진도를 표시합니다.
  • 토마토 시간내 F1 전환(표시/숨김) 시간 진도.
  • 시간 다 됐어요. 힌트 주세요.
  • Sublime을 시작할 때 이전 토마토 시간이 끝났는지 판단합니다.
  • Yes, Pass.
  • No, 계속 시간을 재세요.


  • 퀵패널이란?
    예를 들면 다음과 같습니다.
  • super + shift + p # Command Palette
  • super + r # Goto Symbol

  • 플러그인 설치, 포맷 설정, 포지셔닝 함수, 줄 수 점프...이럴 때 검은색 테두리가 나오는데 이게 바로 퀴크 패널입니다.
    .sublime-commands
  • 새 파일../packages/Example/ Example.sublime-commands
  • [
        { "command": "new_tomato", "caption": "Example: New Pomodoro Time" },
        { "command": "show_tomato_progress", "caption": "Example: Show Status" },
        { "command": "hide_tomato_progress", "caption": "Example: Hide Status" },
    ]
    
  • 단축키 수정.
  • [
        { "keys": ["f1"], "command": "show_overlay", "args": {"overlay": "command_palette", "text": "Example: "} },
    ]
    
    .sublime-commands 파일을 통해 사용자 정의command 명령을 추가합니다.F1을 눌러 quick panel을 열고 기본 입력 문자Example:를 입력합니다.위의 3가지 옵션이 표시됩니다.
    슈퍼+시프트+p, 다시 입력Example:하면 효과가 같습니다.
    플러그인에 대응하는 쓰기
    class NewTomatoCommand(sublime_plugin.TextCommand):
    
        def run(self, edit):
            tomato.start()
    
        def is_visible(self):
            return not tomato.is_actived()
    
    
    
    class ShowTomatoProgressCommand(sublime_plugin.TextCommand):
    
        def run(self, edit):
            tomato.set_status_visiable(True)
    
        def is_visible(self):
             return tomato.is_actived() and not tomato.get_status_visiable()
    
    
    
    class HideTomatoProgressCommand(sublime_plugin.TextCommand):
    
        def run(self, edit):
            tomato.set_status_visiable(False)
    
        def is_visible(self):
             return tomato.is_actived() and tomato.get_status_visiable()
    

    Methods: is_visible Return Value: bool Description: Returns true if the command should be shown in the menu at this time. The default implementation always returns True.
    코드 전체 텍스트
    
    import sublime
    import sublime_plugin
    import os
    import time
    
    
    DELAY_TIME = 1
    DEFAULT_TOMATO_TIME = 25
    TICK_INTERVAL = 1
    ENDING_WORDS = '            ,      bye bye!'
    CACHE_FILE_PATH = "/WorkTime.cache"
    WORKTIME_SETTINGS = "WorkTime.sublime-settings"
    TASK_FILE = "Floyda.wkt"
    
    # ------------------------------------------------------------------------------
    # Setting
    # ------------------------------------------------------------------------------
    class WorkTimeDo():
        def __init__(self):
            self.settings = sublime.load_settings(WORKTIME_SETTINGS)
            self.filename = sublime.packages_path() + CACHE_FILE_PATH
    
        def get_config(self, key, default):
            return self.settings.get(key,default)
    
        def say_ending(self):
            if sublime.platform() == "osx":
                os.popen('say ' + ENDING_WORDS)
    
        def save_time(self, time = None):
            try:
                fp = open(self.filename, "w+")
                fp.write(time)
                fp.close()
            except:
                sublime.error_message("Cann't save current time to local.")
    
        def load_time(self):
            try:
                fp = open(self.filename)
                time = fp.read()
                fp.close()
                return time
            except:
                fp = open(self.filename, "w+")
                fp.close()
                return None
    
        def clear_time(self):
            self.save_time('')
    
    # ------------------------------------------------------------------------------
    # Tomato
    # ------------------------------------------------------------------------------
    class Tomato(WorkTimeDo):
    
        def __init__(self):
            super(Tomato, self).__init__()
            self.total_time = self.get_config("tomato_time", DEFAULT_TOMATO_TIME) * 60
            self.counter = 0
            self.actived = False
            self.status_visiable = True
            self.check_last_time()
    
        def start(self, start_time = 0):
            self.counter = start_time
            self.actived = True
            # self.total_time = self.get_config("tomato_time", DEFAULT_TOMATO_TIME) * 60
            # self.total_time = 10
            self.save_time(str(time.time()))
    
        def stop(self):
            self.counter = 0
            self.actived = False
            self.clear_time()
            self.say_ending()
            sublime.message_dialog("Have a rest!")
    
    
        def update(self):
            self.counter += 1
            self.show_progress()
            if self.counter >= self.total_time:
                self.stop()
    
        def is_actived(self):
            return self.actived
    
        def set_status_visiable(self, flag):
            self.status_visiable = flag
            self.show_progress()
        
        def get_status_visiable(self):
            return self.status_visiable
    
        def show_progress(self):
            if self.status_visiable is False:
                sublime.status_message('')
                return
    
            progress = int(self.counter / self.total_time * 100)
            msg = "|" + \
                progress * "-" + \
                "o" + \
                (100 - progress) * "-" + \
                "|"
    
            sublime.status_message(msg)
    
    
        def check_last_time(self):
            last_time = self.load_time()
            try:
                last_time = float(last_time)
            except:
                self.clear_time()
                return
    
            cur_time = time.time()
            result = cur_time - last_time
            if result >= self.total_time:
                self.clear_time()
            else:
                self.start(int(result))
    
    
    
    class Tick():
    
        def __init__(self):
            self.thread_flag = False
    
        def callback(self):
            if not self.thread_flag: return
    
            if tomato.is_actived():
                tomato.update()
    
            sublime.set_timeout_async(self.callback, 1000)
    
        def start(self):
            self.thread_flag = True
            self.callback()
    
        def stop(self):
            self.thread_flag = False
    
    
    def delay():
        global tomato
        global tick
        tomato = Tomato()
        tick = Tick() 
        tick.start()
    
    sublime.set_timeout_async(lambda:delay(), DELAY_TIME * 1000)
    # ------------------------------------------------------------------------------
    # Sublime Plugin
    # ------------------------------------------------------------------------------
    class NewTomatoCommand(sublime_plugin.TextCommand):
    
        def run(self, edit):
            tomato.start()
    
        def is_visible(self):
            return not tomato.is_actived()
    
    
    
    class ShowTomatoProgressCommand(sublime_plugin.TextCommand):
    
        def run(self, edit):
            tomato.set_status_visiable(True)
    
        def is_visible(self):
             return tomato.is_actived() and not tomato.get_status_visiable()
    
    
    
    class HideTomatoProgressCommand(sublime_plugin.TextCommand):
    
        def run(self, edit):
            tomato.set_status_visiable(False)
    
        def is_visible(self):
             return tomato.is_actived() and tomato.get_status_visiable()
    
    

    -- Floyda --
    플러그인을 쓰면서 Blog를 쓰기 때문에 진도가 다르기 때문에 Blog의 코드를 간소화하기 어렵다.그냥 보자- -!!!

    좋은 웹페이지 즐겨찾기