おんがえしの blog

作ったプログラムと調べた技術情報

anythingにページの概念を追加する

anythingを使い込んでいくと、たくさんのanythingソースを追加したくなってきて、段々と重くなってきます。また、anything-c-source-google-suggestやanything-c-source-locate(便利だが若干重い)、anything-c-source-emacs-functions等、普段は使わないような情報源も何らかのショートカットを利用して選択出来るようになると便利だと思いました。

anythingはまだまだ進化中のため様々な方法が提案されています、勉強になります。

  1. anything.elで表示中の情報源を選択して絞り込むコマンド - ’(rubikitch wanna be (a . lisper)) → RubikitchAnythingConfiguration内にも同様のソースがある
  2. anything-sourceを選択してanythingを起動するanything-source - IMAKADO::BLOGEmacsのグローバル名前空間から逆に引っ張り出す方法、すげー何か他にも使えそう

上記のように直接anythingソースを選択する方法も便利ですが、anything-sourcesのリストを手動で作成して、その中から選択する方法を考えてみました。
anything-select-sources-list という変数にanything-sourcesのリストを渡すと、C-1 〜 C-9 でページを切り替えることが出来ます。

既知の不具合

  1. anything-c-source-files-in-current-dir等が、ページを切り替えても情報が更新されない。anything-set-sourcesの使い方間違ってるかな?
  2. 本当は一つ一つのページに名前を付けて、ページ自身もanythingで選択できるようにしたい

ソース

(defvar anything-sources-list nil
  "anything sources list. for anything-select-sources-list")

(defun anything-select-sources-list (num)
  (anything-set-sources (nth num anything-sources-list)))

; anything-select-with-digit-shortcut とキーバインドが被ってしまっているが、他にいいキーバインドが見付からなかったのでやむなく・・・。
(define-key anything-map (kbd "C-1") '(lambda () (interactive) (anything-select-sources-list 0)))
(define-key anything-map (kbd "C-2") '(lambda () (interactive) (anything-select-sources-list 1)))
(define-key anything-map (kbd "C-3") '(lambda () (interactive) (anything-select-sources-list 2)))
(define-key anything-map (kbd "C-4") '(lambda () (interactive) (anything-select-sources-list 3)))
(define-key anything-map (kbd "C-5") '(lambda () (interactive) (anything-select-sources-list 4)))
(define-key anything-map (kbd "C-6") '(lambda () (interactive) (anything-select-sources-list 5)))
(define-key anything-map (kbd "C-7") '(lambda () (interactive) (anything-select-sources-list 6)))
(define-key anything-map (kbd "C-8") '(lambda () (interactive) (anything-select-sources-list 7)))
(define-key anything-map (kbd "C-9") '(lambda () (interactive) (anything-select-sources-list 8)))

; ソースの設定
(setq anything-sources
      (list anything-c-source-buffers
	    anything-c-source-files-in-current-dir
	    anything-c-source-recentf
	    anything-c-source-emacs-commands
	    anything-c-source-info-pages
	    anything-c-source-bookmarks
	    ))

(setq anything-sources-for-file
      (list anything-c-source-files-in-current-dir
	    anything-c-source-file-name-history
	    anything-c-source-locate))

(setq anything-sources-for-emacs
      (list anything-c-source-apropos-emacs-commands
	    anything-c-source-apropos-emacs-commands
	    anything-c-source-apropos-emacs-variables
	    anything-c-source-call-source))
  
(setq anything-sources-for-internet
      (list anything-c-source-anything-google-fallback
	    anything-c-source-hatena-bookmark))
  
(setq anything-sources-for-test
      (list anything-c-source-ruby))

; anythingソースのリスト
; anything-select-sources-listのページ番号に対応する
(setq anything-sources-list
      (list anything-sources
	    anything-sources-for-file
	    anything-sources-for-emacs
	    anything-sources-for-internet
	    anything-sources-for-test))