anything関数を好きな言語で実装できるanything-with-everything.el (Emacs Advent Calendar 2010 8日目)
Emacs Advent Calendar jp: 2010の8日目の記事です.
7日目はid:moozさん(そうだ Info 読もう - mooz deceives you)でした.明日はid:rubikitchさんです.
この記事では,anythingをより身近に使えるようになるanything-with-everything.elというのを書いたので,その紹介をします.
yaotti/anything-with-everything.el · GitHub
インターフェースを少し変更
@yaotti anything-with-everything.elおもろい。一点だけ。defun-anything-function-with-scriptの第1引数は関数名なのに文字列を取っているのが気持ち悪いです。ふつうにシンボルでよいかと。
2010-12-09 00:09:52 via twmode to @yaotti
を受けて,関数名を文字列ではなくシンボルで渡すように変更しました.
(defun-anything-function-with-script anything-emacswiki-changes ; "anything-emacswiki-changes"ではない "get-emacswiki-changes.pl")
これは何?
(そもそもanything.elって何?/Emacsユーザーだけど入れてない,という人はanything導入のeverything 〜3分で使えるanything.el〜 - (rubikitch loves (Emacs Ruby CUI Books))を読んでとりあえず導入して色々試してみましょう.anything-find-fileの代わりにanything-filelist+を使おう - (rubikitch loves (Emacs Ruby CUI Books))などは衝撃的だと思います.)
anything-with-everything.elというのは,anything関数をelisp以外で実装することを可能にするelispです.
anythingインターフェースはとても快適なので様々な面で使いたくなるのですが,ちょっと複雑なことをしようとするとelispがそこまで書けない/よくわからないのであきらめる,ということが多いと思います.
Web APIを叩いてパースしてあれこれやる,なんてことをしようと思うと大変そうです.使い慣れた言語ならすぐに書けるのに…
そこでanything-with-everything.elを利用すれば,好きな言語でanything関数の処理を書いてelispを1行足すだけで自分のanything関数を作ることができます.
どう使うの?
まずanything関数の処理を行うscriptを書きます.そのスクリプト(以下ではhoge.pl)が備えるべきインターフェースは
- $ hoge.pl --init=list でanythingの"選択候補"群を出力する
- 1行に1つずつ,改行区切りで標準出力に印字する
- $ hoge.pl --action=open CANDIDATE で処理を行う
- CANDIDATEというのは上の"選択候補"のことです
- 改行無しで渡ってきます
の2つです.
これだけだと何だかよくわからないので,例を.
サンプル
以下はEmacsWikiの最近更新されたURLを一覧表示し,選択するとブラウザで開くというサンプルです.
このスクリプトを~/.emacs.d/anything/scripts/以下に置き*1,以下のelispを評価します.
(require 'anything-with-everything) (defun-anything-function-with-script anything-emacswiki-changes "get-emacswiki-changes.pl")
すると,anything-emacswiki-changesという関数が定義されるので,M-x anything-emacswiki-changesとすれば実行できます.
応用例
複数ソースを利用したいときには以下のようにします.
以下のスクリプト
を同じように~/.emacs.d/anything/scripts/へ保存し,(依存するモジュールが多いので普段perlを使わない人は動かないと思います)
(require 'anything-with-everything) (defun-anything-function-with-script anything-hb-entries "get-hb-entries.pl" (("list" . "Hot Entries") ("my_entries" . "My Entries")))
を評価すると,「はてなブックマークの人気エントリ」「自分のブックマーク」の2つから候補を選択することができます.
先程のelispと違う最後のリストは,それぞれ(--initオプションの値 . ソースの名前)を表しています.
アクションは先程と同じように script --action=open CANDIDATEと実行されることを想定しています*2.
まとめ
これは unite.vim の source をお好きなスクリプト言語で書ける unite-script - はこべにっき#を見て,anythingでも同じようにやりたい!と思って書いたものです.id:hakobe932++
スクリプトがやることは「候補を改行区切りで出力する」「その中の1つを引数に取って実行する」の2つなのでelispの知識がなくても簡単に実行/検証することができます.
これを使って面白い/便利なanything関数を作ってみてください.何かあればtwitterの@yaottiまで.
Emacs Advent Calendar 2010の明日9日目は,anything.elで有名なid:rubikitchさんです.
anything-mac-itunes.elというのを書きました
unite.vim の source をお好きなスクリプト言語で書ける unite-script - はこべにっき#を見て、エディタからiTunesの曲をインクリメンタルに絞り込んで再生できると便利だなーと思ったので
anything的にiTunesの曲を検索+再生できるelispを書きました。
Anything interface for iTunes (Mac only) — Gist
曲名の取得や再生にapplescriptを使っているので、名前からわかるようにMacでしか動きません。
上のファイルをパスの通った適当なところに置いて
(when (eq system-type 'darwin) (require 'anything-mac-itunes) (global-set-key (kbd "C-c m") 'anything-mac-itunes) (global-set-key (kbd "C-c b") 'anything-mac-itunes-back-track) (global-set-key (kbd "C-c n") 'anything-mac-itunes-next-track) (global-set-key (kbd "C-c p") 'anything-mac-itunes-playpause-track) (global-set-key (kbd "C-c c") 'anything-mac-itunes-show-current-track-info) )
と.emacsに書くと、C-c mで曲を絞り込み*1+再生、C-c pでplay/pauseなどができます。C-c cを押すと今再生している曲の情報をminibufferに表示します。
最初の一度の実行は曲名リストを作成するため時間がかかりますが、それ以降はキャッシュされます。
言語を英語にしている人は(setq anything-mac-itunes-library-name "Library")とかしてください。
Emacs+Macユーザーの方はどうぞ。
追記
Carbon Emacsだと内部文字コードがSJISらしく、曲を検索できなかったり曲名が文字化けしたりするそうです。(via @peccul)
なのでdo-applescriptにdefadivceで文字コード変換を前後に噛ませるか、CocoaEmacsにアップデートするかしないといけなさそうです。
CarbonEmacsは今後アップデートされないのでCocoaEmacsのインストールをおすすめします。
homebrewを入れてから
cp -R /Application/Emacs.app /Application/CarbonEmacs.app brew install emacs --cocoa ln -s /usr/local/Cellar/emacs/23.2/Emacs.app /Applications/Emacs.app # あとは適当に/Application/CarbonEmacs.app内から足りないelispを.emacs.dに持ってくる
*1:検索対象は曲名、アルバム名、アーティスト名
インターン終了+卒論開始
先週金曜日にて,8週間にわたるインターン+東京生活が終わりました.
自分のやりたい方向がより明確になったこと,今まで会ってきた人とは違ったタイプの凄い人達と話せたこと,自分が伸ばすべき点や足りない点について教えられ,それらについてじっくり考える機会を得られたことなど,良い経験になりました.
今までかなり適当に行動してきたことがわかったので今後は計画的に色々動いていきたいなぁ.
そして卒論テーマがGC関連のものに決まり研究室選びの時に想定していた通りのタイプの研究ができそうなので,最近は楽しく論文を読んだりしています.
C++でblosxomクローン書いた
最近C++を勉強する必要性に駆られているので勉強として書いてみた*1.
yaotti/closxom · GitHub
C++のクラスとか名前空間は始めて書いたので(TopCoderだとクラスを自分で書くことはない),結構怪しいコードになってる気がする.
に大体準拠しているはず.
最初は
- 作者: スティーブオウアルライン,Steve Oualline,望月康司,クイープ
- 出版社/メーカー: オライリージャパン
- 発売日: 2003/09
- メディア: 単行本
- 購入: 3人 クリック: 58回
- この商品を含むブログ (35件) を見る
を読んで,なんとなくわかってきたような気がしたところで(まだ1/3も読んでない)
Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者: スコット・メイヤーズ,小林健一郎
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2006/04/29
- メディア: 大型本
- 購入: 23人 クリック: 321回
- この商品を含むブログ (172件) を見る
を「どうせそのうち買うだろう」と思って買って適当に読み始めたんだけど,これが大当りだった.
コード書いてるときに浮かんだちょっとした疑問の解決策が,いくつかそのまま書かれていてとても役に立った.
先入観で「この本はある程度C++を書ける人向けだ」と思ってたんだけど,これはC++の文法がなんとなくわかってさあこれからコードを書こうという人にぴったりの本だと思う.
Googleサマーインターンシップに参加します
面接に通ったので8/9~10/1の8週間,東京でGoogleサマーインターンシップに参加します.
ソフトウェア エンジニア インターン - 新卒採用 - Google
これで今年の夏休みは消えました.
土日は空いてると思うので東京でひまな人は会いましょう.
インターンでやる内容全然わからないしやっていけるか不安だけど,六本木ヒルズ通勤が楽しみ.
はてなインターン2010の締切は明日12:00です
今年もはてなインターンの時期がやってきました.
詳しくは
はてなサマーインターン2010
はてなインターン2010もうすぐ始まります - jkondoの日記
はてなインターンの1ヶ月は精神と時の部屋状態だった件 - (programmer? yaotti)
等を参考に.
どうしようか迷ってる人はぜひとも応募すべきだと思います.