hatena-modeを複数のアカウントに対応してみました

utf8 にしてから,再投稿すると,なぜか投稿記事が文字化けをしてしまっていたので,おかしくなったエントリーを一旦削除しました m(_ _)m

なぜ文字化けするのか,小 2 時間くらいぐちゃぐちゃやっているうちに,hatena-mode.el を複数のアカウントに対応してみました.

複数アカウント対応だったら,simple-hatena-mode を使えばよいのだけれども,hatena-mode のサックリ感というかお手軽さがたまらないので,未だに hatena-mode をしばしば使っている.

以下に安直な対応を晒します.笑ってやってください.

--- hatena-mode.el.orig	2008-07-06 03:03:33.000000000 +0900
+++ hatena-mode.el	2008-07-06 03:45:59.000000000 +0900
@@ -1,4 +1,5 @@
 ;;; hatena-mode.el --- major mode for Hatena::Diary (http://d.hatena.ne.jp)
+;;; Time-stamp: <2008-07-06 03:45:59 munepi>
 
 ;; Created:     Thu Jun 17  2004
 ;; Keywords:    blog emacs 
@@ -8,7 +9,7 @@
 ;;              http://d.hatena.ne.jp/dev-null 
 ;;              and all users
 
-(defconst hatena-version "0.9.7" "Version number of hatena.el")
+(defconst hatena-version "0.9.7-mp1" "Version number of hatena.el")
 
 ;; 1) 適当なディレクトリにこのファイルをおく.
@@ -17,7 +18,10 @@
 ;; 2) .emacs に次の 4 行を追加する.
 ;; (setq load-path (cons (expand-file-name "~/elisp") load-path))
 ;; (load "hatena-mode")
-;; (setq hatena-usrid "your username on Hatena::Diary")
+;; ;;(setq hatena-usrid "your username on Hatena::Diary");  obsolete!!!
+;; (setq hatena-usrid-list ;; list of your acounts on Hatena::Diary
+;;   '(("hoge") ("foo"))
+;;   )
 ;; (setq hatena-plugin-directory "~/elisp")
 ;;    `hatena-use-file' を non-nil にするとパスワードを base64 で
 ;;    暗号化してファイルに保存しますが、"人間が見てすぐわからない"ぐらいの
@@ -51,7 +55,7 @@
 ;;    `hatena-browser-function' に 'browse-url とかやると日記をポスト
 ;;    した後その日 url を引数としてブラウザを呼びます.
 ;;    `hatena-insert-webdiary' はてなバッファで実行すると、現在 web に
-;;    アップされているファイルを取ってくる。 o
+;;    アップされているファイルを取ってくる。 
 ;;
 ;; 4) 上位モード
 ;;    hatena-mode はデフォルトで html-mode に被せています。これを
@@ -103,6 +107,8 @@
 (defun hatena (&optional date)
   "Hatena::Diary ページを開く. "
   (interactive)
+  (when (not hatena-usrid)
+    (hatena-read-usrid))
   (unless (file-exists-p hatena-directory)
     (make-directory hatena-directory t))
   (if (not date)
@@ -124,6 +130,23 @@
     nil)
   )
 
+(defun hatena-read-usrid nil
+  "Read a usrid on mini buffer and return its usrid."
+  (interactive)
+  (let* ((selected (car hatena-usrid-list))
+         (default (car selected)))
+    (setq hatena-usrid
+	  (completing-read
+	   (format "Select User ID (%s): " default) hatena-usrid-list
+	   nil " " default)
+	  )
+    (if (string-match hatena-usrid "")
+	(setq hatena-usrid default))
+    (setq hatena-directory 
+	  (concat (file-name-as-directory hatena-directory) hatena-usrid "/"))
+    )
+  )
+
 (define-derived-mode hatena-mode html-mode "Hatena"
 "はてなモード. "
     (font-lock-add-keywords 'hatena-mode
@@ -160,7 +183,8 @@
 (setq auto-mode-alist
       (append 
        (list 
-	(cons (concat hatena-directory hatena-fname-regexp) 'hatena-mode))
+	(cons (concat hatena-directory hatena-fname-regexp) 'hatena-mode)
+	(cons (concat hatena-directory "\\([A-z0-9]*\\)/" hatena-fname-regexp) 'hatena-mode))
        auto-mode-alist))
 
 
@@ -320,7 +344,7 @@
     (call-process hatena-curl-command nil nil nil 
 		  "-k"  "-c" hatena-cookie
 		  "-x" hatena-proxy
-		  "-d" (concat "key=" hatena-usrid)
+		  "-d" (concat "name=" hatena-usrid)
 		  "-d" (concat "password=" password)
 		  "-d" (concat "autologin=1")
 		  "-d" (concat "mode=enter")
--- hatena-vars.el.orig	2008-07-06 03:03:56.000000000 +0900
+++ hatena-vars.el	2008-07-06 03:49:22.000000000 +0900
@@ -10,6 +10,11 @@
   :prefix "hatena-"
   :group 'hatena)
 
+(defcustom hatena-usrid-list nil
+  "List of Hatena::Diary usrid list."
+  :type 'string
+  :group 'hatena)
+
 (defcustom hatena-usrid nil
   "hatena-mode のユーザー名"
   :type 'string