Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Sublime Text2 | TODO管理ツール 作業時間計測用Plugin開発

概要

TODO管理ツール 作業時間計測用Plugin開発

内容

母艦エディタを秀丸からSublime Text2に乗り換え中につきマクロを移植してます。
下記の記事で行なっていたTODO管理用の仕組みをSublime Text2+PythonのPluginで実装します。
Python始めたのは一昨日からなので記述は適当かもしれません
http://d.hatena.ne.jp/tbpg/20120328/1332954094

仕様

タスクは以下の項目からなる。タスク全体をyamlとして管理している都合上、
1行だけ読み取ると中途半端な書式になってます。

"title", "summary", "estimate", "from_date", "to_date", "diff_date"
=>タイトル,要約,作業見積もり(1時間単位),開始時間,終了時間,作業時間

実サンプルは以下

  - 作業準備,アクティビティの割り当て メールチェック,0.5,2013/05/24 01:03:55,2013/05/24 01:09:02,

プラグインコード

import sublime, sublime_plugin
import datetime
import time
import re
 
class CalculateTodoCommand(sublime_plugin.TextCommand):
  def run(self, edit):
    ret = ""
    region_of_line = ""
    for region in self.view.sel():
      region_of_line = self.view.line(region)

    todo = TodoCalculator(self.view.substr(region_of_line))
    todo.diff_date()

    ret  = todo.get_columns()
    ret_str = "    - " + ",".join(self)

    self.view.replace(edit, region_of_line, ret_str)
    return 

class TodoCalculator:
  def __init__(self, todo):
    self.todo = re.sub(r'^.*- ', '', todo)
    self.columns = self.todo.split(",")

  # yyyy/mm/dd hh:mi:ss形式の文字列からdatetimeを取得
  def get_datetime(self, date_text):
    return datetime.datetime(*time.strptime(date_text,'%Y/%m/%d %H:%M:%S')[:6])

  # 1行のTODOをカラムリストに分割
  def get_columns(self):
    return self.columns

  # 差分時間の取得
  def get_diff_date(self):
    return self.columns[self.DIFF_DATE_INDEX]

  def diff_date(self):
    columns = self.get_columns()
    datetime_from = self.get_datetime(self.get_from_date())
    datetime_to = self.get_datetime(self.get_to_date())

    datetime_diff  = datetime_to - datetime_from
    self.columns[self.DIFF_DATE_INDEX] = str(datetime_diff)

KEYS = ["title", "summary", "estimate", "from_date", "to_date", "diff_date"]

for column in KEYS:
  def _column(self, index=KEYS.index(column)):
    print KEYS[index]
    return self.columns[index]
  # get_xxxメソッドの追加
  setattr(TodoCalculator, "get_" + column, _column)
  # XXX定数の追加
  setattr(TodoCalculator, column.upper() + "_INDEX", KEYS.index(column))

date_keys = ["from_date", "to_date"]
for date in date_keys:
  def _set_now(self, index=KEYS.index(date)):
    self.columns[index] = datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S")

  # get_xxxメソッドの追加
  setattr(TodoCalculator, "set_now_" + date, _set_now)

出力結果

  - 準備,日次 作業準備 アクィテビティの割当 メールチェック 常時対応 日記 Evernote整理,0.5,2013/05/24 01:03:55,2013/05/24 01:09:02,0:05:07

Pythonメモ

・setattrでメソッド定義
・get_xxxxというメソッドをsetattrでメタプログラム。項目名をキーに変数名と定数作成