hatenahelper-mode に追加している機能

僕は hatenahelper-mode に以下の2つの機能を追加して使っている。

  • スーパープレ記法の挿入を支援する機能
    • C-c s したときに、>|ruby| などが簡単に挿入できる
    • 例えば C-c s r とすれば >|ruby| が、C-c s j とすれば >|javascript| を挿入する
  • http 記法を挿入する機能
    • C-c [ で http 記法を挿入する
    • C-c [ t で :title を入れて挿入することもできる
    • クリップボードに URL がコピーされている場合は、自動的にそれに置き換わる。そうでなければ URL の部分は空になる

僕はスーパープレ記法も http 記法もよく使うので、この2つで若干効率がアップしてます。
なお、このスクリプトhttp://www.geocities.jp/emacsjjjj/hatedara/にある hatedara.el の hatedara-insert-tag 関数を参考にしています。

(add-hook 'hatenahelper-mode-hook
          '(lambda()
             (define-key hatenahelper-mode-map "\C-cs" 'selectable-super-pre)
             (define-key hatenahelper-mode-map "\C-c[" 'insert-http-notation)))

(defun selectable-super-pre ()
  "スーパープレ記法の挿入を支援"
  (interactive)
  (let* ((langlist '((?r "ruby") (?j "javascript") (?l "lisp") (?p "perl")))
         (prompt (mapconcat (lambda (l) (format "%c/%s" (car l) (cadr l))) langlist " "))
         lang
         prefix)
    (when (fep-get-mode) (fep-force-off))
    (message prompt)
    (setq lang (cadr (assq (read-char) langlist)))
    ;; >|lang| の lang を指定した言語名に置き換える
    (setq prefix (concat ">|" lang "|"))
    (message "%s" prefix)
    (hatenahelper-insert-block-aux prefix hatenahelper-sonomama-textblock-suffix)
    (when mw32-ime-state (fep-force-on))))

(defun insert-http-notation ()
  "http 記法を挿入する。 例.[http://www.example.com:title]"
  (interactive)
  (let* ((modifiers '((?t ":title") (?i ":image") (?l ":image:large") (?s ":image:small")))
         (prompt (mapconcat (lambda (l) (format "%c/%s" (car l) (cadr l))) modifiers " "))
         mod
         (clip-data (w32-get-clipboard-data)))
    (when (fep-get-mode) (fep-force-off))
    (message prompt)
    (setq mod (cadr (assq (read-char) modifiers)))
    (if (null mod)
        (setq mod ""))
    (insert "[")
    (if (and (stringp clip-data) (string-match "^https?:" clip-data))
        (insert clip-data))
    (insert mod "]")
    (when mw32-ime-state (fep-force-on))))

追記

プロンプトが出てくるときに IME が自動的にオフになるようにしたいなー。
と思って調べていたらhttp://www-tsujii.is.s.u-tokyo.ac.jp/~yoshinag/tips/elisp_tips.html#ime-offで紹介されていた方法で解決できたので実装した。
これはもうテンプレートとして色んなところで使えそうだ(・∀・)

;; IME がオンだったらオフにする
(when (fep-get-mode) (fep-force-off)

;; IME がオンだったのならオンに戻す
(when mw32-ime-state (fep-force-on))

そういえば、lisp で if を書くと else のことも気にしなきゃならなくなるから、ある条件にマッチする処理だけ書きたい場合は when を使うみたいだってことに気付いた。
マニュアルにもこう書いてある。

(when CONDITION A B C)

は、つぎとまったく等価である。

(if CONDITION (progn A B C) nil)

僕は下の if みたいな書き方ばっかりやってた(´・ω・`)
これからは if じゃなくて when を使うようにしよう。
でもこの if のおかげで progn が何のためにあるか分かったんだよね。
なのでめんどくさい if の書き方にも感謝しております。