Visible Bookmarks 用 anything-source

anything-c-source-bm

id:rubikitch さん作の anything-c-source-bm を少し改造。
※実は、自作した後 id:rubikitchさんが既に作っていたのを発見してorz

  1. 空行に設定したブックマークがリスティングされなかったので、(適当に)修正
  2. annotation を表示するようにした
(defvar anything-c-source-bm
  '((name . "Visible Bookmarks")
    (init . anything-c-source-bm-init)
    (candidates-in-buffer)
    (action . (("Goto line" . (lambda (candidate)
                                (goto-line (string-to-number candidate))))))))
(defun anything-c-source-bm-init ()
  (let ((bookmarks (bm-lists))
        (valid-bm-marks)
        )
    (setq valid-bm-marks
          (delq nil
                (mapcar (lambda (bm)
                          (let ((start (overlay-start bm))
                                (end (overlay-end bm))
                                (annotation (or (overlay-get bm 'annotation) ""))
                                )
                            (if (< (- end start) 1)   ; org => (if (< (- end start) 2)
                                nil
                              (format "%7d: [%s]: %s"
                                      (line-number-at-pos start)
                                      annotation
                                      (buffer-substring start (1- end))))))
                        (append (car bookmarks) (cdr bookmarks)))))
    (with-current-buffer (anything-candidate-buffer 'global)
      (insert (mapconcat (lambda (item)
                           item)
                         valid-bm-marks
                         "\n")))))

anything-c-source-bm-ext

(defvar anything-c-source-bm-ext
  '((name . "Visible Bookmarks AllBuffers")
    (init . anything-c-source-bm-ext-init)
    (candidates-in-buffer)
    (action . (("Goto line" . anything-c-source-bm-ext-action)))))

(defun anything-c-source-bm-ext-init ()
  (let* ((bookmarks (bm-all-bookmarks))
	 (lines (mapconcat 'my-bm-format-line bookmarks "")))
    (if (null bookmarks)
	(message "No bookmarks.")
      (with-current-buffer (anything-candidate-buffer 'global)
	(insert lines)))))

(defun anything-c-source-bm-ext-action (candidate)
  (let* (
         (items (delete "" (split-string candidate " ")))
         (buffer-name (car items))
         (line-number (+ 1 (string-to-number (second items))))
        )
    (switch-to-buffer buffer-name)
    (goto-line line-number)))

;; bm-format-lineのオリジナルバージョン
;;  →annotationも表示させたいので
(defun my-bm-format-line (bm)
  (let ((buf (overlay-buffer bm)))
    (with-current-buffer buf
      (let ((string 
	     (format "%-30s %5s [%s] %s"
		     buf
		     (count-lines (point-min) (overlay-start bm))
                     (or (overlay-get bm 'annotation) "")
		     (buffer-substring (overlay-start bm) (overlay-end bm)))))
    (put-text-property 0 (length string) 'bm-buffer buf string)
    (put-text-property 0 (length string) 'bm-bookmark bm string)
    string))))

次は、保存した全てのブックマークをリスティングする anything-sourceを作りたい。

2008/9/16追記

anything-c-source-bm は、Matsuyamaさん作だとの指摘をいただきました。
「ありえるえりあ」の中の人だったんですね!
失礼しました。

そして、id:rubikitch さんが更に改良をして加えてくれたので、ありがたくパクらせて頂きます。
2008-09-13 - http://rubikitch.com/に移転しました

しかし、id:rubikitch さんの情報収集力とレスポンスの速さは脱帽です。