gnu-emacs-sources
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

easy-todo.el --- Manage your todos in an extremely easy way!


From: William Xu
Subject: easy-todo.el --- Manage your todos in an extremely easy way!
Date: Mon, 01 Oct 2007 19:34:26 +0900
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/23.0.50 (darwin)

See Commentary.

;;; easy-todo.el --- Manage your todos in an extremely easy way!

;; Copyright (C) 2007 William Xu

;; Author: William Xu <address@hidden>
;; Version: 0.1
;; Url: http://williamxu.net9.org/ref/easy-todo.el
;; Last updated: 2007/10/01

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.

;; This program is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with EMMS; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
;; Boston, MA 02110-1301, USA.

;;; Commentary:

;; `easy-todo-mode' is a very easy todo manager. It simply adds some
;; hilighting keywords, some special prefix flags(for indicating
;; different types of todo items) upon `text-mode'.

;; It supports three different prefix flags, namely "^> "(ongoing),
;; "^- "(todo), "^x "(appened). Here's a screenshot:
;;
;; ,----
;; | > (work) Check compress() function
;; | > Finish easy-todo-mode
;; | - Make a nicer buddy interface for erc
;; |     * display buddy images
;; |     * learn from adium's look and feel
;; | x Write emms-itunes.el
;; `----

;; Put this file into your load-path and the following into your
;; ~/.emacs:
;;           (autoload 'easy-todo-mode "easy-todo")

;;; Code:

;;; Customizations

(defgroup easy-todo nil
  "Manage todos in an easy way!"
  :prefix "easy-todo-"
  :group 'convenience)

(defcustom easy-todo-ongoing-regexp "^> "
  "Prefix for ongoing items."
  :type 'string
  :group 'easy-todo)

(defcustom easy-todo-todo-regexp "^- "
  "Prefix for todo items."
  :type 'string
  :group 'easy-todo)

(defcustom easy-todo-appended-regexp "^x "
  "Prefix for appended items."
  :type 'string
  :group 'easy-todo)


;;; Implementations

;;;###autoload
(define-derived-mode easy-todo-mode text-mode "Easy-Todo"
  "Major mode for managing todos.
\\{easy-todo-mode-map}"
  (setq font-lock-defaults '(easy-todo-font-lock-keywords))
  (run-hooks 'easy-todo-mode-hook))

(define-key easy-todo-mode-map (kbd "C-c C-o") 'easy-todo-item-ongoing)
(define-key easy-todo-mode-map (kbd "C-c C-t") 'easy-todo-item-todo)
(define-key easy-todo-mode-map (kbd "C-c C-a") 'easy-todo-item-appended)
(define-key easy-todo-mode-map (kbd "C-c C-b") 'easy-todo-sort-buffer)
(define-key easy-todo-mode-map (kbd "C-c C-r") 'easy-todo-sort-region)
(define-key easy-todo-mode-map (kbd "C-c C-k") 'easy-todo-kill-item)

(defvar easy-todo-regexp
  (mapconcat (lambda (i) i)
             (list easy-todo-ongoing-regexp
                   easy-todo-todo-regexp
                   easy-todo-appended-regexp)
             "\\|"))

(defvar easy-todo-font-lock-keywords
  `((,(concat easy-todo-ongoing-regexp ".*")
     (0 font-lock-keyword-face t t))
    (,(concat easy-todo-todo-regexp ".*")
     (0 font-lock-variable-name-face t t))
    (,(concat easy-todo-appended-regexp ".*")
     (0 font-lock-string-face t t))))

(defun easy-todo-item-ongoing ()
  "Switch current item into ongoing status and sort todos
automatically."
  (interactive)
  (save-excursion
    (move-beginning-of-line 1)
    (or (re-search-forward easy-todo-regexp
                           (progn (move-end-of-line 1)
                                  (point))
                           t
                           1)
        (re-search-backward easy-todo-regexp
                            (point-min)
                            t
                            1))
    (replace-match (replace-regexp-in-string
                    "^\\^" "" easy-todo-ongoing-regexp)))
  (easy-todo-sort-buffer))

(defun easy-todo-item-todo ()
  "Switch current item into todo status and sort todos
automatically."
  (interactive)
  (save-excursion
    (move-beginning-of-line 1)
    (or (re-search-forward easy-todo-regexp
                           (progn (move-end-of-line 1)
                                  (point))
                           t
                           1)
        (re-search-backward easy-todo-regexp
                            (point-min)
                            t
                            1))
    (replace-match (replace-regexp-in-string
                    "^\\^" "" easy-todo-todo-regexp)))
  (easy-todo-sort-buffer))

(defun easy-todo-item-appended ()
  "Switch current item into appended status and sort todos
automatically."
  (interactive)
  (save-excursion
    (move-beginning-of-line 1)
    (or (re-search-forward easy-todo-regexp
                           (progn (move-end-of-line 1)
                                  (point))
                           t
                           1)
        (re-search-backward easy-todo-regexp
                            (point-min)
                            t
                            1))
    (replace-match (replace-regexp-in-string
                    "^\\^" "" easy-todo-appended-regexp)))
  (easy-todo-sort-buffer))

(defun easy-todo-sort-buffer ()
  "Sort all todo items in buffer."
  (interactive)
  (easy-todo-sort-region (point-min) (point-max)))

(defun easy-todo-sort-region (beg end)
  "Sort todo items by `easy-todo-flags' between BEG and END.
BENIN and END are points."
  (interactive "r")
  (let ((kill-ring '())       ; We shouldn't mess up user's `kill-ring'.
        (remaining-flags (list easy-todo-ongoing-regexp
                               easy-todo-todo-regexp
                               easy-todo-appended-regexp))
        (pos beg)                     ; position for inserting new items
        item-beg item-end priority)
    (save-excursion
      (goto-char beg)
      (while (and remaining-flags (cdr remaining-flags))
        (setq priority (car remaining-flags))
        (while (setq item-beg (re-search-forward priority end t 1))
          (setq item-beg (- item-beg 2))
          (setq item-end (re-search-forward
                          (mapconcat (lambda (j) j) (cdr remaining-flags) "\\|")
                          end
                          t
                          1))
          (if item-end
              (setq item-end (- (point) 2))
            (setq item-end end))
          (kill-region item-beg item-end)
          (goto-char pos)
          (yank)
          (setq pos (point)))
        (setq remaining-flags (cdr remaining-flags))))))

(defun easy-todo-kill-item ()
  "Kill most recent item."
  (interactive)
  (save-excursion
    (let (beg end)
      (move-beginning-of-line 1)
      (setq beg (or (re-search-forward easy-todo-regexp
                                       (save-excursion
                                         (move-end-of-line 1)
                                         (point))
                                       t
                                       1)
                    (re-search-backward easy-todo-regexp
                                        (point-min)
                                        t
                                        1)))
      (if beg
          (progn
            (setq beg (- beg 2))
            (setq end (re-search-forward easy-todo-regexp
                                          (point-max)
                                          t
                                          1))
            (if end
                (setq end (- end 2))
              (setq end (point-max)))
            (kill-region beg end))
        (message "easy-todo item not found here")))))


(provide 'easy-todo)

;;; easy-todo.el ends here

-- 
William

http://williamxu.net9.org





reply via email to

[Prev in Thread] Current Thread [Next in Thread]