2012-04-12 8 views
38

したがって、仕事ではフレキシブルタイム(flex hours、flexi hours ...)を使用しています。私は現在、私の時間(org-clock-(out|in))を追跡するためにorg-modeを使用していますが、私が8時間以上働いたかどうかを自動的に計算するように拡張したいと思います(余分な時間をflexitimeのアカウントに追加する必要があります) (私が昼休みなどを取った時間によって異なります)、フレキシビリティのアカウントの残高などです。Emacsを使用してflexitimeを追跡する(&org-mode)

誰でもこのためにEmacsを使用していますか?私は現在、私の時間を追跡することは非常に基本的なセットアップを使用してい

(defun check-in() 
    (interactive) 
    (let (pbuf (current-buffer)) 
    (find-file (convert-standard-filename "whatnot")) 
    (goto-char (point-max)) 
    (insert "\n") 
    (org-insert-heading) 
    (org-insert-time-stamp (current-time)) 
    (org-clock-in) 
    (save-buffer) 
    (switch-to-buffer pbuf))) 

(defun check-out() 
    (interactive) 
    (let (pbuf (current-buffer)) 
    (find-file (convert-standard-filename "whatnot")) 
    (goto-char (point-max)) 
    (org-clock-out) 
    (save-buffer) 
    (switch-to-buffer pbuf))) 
+2

あなたのコードは 'selected-window'に表示されているバッファと' current-buffer'を混同します。 Elispから 'switch-to-buffer'を呼び出すことは、一般にそのような問題の兆候です。 current-buffer + find-file + switch-to-bufferの代わりに '(with-current-buffer(find-file-noselect ...)...)'を使いたいとします。もう1つ注意してください: 'convert-standard-filename'を呼び出すのは気にしないでください。これはおそらくあなたが思うことをするものではないでしょう。 – Stefan

答えて

4

は私が正しくあなたの問題を理解すると仮定すると、私は、迅速な解決策を一緒にハッキング。まず、複数回チェックインとチェックアウトを行っている場合は、1日に1つのアウトラインエントリのみを作成するようにしてください。特定の日の超過時間を計算する次の関数を定義します。

(defun compute-overtime (duration-string) 
    "Computes overtime duration string for the given time DURATION-STRING." 
    (let (minutes-in-a-workday 
     work-minutes 
     overtime-minutes) 
    (defconst minutes-in-a-workday 480) 
    (setq work-minutes (org-duration-string-to-minutes duration-string) 
      overtime-minutes (- work-minutes minutes-in-a-workday)) 
    (if (< overtime-minutes 0) (setq overtime-minutes 0)) 
    (org-minutes-to-hh:mm-string overtime-minutes))) 

次に、ファイルwhatnotのクロックテーブルの式で使用します。あなたはそれを再生成するクロックテーブルの上にあるときに

#+BEGIN: clocktable :maxlevel 1 :emphasize nil :scope file :formula "$3='(compute-overtime $2)::@2$3=string(\"Overtime\")"  
#+END: clocktable 

C-CのC-Cをヒット。

他の数式を使用して余裕時間を合計すると、残業時間合計を取得できます。しかし、私はそれを働かせていません。

+0

私は間違いなくそれを試みます。 –

+0

こんにちは!私はパーティーにはかなり遅れましたが、ありがとう! 1つの最終的な質問、私はこれを後で補うならば、8時間未満で働くことができます。上記のコードは、私の残業(私が '(if)' - 文を削除しなければならなかった)が '-1:-1'(作業6時59分)になる日をもたらします。私は '(org-minutes-to-hh:mm-string)'の定義を見ましたが、それをどうやって行うのか分かりませんでした。 – monotux

+0

私はそれを最終的に把握しました。ありがとう! – monotux

関連する問題