Sublime 플러그인을 어떻게 쓰는지 (3)
생방송으로 여러분과 함께 Sublime 플러그인을 쓰세요.
[TOC]
플러그인 디자인 사고방식
나는 이 플러그인이 너무 많은 단축키를 쓰지 않고 F1만 있으면 되기를 바란다.
퀵패널이란?
예를 들면 다음과 같습니다.
플러그인 설치, 포맷 설정, 포지셔닝 함수, 줄 수 점프...이럴 때 검은색 테두리가 나오는데 이게 바로 퀴크 패널입니다.
.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의 코드를 간소화하기 어렵다.그냥 보자- -!!!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.