読者です 読者をやめる 読者になる 読者になる

(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

TODO管理用のコマンドをざっくり書いてみた

昨日仕事していて、パソコンで使うTODOアプリがあんまり便利なのないなーって思ったので、適当なの作った。
ちなみにXubuntuで今はお仕事の資料を書いている。LibreOfficeそこそこ使えるじゃん。

要件

  • コマンドでTODOを追加できる
  • シンプルにテキストで管理しておきたい
  • Linuxで動けばいいや

パッと書きたいときに追加できるのが重要でEmacsをいちいち立ち上げるのもかったるいので、コマンドにしたかった。

ざっくり書いたコード

#!/usr/bin/gosh
(use gauche.parseopt)
(use file.util)
(use util.match)

(define-constant *todo-file* (string-append (home-directory) "/.my-todo"))
(define-constant *oport*
  (open-output-file *todo-file*
		    :if-exists :append
		    :if-does-not-exist :create))
(define-constant *iport* (open-input-file *todo-file*))

(define (add-todo content)
    (write content *oport*)
    (newline *oport*)
    (flush *oport*))

(define (todo-list)
  (display(port->string *iport*)))

(define (main args)
  (let-args (cdr args)
	    ((mode    "m|mode=s")
;;	     (help    "h|help" => (cut show-help (car args)))
	     . content)
	    (match mode
		   ["add" (add-todo (string->symbol (car content)))]
		   ["list" (todo-list)]	
		   [else (error mode content)]
		   )
	    (close-input-port *iport*)
	    (close-output-port *oport*)))

追記

ばばろあお兄さんから盛大にツッコまれたので直してみた。

#!/usr/bin/gosh
(use gauche.parseopt)
(use file.util)
(use util.match)

(define-constant *todo-file* (string-append (home-directory) "/.my-todo"))

(define (add-todo content)
  (call-with-output-file *todo-file*
    (^p (write content p)
	(newline p)
	(flush p))
    :if-exists :append))

(define (todo-list)
  (for-each (cut print <>)
	    (call-with-input-file *todo-file*
	      (^p (let loop ((ls '()) (line (read-line p)))
		    (if (eof-object? line)
			ls
			(loop (cons line ls) (read-line p))))))))

(define (main args)
  (let-args (cdr args)
	    ((mode    "m|mode=s")
	     . content)
	    (match mode
		   ["add" (add-todo (car content))]
		   ["list" (todo-list)]	
		   [else (error mode content)]
		   )))

涙が出た。

今後

  • データを一件ずつ削除できるようにしたい(とりあえず、消すときはあまりパッと消せる必要もないのでEmacs開いて消してる)
  • 優先順位付けもしたい
  • web上でデータ管理したい(コマンドで追加したりするのは変えない)
  • git cloneみたいなコマンドのスタイルにしたい(かも)
  • 相変わらずエラー処理適当すぎるので綺麗にする