term+のセッションをhelmで選択

第6回関西emacs勉強会(http://peccu.sytes.net/ke/)で紹介されたterm+.el(taraoさん作Emacs上のターミナルを最強に: term+.el - 貳佰伍拾陸夜日記)。
めちゃくちゃ便利で日頃から使わせてもらってる。
helmで表示されるbuffer-listからいつもセッションを選択していたのだが...sessionリストだけから、helmで選択したいなと思い、作ってみました。
popwinを内部で使ってるのでpopwinを入れてないとhelm-source-term+-new-sessionは動かないです...
ふぅ~これでさらに便利になった。taraoさんには感謝です。

sessionを新たに開いた場合にother-windowやpopupで開くのに苦労した...
"open session in popup window"と"open session in other window"はうまく動かない環境があるかもしれません...

誰かもっとうまい実装法があれば...教えてください...教えてエロい人!

2013/3/24追記 term+mux-new-other-windowって関数がいつのまにか追加されてたらしい。それを使うように変更。

必要elisp

1. term+
2. helm
3. popwin


(defun helm-term+-sessions ()
  (interactive)
  (helm-other-buffer '(helm-source-term+-sessions
                       helm-source-term+-new-session
                       )
                     "*helm-term+-sessions*"))


(defvar helm-source-term+-new-session
      '((name . "Create new session")
        (dummy)
        (action . (("open session" . (lambda (name)
                                       (when (eq name "")
                                         (setq name system-name))
                                       (term+mux-new (term+mux-new-session name))))
                   ("open session in popup window" . (lambda (name)
                                                       (popwin:popup-buffer (current-buffer))
                                                       (when (eq name "")
                                                         (setq name system-name))
                                                       (term+mux-new (term+mux-new-session name))
                                                       ))
                   ("open session in other window" . (lambda (name)
                                                       (when (eq name "")
                                                         (setq name system-name))
                                                       (term+mux-new-other-window (term+mux-new-session name))
                                                       ))))))


(defvar helm-source-term+-sessions
      `((name . "term+-session")
        (candidates . (lambda () (helm-term+-session-list)))
        (type . buffer)
        (match . helm-buffer-match-major-mode)
        (persistent-action . helm-buffers-list-persistent-action)
        (keymap . ,helm-buffer-map)
        (volatile)
        (mode-line . helm-buffer-mode-line-string)
        (persistent-help
         . "Show this buffer / C-u \\[helm-execute-persistent-action]: Kill this buffer")))

(defun helm-term+-session-list ()
  "Return the current list of term+ sessions.
Currently visible buffers are put at the end of the list.
See `ido-make-buffer-list' for more infos."
  (require 'ido)
  (let ((ido-process-ignore-lists t)
        ido-ignored-list
        ido-use-virtual-buffers
        term-lists)
    (dolist (buffer (ido-make-buffer-list nil) term-lists)
      (when (string-match "^term:" buffer)
        (setq term-lists (append term-lists (list buffer)))))))