「Emacs」タグアーカイブ

Growlにgntp経由で通知させるgntp.elの紹介

Emacsでは、ユーザーへ何がしかの情報をお知らせする領域として伝統的にエコーエリアが使われます。例えばコマンドを途中まで入力してしばらく待っているとエコーエリアに入力されたキーが出てきます。 他にも多くのアプリケーションがエコーエリアを使っています。

過去のPCのようにディスプレイの解像度が低ければ、エコーエリアでも十分機能していましたが、現代の広大なディスプレイにおいてエコーエリアはあまりにも小さくなりすぎました。

emacs_2014-05-19_21:50:49

そして、エコーエリアは忙しすぎます。アプリケーションからはどんどん情報が送られてくる傍ら、ミニバッファとしてのお勤めも果さなければいけません。

多忙なエコーエリアですが、送られてくる情報は全て上書きされるようになっており、見ようと思ったら、すでに上書きされて*message*バッファ送りされてたりすることもしばしばです。

こういった話はEmacsコミュニティの中でも問題視されているのか、Emacs24からはDbus経由でのデスクトップ通知ライブラリであるnotifications.elが同梱されるようになりました。

notifications.el – Life is very short

ただ、Dbus自体がプラットフォームに依存するので、あまりパッとしない感じです。

もうだいぶブームが過ぎた感がありますが、やはりデスクトップ通知というと、Growlではないでしょーか。

Growl

Macでは、通知センターができたりして影が薄くなってしまっているようですが、LinuxにもWindowsにもあるのでプラットフォームを選びません。

mattn/growl-for-linux @ GitHub
Growl for Windows

それとGrowlの良い点としてgntpなるプロトコルをサポートしているというのがあります、gntpを使えばプラットフォームの差異をアプリケーション側で吸収できます。

というわけで、今回はそのgntpをEmacsから話せるようにするgntp.elの紹介です。

インストール

MElPAにレシピがあるので、M-x list-packageでどうぞ。

wget派のあなたは、GitHubのサイトからファイルを直接落としてください。

tekai/gntp.el

使い方

まず、通知するアプリケーションをGrowl側に登録しておく必要があるので、 gntp-register-alist に名称やアイコンの情報などを設定しておきます。

(setq gntp-register-alist
      '((org-notify
         :display "Org-mode notification"
         :enabled t
         :icon "http://raw.githubusercontent.com/myuhe/org-gcal.el/master/emacs.png")
        (alert
         :display "org-gcal"
         :enabled t
         :icon "http://raw.github.com/myuhe/org-gcal.el/master/org.png")))

後は、 M-x gntp-register とすれば、登録されます。

通知は、 gntp-notify で実行されます

(gntp-notify 'alert "Emacs message"
              "HELLO WORLD"
              "localhost")

gntp-notify の引数は 順に

  • gntp-register-alist で登録した名称のシンボル
  • タイトルを表す文字列
  • 内容を表す文字列
  • 接続先を示す文字列(ローカルマシンなら “localhost”)

のようになっています。

DiredやOrg-modeのテーブルをシマシマにするstripe-bufferの紹介

表形式の情報が単色の画面に羅列されていると、行方向の情報を追うのが結構大変です。

その点, MacのfinderやiTunesなどは行がシマシマになってて、とても見やすいです。

features_player_organize_screen.jpg

これ、Emacsにも欲しいなーと思ったら、 stripe-buffer というものがありましたので、紹介します。

stripe-bufferとは

diredや、org-modeのテーブルをシマシマにしてくれます。

sabof/stripe-buffer

diredだと

screenshot-08.png

org-modeでは、こんな感じになります。

screenshot-09.png

自動的にシマシマにするには それぞれのフックポイントにひっかけとけば良いみたいです。

(add-hook 'dired-mode-hook 'stripe-listify-buffer)
(add-hook 'org-mode-hook 'turn-on-stripe-table-mode)

Dired厨の方などは、とかく便利だと思います。

Rのデータビューワ ess-R-data-view.elというのを作りました

Rを使っているとオブジェクトの中に入っているデータを確認したり眺めたりしたいと思うことが頻繁にあります。

こういった欲求を満たすためにess-R-object-popup.elというものを以前作ったのですが、これはあくまでオブジェクトのサマリーをチラ見することが目的であって、中身を細かく確認するものではありませんでした。 統計量を見るだけでもデータの特徴をある程度把握することはできるのですが、やはり生のデータを目視するのにはかないません。

生データを目視したいという需要は少なからずあるようで、RStudioでもデータビューワがあります。一方のEmacsですが、ESSにはオブジェクトを俯瞰できるrdiredというものがあるものの生のデータを眺める機能はなくて、Rのインタラクティブシェルでズラズラ出力しては眺めるという程度くらいしかできませんでした。まあこれでも良いんですがテキストが整形されているだけですし、どんどん流れていってしまうので、操作性も良くありません。

というわけで、こういった不満を解消すべくデータビューワを作ってみました。ess-R-data-view.elといいます。

インストール

本体はGitHubに置いてます。

myuhe/ess-R-data-view.el · GitHub

いろいろと依存しているのでEmacs24以降であれば、package.elを使ってインストールするのをおすすめします。MELPAに登録してもらってますので、次のような感じでpackage-archivesにMELPAを登録しておけば、、、

(add-to-list 'package-archives
  '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)

M-x list-packages などとして ess-R-data-view を選べばサクッとインストールできると思います。

使い方

M-x R としてRのインタラクティブシェルを起動させます。この状態でデータ名の上にキャレットを置いた状態で M-x ess-R-dv-ctable を実行します。

例えば、バンドルされているデータセット、irisでこのような操作をすると、次のようなバッファがポップアップしてくるかと思います。このバッファの中ではおなじみのn,p,f,b またはj,k,h,lに移動のコマンドがバインドされています。また、ヘッダーも固定されているので、ヘッダーとデータの対応が非常にわかりやすくなります。

https://raw.github.com/myuhe/ess-R-data-view.el/master/image/ctable.png

ess-R-data-view では、データフレームとマトリックスでこのような表が表示されるようになっています。ベクトルなど対応していないデータの場合、次のようなエラーメッセージがポップアップします。

https://raw.github.com/myuhe/ess-R-data-view.el/master/image/popup.png

M-x ess-R-dv-ctable の代わりに M-x ess-R-dv-pprint を実行すると次ようなバッファがポップアップします。

https://raw.github.com/myuhe/ess-R-data-view.el/master/image/pprint.png

このバッファにはボーダーもありませんし、ヘッダも固定されていませんが、データが多いときに軽快に動作するので重宝するのではないかと思います。データの大きさ次第でこちらを選択すると良いかと思います。

この機能を使いはじめると頻繁に使うことになるかもしれません。そうなるといちいちミニバッファにコマンドを入力するのが面倒くさくなってきます。自分のところでは、次のような感じでキーバインドさせて使ってます。

(define-key ess-mode-map (kbd "C-c v") 'ess-R-dv-ctable)
(define-key ess-mode-map (kbd "C-c V") 'ess-R-dv-pprint)

これからの予定

データフレームとマトリックスにしか対応していないので、他のデータをどうしようかと少し考えていました。特にリストとか配列あたりはhelmインターフェイスで掘っていって最後はess-R-data-viewで表示させたりすると素敵そうです。 とは言うもの現状でかなり満足してしまったというのと、そもそもRをめっきり使わなくなってしまったので、恐らくこれ以上機能を追加することはないと思います。

ctableはすごいということを言いたかった

今回のess-R-data-view.elを作りはじめたのは、実はctable.elを使って何か作ってみたかったというのがとても大きい理由だったりします。 実際、使ってみてかなり素敵なライブラリでした。ctable.elについては、また別の機会にちゃんと書こうと思います。

Google Reader代替はEmacsなのではないでしょうか

Google Reader終了のお知らせは、いち愛用者として非常に衝撃的でした。

Google Reader終了 ― 結局のところ「RSS」は一般の人が必要とする情報収集手段ではなかった | TechCrunch Japan

なぜGoogle Readerだったのかと改めて振り返りますと、シンプルな作りもさることながら、やはり豊富なショートカットが重要なファクターだったような気がします。 フィードの移動や既読の管理など、Emacsさながらのキー操作でサクサク読み進むことができました。

ん?「Emacsさながら」?

それ、いっそのことEmacsでよくね?

という結論に達しそうなので、Emacs上でRSSを読む方法について調べてみました。

newsticker

newstickerはEmacsに同梱されているRSSリーダーです。既読の管理や記事間の移動、ブラウザで開くなどなどGoogleReaderでできていたこともひととおりはできそうです。また、非同期でRSSを読みこめるというのも、なかなか嬉しいポイント。Emacsで使うなら、まずこれから試してみると良いのかも。

賢者の漬け物石: Emacs 上で RSS フィードをチェックする (Newsticker)
Emacs 内で使える RSS reader をちょっと使ってみる – とりあえず暇だったし何となく始めたブログ
EmacsWiki: News Ticker

Gnus

Gnusといえば、Emacs同梱のニュースリーダーなわけですが、RSSリーダーとしても機能します。バックエンドとして用意されているnnrssを使ってopmlを読みこめば、簡単にフィードを登録することができます。使うには

(require 'nnrss)

として、M-x nnrss-opml-import を実行。読みこみたいOPMLを指定すれば、グループモードに読みこんだRSSの一覧が出てきます。Gnusについてはkhikerさんが詳しい記事を書かれているので、そちらを見ていただくのが良いかと思います。

GnusをRSSリーダとして使うメリットとしては、メールの読みかきとシームレスに使えるというのと、Gnusを常用しているならば、使いかたをいちから覚える必要がないということでしょうか。

Gnusを全く使ったことがないというのであれば、あえて選択する意味はないかもしれません。

org-feed

あのorg-modeもRSSリーダーとして機能します。わざわざOrg-modeを使わずとも良い気がしますが、Org-modeジャンキーはとにかくOrg-modeで構造化しないと気がすまないのです。 使いかたとしては、org-feed-alistにフィードを連想配列としてつっこんでいけば良いようです。

MobileOrgと合わせて使えば、iPhoneやAndroidと情報を共有できそうですね。うーん、これは以外と良いかも。

org-feed.el – add RSS feed items to Org files
Emacs org-modeを使ってみる: (22) RSSフィードを取り込む – 屯遁のパズルとプログラミングの日記

ニュースグループとして読んでみる

gweneというサービスを使うとRSSをニュースグループに変換することができます。

Read RSS Feeds Via NNTP

これを使えば、MewやWanderlustなどのMUAやemacs-w3mのshimbunでRSSを読むことができます。

フィードの登録がやや面倒ですが、各アプリに使いなれている方はこういった方法もありますよ、ということで。

Richard Hoskins – Google+ – I’m using Gnus now as a replacement for Reader.  asjo h…

Emacsでいい気がしてきた

めぼしいものをザクッと紹介してきました。Emacs上でRSSを読む最大のメリットは周辺との強力な連携にありそうな気がしています。

スクラップしたい記事があれば、org-captureでサクッとスクラップ、evernote-modeでevernote-modeに保存することもできます。

記事の中にeispがあれば、読みながらevalみたいな芸当もできますね。

Dropboxのようなサービスを利用すれば、複数端末での同期も問題なさそうです。

というわけで、EmacsはRSSリーダーでした。

elispリポジトリサイト、Marmaladeの新着情報をRSS化した

elispをMarmaladeで公開される方がかなり増えてきました。

DB操作ツール Emacs DBI を作ってみた – 技術日記@kiwanami
key-combo v1.3をリリース:post-command-hookを使うelispと併用しても問題ないようにしました – むしゃくしゃしてやった
quickrun.elで開発効率アップ – Life is very short
marmaladeからmagitを入れてみた – すぎゃーんメモ
punchagan/org2blog

他のもかなり頻繁に更新されるのでちょくちょく見にいくのですが、いちいちMarmaladeのサイトに見に行くのがめんどくさいですし、たまに落ちていることも。

いずれ、RSSで出力してくれるようになるだろうと気長に待ってたのですが、なかなかその気配もないのでyahoo pipesで作ってみました。

Pipes: Marmalade

にしてもpipesのサイト、かなり重くなった気がします。yahoo、だいじょぶなんやろか。

Org-modeでリンクのfont-lockがおかしくなる問題とその対策

Org-modeで日本語を書いていると、リンクのfont-lockがおかしいことになります。
リンクの終端が空白か改行文字まで伸びてしまうのです。

http://i.imgur.com/VMS3x.png

現象からして空白で単語を区切らない日本語特有の問題だしなーと半ば諦めていたのですが、一念発起、あのorg.elの正規表現樹海を散々さまよった結果、どうにかなったので書き留めておくことにします。

といっても、たいしたことはしなくてよくて

(setq org-activate-links '(date bracket radio tag date footnote angle))

とするだけです。

詳しく知りたい方は、org-activate-linksのDocstringをどうぞ。

ずっと悶々としていたのでかなりすっきりです。

R用ウィンドウマネージャー e2wm-R.el 0.4をリリースしました

e2wmのRインターフェイス、e2wm-R.elの新しい版をリリースしました。いつものようにGithubからダウンロードしてください。

Tags · myuhe/e2wm-R.el

ちなみに、初回リリースの時は次のようなことを書いていました。

EmacsでのR開発環境をRstudio、Eclipseライクにするe2wm-R.el

それでは、新しい機能についていくつか紹介します。

グラフのサムネイルを表示するR-thumbsパースペクティブの追加

これまでに出力した画像をサムネイルで一覧表示するR-thumbsパースペクティブを新たに追加しました。R-thumbsパースペクティブは、View、Dired、そしてmainであるThumbs、三つのプラグインで構成されていて、恐らくこんな感じに表示されると思います。

http://i.imgur.com/gzcJO.png

R-thumbsパースペクティブに切りかえるにはM-x e2wm:dp-R-thumbs とします。C-c t、または(e2wmの)prefix tにもバインドされています。このパースペクティブにはimage-diredを用いているので、image-dired自体の機能も使えます。image-diredについてはInfoのEmacsにあるDiredの章image-diredの説明を参考にしてください。

このimage-dired、起動時に盛大にブロックするというとても残念な仕様となっています。@mhayashi1120 さんのimage-dired+.elと併用することを全力でおすすめします。

Emacs で画像をスライドショーしたりカタログ表示したりする – 戯れ日記

データフレームの中身とかをポップアップするe2wm:dp-R-popup-objの追加

データの中身を確認する術としては、ess-R-object-popup.elとかがあったのですが、これはあくまでサマリーを表示するだけだったので、データを直接見ることはできませんでした。

ユースケースとしては、データの中身を個々に確認したいということもままありそう、というかよくあったのでsubウィンドウにデータを表形式で表示する関数を追加しました。

https://cacoo.com/api/v1/diagrams/7zWvpuWS9vMOmMAu-2D2F6.png

デフォルトではC-c v、または(e2wmの)prefix vにバインドされています。データをさらっと確認したい時はess-R-object-popup.el、がっつり確認したい時はe2wm:dp-R-popup-objというような感じで使い分けると良いと思います。

May the force with C-g …

popwin.elのC-gフォースがあまりにも羨ましかったので、subウィンドウをC-gで閉じられるようにしてみました。popwin.elのコードを大幅に使わせてもらっています。

今回新たに追加した、e2wm:dp-R-popup-objやヘルプなどsubウィンドウを使うことは結構あると思いますが、常時表示させておくような代物でもありません。見なくなったらC-gでサクッと閉じてウィンドウのスペースを有効活用しましょう。

imgur.comにグラフをアップロードする

R-thumbsパースペクティブはimage-diredをベースにできているので、昨日紹介したimgur.elと併用することで画像ホスティングサイトのimgur.comにサクッとグラフをアップロードすることができます。

imgur.comにEmacsから画像をPOSTするimgur.el

すでにimgur.elをインストールされている方は、R-thumbsパースペクティブで投稿したいグラフにキャレットを合わせ「C-c C-u」と押してください。

imgur.comに画像が投稿されて、Anythingの候補選択バッファが表示されると思います。

ほかにも諸々のバグフィックスをやっています。すでに使われていた方も是非アップデートしてみてください。

imgur.comにEmacsから画像をPOSTするimgur.el

というのを作ってみました。もともとはRから出力した画像を気軽にアップできたらいいなと思ってe2wm-R.elの機能の一つとして作っていたのですが、作っているうちにいろいろと夢がふくらんできたので、e2wm-R.elとは独立してリリースすることにしました。

インストール

package.elをお使いの方はMarmaladeを利用したインストールがとても手軽です。M-x list-packages として imgur.el を探してインストール。後は再起動するだけで使えるはずです。

Marmaladeからのインストールについては以前書いた日記が多少参考になると思います。

Marmaladeはお手軽感が素敵なEmacs Lispのリポジトリサイト

そうでない方は、GitHubからimgur.elを落としてきて、ロードパスの通ったところに置いてください。

myuhe/imgur.el

それとanything.elに依存していますので、同様に置いておく必要があります。

後は.emacsあたりに(require ‘imgur)と書けば使えるはずです。

使い方

使い方はさらに簡単。M-x imgur-post とするだけです。

このとき、Diredバッファかimage-diredバッファであれば、キャレット下のファイルがPOSTされます。そのどちらでもない場合は今開いているファイルがPOSTされることになります。

POSTが成功すると、Anythingインターフェイスにより得られた画像のURLをどう処理するかたずねられますので適当に選んでください。

http://i.imgur.com/KZHl5.png

これから追加したい機能

今回使っているAPIは、個人認証を必要としないためお手軽なのですが、これまでPOSTした画像などリストアップすることができません。

imgurではOauthによる個人認証のしくみがあるのですが、Oauthまわりで手こずってしまいまして、今回のリリースには見あわせることとしました。

というわけで、どなたかOauth1.0のライブラリを作ってくれる方を募集しています。

明日のsheepheadは

順番があべこべになってしまいましたが、新しくなったe2wm-R.elについて書く予定です。

バッファにアナログ時計を表示するsvg-clock.el

というのを見つけましたので、ご紹介。

インストール

ELPAにありますので、package.elお使いの方は、M-x package-install として、svg-clock.elと入力するか、M-x package-list-packagesからsvg-clockを選択してください。後はEmacsを再起動すれば、普通に使えるはずです。

それ意外の方はElPAにあるものを手動で落としてきて.emacsみたいなとこに(require ‘svg-clock)と書いといてください。

Index of /packages

使い方

M-x svg-clockするとこんな感じに表示されると思います。

http://i.imgur.com/yfKhF.png

このアナログ時計、名前のとおりSVGで書かれていて、なんと秒針がカチコチ動きます。また、SVGなので大きさをいくらでも変えることができます。

http://i.imgur.com/Xby79.png

時計屋さんみたいです。

e2wmの美人時計をsvg-clockで置きかえてみる。

e2wm.el標準の美人時計プラグインをsvg-clockに置きかえてみました。

広くなった画面を有効利用できる、Emacs内Window管理ツール e2wm.el を作ってみた。(旧名称 ewm.el) – 技術日記@kiwanami

まずは以下のコードを評価してください。

(require 'svg-clock)

(defun e2wm:def-plugin-svg-clock (frame wm winfo) 
  (let* ((buf (get-buffer-create "*clock*")))
    (with-current-buffer buf
      (unless svg-clock-timer
        (setq svg-clock-timer
              (run-with-timer 0 1 'svg-clock-update))
        (svg-clock-mode)))
    (wlf:set-buffer wm (wlf:window-name winfo) buf)))

(e2wm:plugin-register 'svg-clock
                     "SVG-clock"
                     'e2wm:def-plugin-svg-clock)

(defun e2wm:dp-code-toggle-svg-clock-command ()
  (interactive)
  (let* ((wm (e2wm:pst-get-wm))
         (prev (e2wm:pst-window-plugin-get wm 'history))
         (next (if (eq prev 'history-list)
                   'svg-clock 'history-list)))
    (e2wm:pst-window-plugin-set wm 'history next)
    (e2wm:pst-update-windows)))

後は、e2wm:dp-code-toggle-svg-clock-commandを実行するとヒストリープラグインとsvg-clockプラグインがトグルします。

http://i.imgur.com/k1NUB.png

BOSSが後ろをウロウロしている時とかに良さそうですね。

連続操作を素敵にするsmartrep.el作った

この日記はEmacs Advent Calendar jp: 2011 : ATNDの19日目です。 昨日は、おきゃんさんのelispでカップリングするcoupling.elでした。

どのキーにバインドするか

Emacsを使っていると、多くの人が経験するであろう悩みの一つにキーバインドがあります。

当たり前ですがバインドできるキーは有限で、しかも楽して打てるキーともなるとそんなに多くはないように思います。VimのようなモードをもたないEmacsでは、これは宿命のようなものです。

なので、この問題を解消する多くの拡張があって、key-chord.elsmartchr.elは使われている方も多いんではないかと思います。

ただ、どちらも万能というわけではなくて、例えば、key-chord.elは通常の入力とバッティングすることが往々にしてあるので、バインドするキーの選択にはかなり用心する必要がありますし、smartchr.elも入力パターンがトグルするという特徴上、連続する入力とかには向いていません。

こんな感じで今のところこの枯渇問題を解消する決定打というのはなくて、いろいろと組み合わせて使うのが良いんではないかと思います。

prefixキーで大丈夫か

prefixキーと組み合わせたキーをバインドするというのも、枯渇問題対策として有効な方法の一つだと思います。僕もあまり使わないC-qをprefixにしてキーバインドを定義しています。

(defvar ctl-q-map (make-keymap))
(define-key global-map "\C-q" ctl-q-map) 

また、標準のEmacsで使えるので、マークアップ言語のメジャーモードやOrg-modeなどキーバインドがたくさん定義されているモードでは、この方法でキーバインド枯渇問題を克服しています。

ただ、prefixキーによる方法も時と場合によってはかなりださいです。例えば先程挙げたOrg-mode。ヘッダー間の移動をするoutline-next-visible-headingとoutline-previous-visible-headingというのが定義されていてそれぞれC-c C-n, C-c C-pというC-cをprefixとするキーがバインドされています。

こういった移動系コマンドは複数回連続して入力することがとても多いと思いますが、このコマンドを使ってちょっと離れたヘッダーまで移動しようともなるとC-c C-nやC-c C-pという長たらしいキーを延々と入力させられることとなります。

https://cacoo.com/diagrams/D85Mnj5qnKif3HX0-4C93F.png

とてもやってられません。

smartrep.elとは

smartrep.elとは、連続して操作する際のprefixキー入力をキャンセルさせるためのelispです。 インストールには、auto-install.elをお使いの方はM-x auto-install-from-emacswiki してsmartrep.elと入力してください。Emacs24かpackage.elをお使いの方は、Marmaladeをリポジトリに登録してから、M-x list-packages としてsmartrep.elをインストールしてください。詳しいことは以前書いた日記を参考にしてください。

Marmaladeはお手軽感が素敵なEmacs Lispのリポジトリサイト

後は.emacsなどに(require ‘smartrep)と書いておけば、終わりです。

さて、言葉で説明してもなかなか伝わりにくそうなのでここからは使用例というか、自分が使っている設定を参考に説明しようと思います。

まずは、先程のOrg-modeのキーバインドで楽するために次のようなものを書きます。

(eval-after-load "org"
        '(progn
           (smartrep-define-key 
            org-mode-map "C-c" '(("C-n" . (lambda () 
                                            (outline-next-visible-heading 1)))
                                 ("C-p" . (lambda ()
                                            (outline-previous-visible-heading 1)))))))

smartrep-define-keyの引数は順に適用するキーマップ、使うprefix、そして、prefixに続けるキーと関数の連想配列の三つとなっています。

この式を評価したならば、先程のまどろっこしいキー操作は必要ありません。2回目移行の操作はprefixキーを省略することができます。

https://cacoo.com/diagrams/D85Mnj5qnKif3HX0-9BD00.png

このキーバインドをキャンセルしたい時は、C-n, C-p以外のキーをなにか入力してください。通常のキー操作に戻ります。

二画面分割時の画面移動

画面を分割して、片方にレファレンスを開き片方でコーディングなどありがちなパターンではないでしょうか。

当然キャレットはコーディングしているウィンドウにあることがほとんどでリファレンスを開いているウィンドウにいくことはあまりありません。

と言っても、ページを送ったり見えない部分を見たい時は操作する必要があるわけで。標準でもscroll-other-windowがC-M-vにバインドされていますが移動幅大きいし、あまり使い勝手がよくありません。そこで、となりのウィンドウをキャレットを移動させることなく操作できるようにしてみます。

(smartrep-define-key 
 global-map "C-q" '(("n" . (lambda () (scroll-other-window 1)))
                    ("p" . (lambda () (scroll-other-window -1)))
                    ("N" . 'scroll-other-window)
                    ("P" . (lambda () (scroll-other-window '-)))
                    ("a" . (lambda () (beginning-of-buffer-other-window 0)))
                    ("e" . (lambda () (end-of-buffer-other-window 0)))))

n,pだと1行のスクロール、N,Pで1ページ分のスクロール、a,eでバッファの先頭と最後に移動します。

Firefoxをリモート操作

先程の例と同様、ブラウザで資料などを見ながらEmacsでコーディングとか、Webプログラマの方とでしたら書いたコードの実行結果をブラウザで確認など結構やるんではないでしょうか。

ページを送ったり、リロードするだけのためにフォーカスをブラウザに移すとかめんどすぎます。Emacsからリモートでブラウザを操作できるようにしたいところです。

これを実現するにはFirefoxのmozreplとmoz.elを使うと良いです。導入などについては、以下のサイトで詳しく説明されています。

Firefox と Emacs の会話 | Amrta

Mozreplとmoz.elを導入したならば、以下のようなコードを評価します。

(autoload 'moz-minor-mode "moz" "Mozilla Minor and Inferior Mozilla Modes" t)
(moz-minor-mode t)

(defun moz-send-message (moz-command)
  (comint-send-string
   (inferior-moz-process)
   (concat moz-repl-name ".pushenv('printPrompt', 'inputMode'); "
           moz-repl-name ".setenv('inputMode', 'line'); "
           moz-repl-name ".setenv('printPrompt', false); undefined; "))
  (comint-send-string
   (inferior-moz-process)
   (concat moz-command
           moz-repl-name ".popenv('inputMode', 'printPrompt'); undefined;\n")))

(defun moz-scrolldown-1 ()
  (interactive)
   (moz-send-message "goDoCommand('cmd_scrollLineDown');\n")) 

(defun moz-scrolldown ()
  (interactive)
   (moz-send-message "goDoCommand('cmd_scrollPageDown');")) 

(defun moz-scrollup-1 ()
  (interactive)
   (moz-send-message "goDoCommand('cmd_scrollLineUp');\n")) 

(defun moz-scrollup ()
  (interactive)
   (moz-send-message "goDoCommand('cmd_scrollPageUp');")) 

(defun moz-top ()
  (interactive)
   (moz-send-message "goDoCommand('cmd_scrollTop');\n"))

(defun moz-bottom ()
  (interactive)
   (moz-send-message "goDoCommand('cmd_scrollBottom');\n"))

(require 'smartrep)
(smartrep-define-key 
 global-map "M-g" '(("n" . 'moz-scrolldown-1)
                    ("N" . 'moz-scrolldown)
                    ("p" . 'moz-scrollup-1)
                    ("P" . 'moz-scrollup)
                    ("a" . 'moz-top)
                    ("e" . 'moz-bottom)))

先程の画面分割の操作と同じような感じでFirefoxを操作できるようになると思います。

他の利用方法

smartrep.elは非常にシンプルなelispですが、いろいろと応用できるケースがあるんではないかと思います。

例えば今回紹介した移動系のコマンド意外でも、フレームやウィンドウのサイズ変更も連続的な操作が必要になりそうですし、undo、redo関係のコマンドでも結構連打している気がします。

HTMLなどのメジャーモードでは移動系のコマンドが多いので、smartrep.elを使うことでスマートに移動できるようになりそうですね。

というわけで、smartrep.elのご紹介でした。Emacs Advent Calendarはまだまだ続きます。 明日は、ken_mさん、今からとても楽しみです。