jam-mode

頭痛がいたくてしょうがない

NTT DoCoMo 503i とか、iアプリを emacs で書くひとむけの、いちいち jar 作るたびに jam かくのめんどくさいので
*.jam を更新する elisp

;; -*-emacs-lisp-*-
;; jam-mode.el
;; $Id: 01.tdf,v 1.2 2005/02/20 08:06:08 morimoto Exp $
;; result of current-time-string is in the form "Thu Jan  4 12:22:33 2001"

(defvar jam-mode-map nil
  "Keymap used in jam-mode.")
(defvar jam-mode-syntax-table nil
  "Syntax table in use in jam-mode buffers.")

(if jam-mode-map
    nil
  (setq jam-mode-map (make-sparse-keymap))
  (define-key jam-mode-map "\C-c\C-c" 'jam-update))

(defun jam-mode ()
  "Major mode for editing jam file"
  (interactive)
  (use-local-map jam-mode-map)
  (setq mode-name "jam")
  (setq major-mode 'jam-mode)
  (run-hooks 'jam-mode-hook))

(defun jar-last-modified-string (jar-filename)
  ""
  (let
      ((jar-attribute)
       (jar-last-modified)
       (jar-mday) (jar-day) (jar-month) (jar-year) (jar-time)
       (pattern "^\\([A-Z][a-z][a-z]\\) \\([A-Z][a-z][a-z]\\) +\\([0-9]+\\) \\(\
[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\\) \\([0-9][0-9][0-9][0-9]\\)"))
    (setq jar-attribute (file-attributes jar-filename))
    (setq jar-last-modified (current-time-string (nth 6 jar-attribute)))
    (if (string-match pattern jar-last-modified)
        (progn
          (setq jar-mday
                (match-string 1 jar-last-modified))
          (setq jar-month
                (match-string 2 jar-last-modified))
          (setq jar-day
                (match-string 3 jar-last-modified))
          (setq jar-time
                (match-string 4 jar-last-modified))
          (setq jar-year
                (match-string 5 jar-last-modified))
          (format "%s, %s %s %s %s"
                  jar-mday jar-day jar-month jar-year jar-time))
        nil)))

(defun jar-app-size-string (jar-filename)
  ""
  (format "%s"
	  (nth 7
	       (file-attributes jar-filename))))

(defun jam-update-jar-size (jar-filename)
  ""
  (beginning-of-buffer)
  (if
      (re-search-forward "AppSize *= *" nil t nil)
      (progn
	(kill-line)
	(insert (jar-app-size-string jar-filename)))
    (progn
      (beginning-of-line)
      (insert "AppSize = ")
      (insert (jar-app-size-string jar-filename))
      (insert "\n"))))

(defun jam-update-last-modified (jar-filename)
  ""
  (beginning-of-buffer)
  (if
      (re-search-forward "LastModified *= *" nil t nil)
      (progn
	(kill-line)
	(insert (jar-last-modified-string jar-filename)))
    (progn
      (beginning-of-line)
      (insert "LastModified = ")
      (insert (jar-last-modified-string jar-filename))
      (insert "\n"))))

(defun jam-update ()
  "Updates LastModified and AppSize lines of buffer."
  (interactive)
  (save-excursion
    (let
	((jar-filename))
      (beginning-of-buffer)
      (if
	  (re-search-forward "PackageURL *= *" nil t nil)
	  (progn
	    (re-search-forward "\\w+\\.jar" nil t nil)
	    (setq jar-filename (match-string 0))
	    (jam-update-jar-size jar-filename)
	    (jam-update-last-modified jar-filename))
	(progn
	  (beep)
	  (message "PackageURL does not specified!!"))))))

例によって、~/.emacs に

(autoload 'jam-mode "jam-mode" "jam mode." t)
(setq auto-mode-alist
      (append '(("\\.jam$" . jam-mode))
	      auto-mode-alist))

とか書いて、*.jam を読んだときに jam-mode になるようにしてくれ

あとは C-c C-c で LastModified 行と AppSize 行が更新される

む。バファリンが効いたのか、あたまいたいのなおった。
現実逃避終了。では。