diff --git a/README.md b/README.md index 2f4c3ee..a3a94b8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -Программа написана на [Scheme](http://www.schemers.org/) (реализация - [GNU Guile](http://www.gnu.org/software/guile/)) и предназначена для учета -рабочего времени. Применяется следующим образом: +Программа написана на [Scheme](http://www.schemers.org/) (реализация - +[GNU Guile](http://www.gnu.org/software/guile/)) и предназначена для +учета рабочего времени. Применяется следующим образом: Usage: timer [command] Commands: @@ -14,6 +15,11 @@ deadline clear [TASK] Remove deadline for project (or for last task) deadline [TASK] Show deadline for project deadline all Show all deadlines + timesheet Show all raw events + timesheet day [DATE] Show raw events for today or DATE + timesheet week [DATE] Show raw events for current week or week of DATE + timesheet month [DATE] Show raw events for current month or month of DATE + timesheet TASK Show raw events refresh Refresh worksheet file after manual edit (no command) Show running task and timer @@ -63,10 +69,8 @@ Команда `report` может иметь параметры: - `day [DATE]` - отчет по текущему дню или по дате DATE; - - `week [DATE]` - отчет по текущей неделе или по неделе, в которую входит день DATE; - - `month [DATE]` - отчет по текущему месяцу или по месяцу, в который входит день DATE; @@ -109,6 +113,10 @@ останется еще 40 минут. Это может быть удобно при планировании времени на день/неделю/месяц. +Для того, чтобы посмотреть историю работы, можно воспользоваться командой +`timesheet`. Эта команда показывает выполнявшиеся задачи в таком виде, в котором +они сохраняются на диск. Параметры команды такие-же, как у команды `report`. + # Автодополнение для zsh Для включения автодополнения в zsh скопируйте файл `zsh-completion/_timer` в diff --git a/README.org b/README.org index 56878ad..6831bf6 100644 --- a/README.org +++ b/README.org @@ -9,21 +9,26 @@ рабочего времени. Применяется следующим образом: #+begin_src text -Usage: timer [command] -Commands: - start [TASK] Start new task. If no task, use last runned task - stop Stop task - report Show report - report day [DATE] Show report for today or DATE - report week [DATE] Show report for current week or week of DATE - report month [DATE] Show report for current month or month of DATE - report TASK Show report for project - deadline set [TASK] DATE|TIME Add deadline for project (or for last task) - deadline clear [TASK] Remove deadline for project (or for last task) - deadline [TASK] Show deadline for project - deadline all Show all deadlines - refresh Refresh worksheet file after manual edit - (no command) Show running task and timer + Usage: timer [command] + Commands: + start [TASK] Start new task. If no task, use last runned task + stop Stop task + report Show report + report day [DATE] Show report for today or DATE + report week [DATE] Show report for current week or week of DATE + report month [DATE] Show report for current month or month of DATE + report TASK Show report for project + deadline set [TASK] DATE|TIME Add deadline for project (or for last task) + deadline clear [TASK] Remove deadline for project (or for last task) + deadline [TASK] Show deadline for project + deadline all Show all deadlines + timesheet Show all raw events + timesheet day [DATE] Show raw events for today or DATE + timesheet week [DATE] Show raw events for current week or week of DATE + timesheet month [DATE] Show raw events for current month or month of DATE + timesheet TASK Show raw events + refresh Refresh worksheet file after manual edit + (no command) Show running task and timer #+end_src Начало работы над задачей: @@ -130,6 +135,10 @@ Commands: останется еще 40 минут. Это может быть удобно при планировании времени на день/неделю/месяц. +Для того, чтобы посмотреть историю работы, можно воспользоваться командой +=timesheet=. Эта команда показывает выполнявшиеся задачи в таком виде, в котором +они сохраняются на диск. Параметры команды такие-же, как у команды =report=. + ** Автодополнение для zsh Для включения автодополнения в zsh скопируйте файл =zsh-completion/_timer= в =~/.zsh-completion/=, и добавте в файл =~/.zshrc= строки diff --git a/bash-completion/timer b/bash-completion/timer index 253e7dc..3761489 100644 --- a/bash-completion/timer +++ b/bash-completion/timer @@ -5,7 +5,7 @@ _timer() case "$COMP_CWORD" in 1) # Commands - COMPREPLY=( $(compgen -W "start stop report deadline refresh help" -- $uncomplete) ) + COMPREPLY=( $(compgen -W "start stop report deadline refresh timesheet help" -- $uncomplete) ) ;; 2) # Command argument 1 @@ -14,7 +14,7 @@ _timer() local tasklist=$(timer tasklist) COMPREPLY=( $(compgen -W "$tasklist" -- $uncomplete)) ;; - report) + report|timesheet) local tasklist=$(timer tasklist) COMPREPLY=( $(compgen -W "day week month $tasklist" -- $uncomplete)) ;; @@ -27,7 +27,7 @@ _timer() 3) # Command argument 2 case "${COMP_WORDS[1]}" in - report) + report|timesheet) case "${COMP_WORDS[2]}" in day) local d=$(date +"%Y-%m-%d") diff --git a/worktimer.scm b/worktimer.scm index 01af6eb..312a7ea 100755 --- a/worktimer.scm +++ b/worktimer.scm @@ -197,6 +197,12 @@ (let ((jd (date->julian-day date))) (+ jd (- 7 (remainder-and-rest jd 7))))))) +;;; Returns n-th element of list l, or NUL if list is shorter than n +(define (nth-maybe n l) + (if (null? l) '() + (if (zero? n) (car l) + (nth-maybe (- n 1) (cdr l))))) + ;;; ========================= PROJECT SPECIFIC HELPERS ========================= ;;; Find task or deadline by path @@ -509,6 +515,60 @@ (walk l (+ level 2))) (cdddr tree))))) +;;; Filter sheet by qualis and range. +;;; Qualis is string "day", "week", "month" or task name. +;;; Range is the date string. Both qualis and range may be nil. +;;; +;;; Function returns values of filtered sheet and string +;;; with description of filtering range. +(define (filter-sheet sheet qualis range) + (if (null? qualis) + (values sheet '()) + (let ((date (catch #t + (lambda () (string->date range date-format)) + (lambda (key . args) (current-date))))) + (let-values (((description filter-lambda) + (cond + ;; Filter records by day + ((string-ci= qualis "day") + (values + (format #f "DAY ~a" (date->string date "~Y-~m-~d")) + (lambda (x) (same-day? date (cadr x))))) + + ;; Filter records by month + ((string-ci= qualis "month") + (values + (format #f "MONTH ~a" (date->string date "~Y-~m")) + (lambda (x) (same-month? date (cadr x))))) + + ;; Filter records by week + ((string-ci= qualis "week") + (let ((beg (monday-of-week date)) + (end (monday-of-next-week date))) + (values + (format #f "WEEK [~a - ~a)" + (date->string beg date-format) + (date->string end date-format)) + (lambda (x) (date-in-range? (cadr x) beg end))))) + + ;; Filter records by path + (else + (values + (format #f "PROJECT ~a" qualis) + (let ((rep-path (path-split qualis))) + (lambda (x) + (let loop ((path (car x)) + (rep-path rep-path)) + (if (or + (null? path) + (null? rep-path)) #t + (if (string-ci= (car path) (car rep-path)) + (loop (cdr path) (cdr rep-path)) + #f)))))))))) + (values + (filter filter-lambda sheet) + description))))) + ;;; ================================ COMMANDS ================================== ;;; Start new task. Returns new sheet with started task or #f if nothing started. @@ -545,50 +605,18 @@ ;;; Print report (define (cmd-report sheet deadlines . params) (format #t "--- REPORT") - (let ((sheet - (if (null? params) sheet - (let* ((interval (car params)) - (report-date (catch #t - (lambda () (string->date (cadr params) date-format)) - (lambda (key . args) (current-date))))) - (filter (cond - ;; Filter records by day - ((string-ci= interval "day") - (format #t ". DAY ~a" (date->string report-date "~Y-~m-~d")) - (lambda (x) (same-day? report-date (cadr x)))) + (let ((qualis (nth-maybe 0 params)) + (range (nth-maybe 1 params))) + (let-values (((sheet description) + (filter-sheet sheet qualis range))) + (when (not (null? description)) + (display ". ") + (display description)) + (newline) + (print-report + (add-deadlines-to-report! + (make-report sheet) deadlines)))) - ;; Filter records by month - ((string-ci= interval "month") - (format #t ". MONTH ~a" (date->string report-date "~Y-~m")) - (lambda (x) (same-month? report-date (cadr x)))) - - ;; Filter records by week - ((string-ci= interval "week") - (let ((beg (monday-of-week report-date)) - (end (monday-of-next-week report-date))) - (format #t ". WEEK [~a - ~a)" - (date->string beg date-format) - (date->string end date-format)) - (lambda (x) (date-in-range? (cadr x) beg end)))) - - ;; Filter records by path - (else - (format #t ". PROJECT ~a" interval) - (let ((rep-path (path-split interval))) - (lambda (x) - (let loop ((path (car x)) - (rep-path rep-path)) - (if (or - (null? path) - (null? rep-path)) #t - (if (string-ci= (car path) (car rep-path)) - (loop (cdr path) (cdr rep-path)) - #f))))))) - sheet))))) - (newline) - (print-report - (add-deadlines-to-report! - (make-report sheet) deadlines))) (let ((last (last-task sheet))) (when last (format #t "\n--- ~a TASK\n" @@ -680,6 +708,20 @@ (values sheet deadlines) (values #f #f)))) +;;; Events +(define (cmd-timesheet sheet deadlines . params) + (format #t "--- TIMESHEET") + (let ((qualis (nth-maybe 0 params)) + (range (nth-maybe 1 params))) + (let-values (((sheet description) + (filter-sheet sheet qualis range))) + (when (not (null? description)) + (display ". ") + (display description)) + (newline) + (print-timerecords sheet))) + (values #f #f)) + ;;; ================================ MAIN FUNCTION ================================== (define (main cmdl) @@ -724,6 +766,8 @@ ((string= command "report") cmd-report) ((string= command "refresh") (lambda (s d . p) (values s d))) ((string= command "deadline") cmd-deadline) + ((string= command "timesheet") cmd-timesheet) + ;; Service commands ((string= command "tasklist") cmd-tasklist) ((string= command "deadlist") cmd-deadlist) @@ -744,6 +788,11 @@ (format #t " deadline clear [TASK] Remove deadline for project (or for last task)\n") (format #t " deadline [TASK] Show deadline for project\n") (format #t " deadline all Show all deadlines\n") + (format #t " timesheet Show all raw events\n") + (format #t " timesheet day [DATE] Show raw events for today or DATE\n") + (format #t " timesheet week [DATE] Show raw events for current week or week of DATE\n") + (format #t " timesheet month [DATE] Show raw events for current month or month of DATE\n") + (format #t " timesheet TASK Show raw events\n") (format #t " refresh Refresh worksheet file after manual edit\n") (format #t " (no command) Show running task and timer\n\n") (format #t "DATE format: YYYY-mm-dd\n") diff --git a/zsh-completion/_timer b/zsh-completion/_timer index 188cdf4..0f83fea 100644 --- a/zsh-completion/_timer +++ b/zsh-completion/_timer @@ -13,7 +13,7 @@ _timer() { case "$state" in (command) # Commands - _arguments '1:commands:(start stop report deadline refresh help)' + _arguments '1:commands:(start stop report deadline refresh timesheet help)' ;; (arg1) @@ -22,7 +22,7 @@ _timer() { (start) compadd $(timer tasklist) ;; - (report) + (report|timesheet) compadd day week month $(timer tasklist) ;; (deadline) @@ -34,7 +34,7 @@ _timer() { (arg2) # Command argument 2 case $words[2] in - (report) + (report|timesheet) case $words[3] in (day) compadd $(date +"%Y-%m-%d")