Skip to content

Instantly share code, notes, and snippets.

@youz
Created December 22, 2011 17:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save youz/1511160 to your computer and use it in GitHub Desktop.
Save youz/1511160 to your computer and use it in GitHub Desktop.
xyttrの各種コマンド起動用 anything source
;;; -*- mode:lisp; package:xyttr.menu -*-
(eval-when (:compile-toplevel :load-toplevel :execute)
(require "xyttr")
(require "anything/anything"))
(provide "xyttr.menu")
(defpackage :xyttr.menu
(:use :lisp :editor :xyttr :anything))
(in-package :xyttr.menu)
;; 空の*anything-sources*を用意してbody部を評価するマクロ
(defmacro with-temp-sources (&body body)
`(let ((anything::*anything-sources* #0=(make-hash-table :test 'equal))
(anything::*anything-type-attributes* #0#))
,@body))
;; anything-add-sources, anything-add-attributesはマクロ展開時に
;; 引数が評価される。candidatesやactionに渡す関数に実行時のスコープを
;; 持たせられるマクロを用意
(defmacro add-src
(&key name type candidates action init move-action visible-mode)
`(let ((#1=#:srcname ,name))
(setf (gethash #1# anything::*anything-sources*)
(anything::make-anything
:name #1#
:type ,type
:candidates ,candidates
:action ,action
:init ,init
:move-action ,move-action
:visible-mode ,visible-mode
))))
;; しかしactionは関数名シンボルじゃないと実行時にエラー… 残念
;; attribute定義の方のactionは関数オブジェクト渡しても大丈夫
(defmacro add-attr
(&key type display action default)
`(let ((#2=#:disp ,display))
(setf (gethash #2# anything::*anything-type-attributes*)
(anything::make-anything-attribute
:type ,type
:display #2#
:action ,action
:default ,default
))))
;; Timelineメニュー index
(defvar *timeline-commands*
'(("Home" . user::xyttr)
("Mentions" . user::xyttr-mentions)
("Direct Messages" . user::xyttr-messages)
("Favorites" . user::xyttr-favorites)
("Retweeted by me" . user::xyttr-retweeted-by-me)
("Retweeted of me" . user::xyttr-retweeted-of-me)
("Retweeted to me" . user::xyttr-retweeted-to-me)))
;; 検索メモ取得API
(xyttr::define-api saved-search ()
:path "/1/saved_searches.json")
(eval-when (:load-toplevel)
(xyttr::xyttr-init))
(defvar *saved-search-cache* nil)
;; メニュー表示コマンド
(defun user::anything-xyttr ()
(interactive)
(with-temp-sources
;; タイムライン系コマンド
(add-src
:name "Timeline" :type "Timeline"
:candidates (lambda () (mapcar #'car *timeline-commands*)))
(add-attr
:type "Timeline" :display "Open" :default t
:action
(lambda (nm)
(let ((cmd (cdr (assoc nm *timeline-commands* :test #'string=))))
(call-interactively cmd))))
;; 購読中リスト
(add-src
:name "List Subscriptions" :type "List"
:candidates (lambda () (mapcar #'car xyttr::*list-subscriptions*)))
(add-attr
:type "List" :display "Open" :default t
:action (lambda (l) (user::xyttr-list l)))
;; 検索メモ
(add-src
:name "Search Memo" :type "Search"
:candidates
(lambda ()
(or *saved-search-cache*
(setq *saved-search-cache*
(mapcar (lambda (s) (xyttr::json-value s :query))
(api-saved-search))))))
(add-attr
:name "Search" :type "Search" :default t
:action (lambda (m) (user::xyttr-search m)))
(anything)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment