kanban.el

(Arne Babenhauserheide)
2012-04-24: added a zero-state kanban lisplet. kit

added a zero-state kanban lisplet.

diff --git a/kanban.el b/kanban.el
new file mode 100644
--- /dev/null
+++ b/kanban.el
@@ -0,0 +1,42 @@
+;; Use org-tables as kanban tables for more efficient todo tracking.
+;;
+;; Usage: 
+;;
+;; * Zero state Kanban: Directly displaying org-mode todo states as kanban board
+;;
+;; |   |   |   |
+;; |---+---+---|
+;; |   |   |   |
+;; |   |   |   |
+;; #+TBLFM: @1='(kanban-zero-headers $#)::@2$1..@>$>='(kanban-zero $# @#)
+;;
+;; * Stateful Kanban: Use org-mode to retrieve tasks, but track their state in the Kanban board
+;;
+;; |   |   |   |
+;; |---+---+---|
+;; |   |   |   |
+;; |   |   |   |
+;; #+TBLFM: $1='(let ((elem (nth (- @# 1) (delete nil (org-map-entries (lambda () (let ((line (filter-buffer-substring (point) (line-end-position)))(keyword "❢")) (let ((cleanline (nth 1 (split-string line "* ")))) (let ((shortline (substring cleanline (+ (length keyword) 1) (min 40 (length cleanline))))) (let ((clean (if (member " " (split-string (substring shortline (min 25 (length shortline))) "")) (mapconcat 'identity (reverse (rest (reverse (split-string shortline " ")))) " ") shortline))) (if (not (member keyword (split-string cleanline " "))) nil (concat "[[" cleanline "][" clean "]]" ))))))) nil 'agenda))))) (if (member elem (list @2$2..@>$>)) "" elem))::$2='(let ((elem (nth (- @# 1) (delete nil (org-map-entries (lambda () (let ((line (filter-buffer-substring (point) (line-end-position)))(keyword "STARTED")) (let ((cleanline (nth 1 (split-string line "* ")))) (if (not (member keyword (split-string cleanline " "))) nil (concat "[[" cleanline "][" (substring cleanline (+ (length keyword) 1) (min 40 (length cleanline))) "]]" ))))) nil 'agenda))))) (if (member elem (list @2$3..@>$>)) "" (if (equal elem nil) "" elem)))::@1='(let ((words org-todo-keywords-1)) (nth (- $# 1) words))
+
+
+(defun kanban-zero-headers (column)
+  (let ((words org-todo-keywords-1)) (nth (- column 1) words)))
+
+(defun kanban-zero (column row)
+  (let
+      ((elem (nth (- column 1) 
+                  (delete nil (org-map-entries
+                               (lambda ()
+                                 (let ((line (filter-buffer-substring 
+                                              (point) (line-end-position)))
+                                       (keyword (nth (- row 1) org-todo-keywords-1)))
+                                   (let ((cleanline (nth 1 (split-string line "* "))))
+                                     (if (not (member keyword (split-string cleanline " ")))
+                                         nil
+                                       (concat "[[" cleanline "][" 
+                                               (substring cleanline
+                                                          (+ (length keyword) 1)
+                                                          (min 30 (length cleanline))) "]]" ))))) nil 'agenda)))))
+    (if
+        (equal
+         elem nil) "" elem)))
\ No newline at end of file