Tbpgr Blog

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

秀丸マクロとRubyでTODO管理 2012/10/22更新

概要

普段TODO管理を秀丸で行なっています。
タスクの開始時に開始時間と開始を表す記号(▲)を設定。
タスクの終了時に終了時間と開始時間との差を日時形式で表示し、終了を表す記号(▼)を設定。
という機能を秀丸マクロ+Rubyで作成しました。

ファイル構成

%HIDEMARU_HOME%
mac
 ┣lineTodoStart.mac
 ┣lineTodoFinish.mac
 ┣dateYMD_HMS.mac
 ┣OutputDateDiff.mac"
 ┗Ruby
  ┣DateUtil.rb
  ┗OutputDateDiff.rb

※HIDEMARU_HOMEは秀丸のインストールフォルダに読みかえてください
例:C:\Program Files\Hidemaru

事前準備

Rubyのインストール

下記URL参照。
http://d.hatena.ne.jp/tbpg/20120115/1326608400
インストールが終わったら下記のrbファイルを作成して、
上記に記したファイル構成の場所に保存してください。

Rubyの日付ユーティリティ作成

※下記のコードは私がRubyを初めて2ヶ月ぐらいの頃に書いたコードなので
よりよい処理があるはずです。

DateUtil.rb

class DateUtil
  def self.calcDateDiff(timeFrom, timeTo)
    dateDiff = timeTo - timeFrom
    case dateDiff
    # 比較結果
    when 0..86399
      diffHour = (dateDiff/3600).to_i
      diffMinute = ((dateDiff-(3600*diffHour))/60).to_i
      diffSec = (dateDiff-(60*(diffMinute))-(3600*(diffHour))).to_i
      diffHour = format("%02d", diffHour)
      diffMinute = format("%02d", diffMinute)
      diffSec = format("%02d", diffSec)
      ret = "#{diffHour}時間#{diffMinute}#{diffSec}"
    # 比較結果(エラー)
    else
      "時刻が不正です\n"
    end
  end
  
  def self.getYear(yyyymmddhhssmm)
    yyyymmddhhssmm.slice(0,4)
  end
  
  def self.getMonth(yyyymmddhhssmm)
    yyyymmddhhssmm.slice(5,2)
  end
  
  def self.getDay(yyyymmddhhssmm)
    yyyymmddhhssmm.slice(8,2)
  end
  
  def self.getHour(yyyymmddhhssmm)
    yyyymmddhhssmm.slice(11,2)
  end
  
  def self.getMinutes(yyyymmddhhssmm)
    yyyymmddhhssmm.slice(14,2)
  end
  
  def self.getSeconds(yyyymmddhhssmm)
    yyyymmddhhssmm.slice(17,2)
  end
end
Rubyの日付減算処理作成

OutputDateDiff.rb

require_relative 'DateUtil'

=begin
日付減算処理

パイプ区切りの文字列の最後から2つの要素に開始日時|終了日時
というフォーマットの文字列があった場合、
時差を計算してその差を以下のフォーマットで行末に追加する
|HH時間MM分SS秒

不正な行データが入力された場合は、入力データをそのまま返却する
※todo 例外処理未実装
=end
def getDateDiff(line)
  #文字列をパイプで分割
  todo = line.split('|')
  #分割後の最終要素が日時要素
  from = todo[todo.size - 2]
  to = todo[todo.size - 1]

  #開始時間
  timeFrom = Time.mktime(DateUtil.getYear(from),DateUtil.getMonth(from),DateUtil.getDay(from),DateUtil.getHour(from),DateUtil.getMinutes(from),DateUtil.getSeconds(from))
  #終了時間
  timeTo = Time.mktime(DateUtil.getYear(to),DateUtil.getMonth(to),DateUtil.getDay(to),DateUtil.getHour(to),DateUtil.getMinutes(to),DateUtil.getSeconds(to))

  #日付の減算
  DateUtil.calcDateDiff(timeFrom, timeTo)
  
  rescue
    "測定不能"
end

while line = STDIN.gets
    if (/exit/ =~ line)
        break;
    end
    
=begin
chompで改行文字を削除
行末に|+日時減算結果を挿入
=end
    puts(line.chomp + '|' + getDateDiff(line))
end

秀丸マクロの追加

現在日付取得マクロ

dateYMD_HMS.mac
「2012/03/29 01:40:12」のような日付を挿入します

insert "20" + midstr(date,0,2) + "/" + midstr(date,3,2) + "/" + midstr(date,6,2) + " " + time;
日付減算マクロ

OutputDateDiff.mac
Rubyのコードを呼び出しています。

// Rubyのパスを通しておくこと
$RUBY_HOME = "ruby";
// 日本語Shift-JIS指定
$RUBY_SHIFTJIS = "-Ks";
// 実行するrubyのファイル名を指定
$RUBY_SCRIPT = "C:\\Program Files\\Hidemaru\\mac\\Ruby\\OutputDateDiff.rb";

runex $RUBY_HOME + " " + $RUBY_SHIFTJIS +" '" + $RUBY_SCRIPT + "'"
    , 1             //sync    0:async 1:sync
    , 5, ""         //stdin   0:none 1:auto 2:file 3:(reserve) 4:all 5:select
    , 6, ""         //stdout  0:none 1:auto 2:file 3:add file  4:new 5:insert 6:replace
    , 6, ""         //stderr  0:none 1:=out 2:file 3:add file  4:new 5:insert 6:replace
    , 0, ""         //folder  0:none 1:current 2:specify 3:(reserve) 4:exe's folder
    , 1             //show    0:auto 1:show 2:hide
    , 1             //nodraw  0:draw 1:no draw
    , 0             //unicode 0:ansi 2:unicode
    ;

endmacro;
TODO開始マクロ

lineTodoStart.mac
行末にパイプ+日時を追加。行頭に▲を追加します。

setcompatiblemode 0x0F;
golineend
// 日時を挿入
execmacro "" + currentmacrodirectory + "\\" + "dateYMD_HMS.mac";
// パイプを挿入
insert "|";
golinetop;
insert "▲";
endmacro;
TODO終了マクロ

lineTodoFinish.mac
日時を追加。自分の行のみ▲を▼に置換します

golineend
// 日時を挿入
execmacro "" + currentmacrodirectory + "\\" + "dateYMD_HMS.mac";
selectline;
replaceall "▲" , "▼" , inselect;
selectline;
// 経過時間を計算
execmacro "" + currentmacrodirectory + "\\" + "OutputDateDiff.mac";
endmacro;
マクロの登録

上記4つのマクロを登録します。
マクロ→マクロ登録を行う。

メニューの登録

その他→メニュー編集で上記2つのTODOをメニューに登録します。
これでメニューから操作出来るようになりました。
※頻繁に使用する場合は、このメニューにショートカットを割り当てます。

私はタスクの開始にCtrl+Shift+A、終了にCtrl+Shift+Zを割り当てています。
・HappyHackingKeyboardのキー配列だととても押しやすいこと
・AtoZのイメージで、開始と終了を連想しやすいこと
が割当の理由です。

キャプチャ

※普段テキストファイルの場合、▲▼をハイライトにして完了・未完了をわかりやすくしています。

start前

メニュー表示

start後

finish後