howm の一覧表示画面で任意のファイルを削除する

ために以下のような elisp を書いてしばらく経つのだけど、
実際には elscreen-howm の削除機能を常用している。

;; 一覧表示(C-c , a )で d するとファイルを削除
(define-key howm-view-summary-mode-map "d" 'delete-howm-file)

(defun delete-howm-file ()
  (interactive)
  (let (filename year month pnt)
    (setq pnt (point))
    (beginning-of-line)
    (re-search-forward "\\(\\([0-9]+\\)-\\([0-9]+\\).*howm\\)" nil t)
    (setq filename (buffer-substring (match-beginning 1) (match-end 1)))
    (setq year (buffer-substring (match-beginning 2) (match-end 2)))
    (setq month (buffer-substring (match-beginning 3) (match-end 3)))
    (when (y-or-n-p "Delete this file? ")
      (delete-file (concat howm-directory year "/" month "/" filename))
      (message "Delete!")
      (howm-list-all)
      (goto-char pnt)
      )
    )
  )


elscreen-howm では、*.howm なファイルを開いた状態で、バッファの内容を全て消し、
C-c C-c すると自動的にファイルを削除してくれる。
ファイルの内容が空じゃない限り、C-c C-c はただバッファを閉じてくれるだけ。
あまり深く考えずに C-c C-c だけ覚えていれば使えるのでそこがいいんだろうなぁ。

ハマったところ

これを書いてるときに一番困ったのはキーバインドの割り当て。
howm-view-summary-mode-map に割り当ててるつもりがエラーが出て動いてくれなかった。
理由は、キーバインドの設定時に howm が読み込まれていないことだった。


各所で紹介されている howm の設定では、
C-c , , が最初に入力されたときに howm を読み込むようになっているので、
この設定では、.emacs に書かれている howm-view-summary-mode-map を Emacs が理解できない。
なので以下のように置換してあげると解決!

- (global-set-key "\C-c,," 'howm-menu)
+ (require 'howm-mode)

open-junk-file したら elscreen で新しいスクリーンが開くようにする

id:rubikitch さんの open-junk-fileで開くバッファを、elscreen の新しいスクリーンで開くようにする。

(defun open-junk-file ()
  (interactive)
  (let* ((file (expand-file-name
                (format-time-string
                 "%Y/%m/%Y-%m-%d-%H%M%S." (current-time))
                "~/My Dropbox/junk/"))
         (dir (file-name-directory file)))
    (make-directory dir t)
    (find-file-other-window (read-string "Junk Code: " file))))
;; (global-set-key "\C-xj" 'open-junk-file)
(global-set-key "\C-xj" '(lambda () (interactive) (elscreen-create) (open-junk-file)))

一番下に追加してる部分がその設定。C-x j にフックさせている。
(interactive) つけないとうまく動かない。


global-set-key で2つの処理をフックするときは

(global-set-key '(lambda () (interactive) do something ...))

とするのを覚えておきたい。


オリジナルの open-junk-file に手を加えるなら、以下のようにしても同じ。

(defun open-junk-file ()
  (interactive)
  (elscreen-create) ;; ここに追加
  (let* ((file (expand-file-name
                (format-time-string
                 "%Y/%m/%Y-%m-%d-%H%M%S." (current-time))
                "~/My Dropbox/junk/"))
         (dir (file-name-directory file)))
    (make-directory dir t)
    (find-file-other-window (read-string "Junk Code: " file))))
(global-set-key "\C-xj" 'open-junk-file) ;; 呼び出し部分は変えない

追記

elscreen で開くのはあんまり意味がない気がしてきた。

デスクトップとノートの .emacs を Dropbox で同期

Dropbox は便利。Dropbox は偉大。
.emacs の同期はずっとやろうやろうと思いつつも放置してきていた。*1
でもようやく重い腰を上げて同期したのでメモしておく。*2


デスクトップは家で使ってるやつで、ノートは外で使ってるやつ。
.emacs は大体似たような設定になっているのだけど、同期しておいた方がいいのは間違いない。
まずは ediff を使って2つの .emacs をマージさせることにした。


がしかし、cygwin 1.7.1 *3だと Meadow から diff がうまく呼べないみたいで困った。
仕方ないので他のところから diff をもらってきて cygwin の diff より優先度を高くして使うことにする。
UnxUtils | Get UnxUtils at SourceForge.netで UnxUtils.zip をダウンロードし、
解凍した中にある diff.exe と diff3.exe をパスの通ったところに置く。
このパスは cygwin の bin よりも優先度を高くしておく必要があるので ~/bin に置いた。


で、ediff-merge-files する。
違うところはたしか40個くらいはあったと思う。
チマチマとマージする。
マージはやり出すまでは億劫だけどやり出すとけっこう楽しい。


ediff-merge はどちらか一方の記述をそのまま使いたいなら a か b を押せばいいのだけど、
どちらの記述も使いたいときは自分で直接編集する必要がある。
C-x o でバッファを切り換えられないのでいちいちマウスで切り換えてる。めんどい。
ショートカットはないのだろうか。。


マージ後のファイルを .emacs.common として ~/My Dropbox に保存。
ついでに site-lispDropbox で同期することにする。
2つのPCの site-lisp を適当にマージして ~/My Dropbox/site-lisp に置き、
.emacs.common 内の ~/site-lisp を ~/My Dropbox/site-lisp に置換した。


最後に2つの環境でちゃんと動くかテスト。
emacs-w3mskk でエラーが出た。
どっちも Meadow でネットインストールしたやつで、特に使っていなかったのでアンイストールしたら解決した。

*1:めんどくさそうだったからね。

*2:といっても実際に同期したのはちょっと前の話。

*3:cygwin のバージョンは $ uname -r で調べられる。

また hatena-mode 使えなくなってた

もう嫌だ…しばらく使わないで置くと毎回使えなくなる…。
そしてその度に、かなりの時間をかけていつのまにか使えるようになる。
うれしいけどスッキリしない。


きっと全然思いもしないところに原因があるんだろうなぁ。
もしかしたら一度はてダラ使ってみたのがよかったのかもしれない。
simple-hatena-mode に浮気しようとしたけど、
cygwinCPAN だと Crypt::SSLeay がどうしても入れられなかった。
それで ActivePerl で ppm 使おうと思ったら、
ActivePerl は特に何もしなくても Crypt::SSLeay 使えるのね。ありがたい。
でも simple-hatena-mode が hw.pl を見つけてくれず、
その理由は cygwin にあるっぽくて、八方塞がりになってしまった。
で、とりあえず ActivePerl + はてダラ(hw.pl) は動くようになったところで、
M-x hatena-mode したらうまく投稿できちゃったという。
うーん。全然分からない。


もしまた hatena-mode が動かなくなったときは、
またこれらと格闘することになるのかもしれない。
これは「常にダイアリーを更新しなさい」ということなのかもしれない。

過去に euc でポストした日記を utf-8 でポストし直すと文字化けする?

hatena-mode で、M-x hatena-get-webdiary して過去の日記を取ってきて、
そいつを utf-8-unix でポストすると、ブラウザで見たときに文字化けしてる。

Meadow でファイルを開いたときに、
自動的に utf-8-unix に変換するようにしているのだけど、その設定が問題っぽい。
たしかはてダは euc-jp がデフォルトの文字コードだったと思う。

でも新規に utf-8 でポストしたやつは文字化けしない。
一度 euc-jp でポストしたのを、それ以外の文字コードでポストし直すと化けるのかな?


hatena-mode でファイル開くときは euc-jp で開くようにした方が安全かもしれない。

antyhing で C-p, C-n がきかない

anything の設定でカーソルキーを使わなくても上下移動ができるように
以下の設定を書いていたのだけど、いつのまにかきかなくなっていた。

(define-key anything-map "\C-p" 'anything-previous-line)
(define-key anything-map "\C-n" 'anything-next-line)


ぐぐったら
anything-iswitchb-setupがdefine-keyしてるのに気づかず困っていた - hitode909のダイアリー
に解決方法が紹介されていて、
確認したら僕も全く同じことをしていたのでなるほどなと思った。


それで、最初はリンク先と同じように anything.el 側を書き換えたのだけど、
よく考えたら (anything-iswithcb-setup) がいらないことに気付いたので、
anything.el をいじるのはやめて .emacs の (anything-iswithcb-setup) を削ることにした。


あと、anything-previous-line と anthing-next-line は
現在の anything ではそれぞれ C-p, C-n にデフォルトでバインドされているので
もう .emacs に書いておく必要もないことが分かった。なのでこれも削る。


C-v, M-v にバインドしていた anything-next-page と anything-previous-page は
今後もあった方がいいので残しておく。


まとめるとこんな感じ。

;; (define-key anything-map "\C-p" 'anything-previous-line)
;; (define-key anything-map "\C-n" 'anything-next-line)
(define-key anything-map "\C-v" 'anything-next-page)
(define-key anything-map "\M-v" 'anything-previous-page)
;; (anything-iswitchb-setup)

現行の Cygwin はデフォルトで UTF-8 に対応してるかも

Cygwin のバージョンは 1.7.1-1
git を追加しただけで他には特に何も設定していない状態。
この状態でコミットメッセージを UTF-8 で書いたら、
ちゃんと git log で日本語が表示された。


以前はcygwinのgitでutf-8のファイル名とコミット - トカゲの独り言を参考にして
UTF-8 に対応させていたので、
今回もそうしようと思ってUTF-8 Cygwin - Downloadから落としてきた
cygwin1.dll を C:\cgywin\bin に突っこんだのだけど、
そしたら cygwin が立ち上がらなくなってしまった。
仕方ないので cygwin1.dll を書き換えずに git commit してみたところうまくいったよーという話。


まだファイル名については確認できてない。