”E” for ... Twitter

2011-12-19

Emacs で Excel のオートフィルのようなことをする

皆さんこんにちは。ken_m あるいは @kurenai_nobuta です。

これは、Emacs Advent Calendar jp: 2011 の 20 日目の記事として書いています。昨日 19 日目は @myuhe さんの 連続操作を素敵にするsmartrep.el作った でした。明日 21 日目は /dev/null さんです。

いや、久しぶりに自分の血の気が引く音を聞きました。何故って、この記事のアップロード直前に @myuhe さんの記事を読んだからです。まさかこのタイミングでネタが被ったかと…。幸いネタはほとんど被っていなかったですが、名前は完全に被ってしまいました。@myuhe さん、ごめんなさい。悪気はなかったです。

ちなみに、私のニコニコ動画のアカウント名は null なので、明日の分ともちょっと被ってます。嗚呼…。

何を作ったのか?

今回作ったのは srep (スレップ)という小さなプログラムです。その目的は、Excel のオートフィル機能のようなことを Emacs 上で実現することです。ご存知の方も多いと思いますが、規則性のある値を持ったセルの並びを選択した後、その範囲をマウスで広げると、広げた先のセルにも値が自動的に埋まるアレです。

f:id:ken_m:20111220030805p:image

実際に動作を見てもらった方が分かると思うので、動画を作りました。ページ埋め込みのままだと小さくて何が何だか分からないと思うので、直接 YouTube で見てもらった方がいいと思います。

D

ソースは github に置いてあります。

何故作ったのか?

元々は、第 3 回の関西 Emacs 勉強会で何か発表しようと考えていた時に思いついたネタなのですが、仕事の都合もあって第 3 回でも第 4 回でも準備(あるいは参加)できず、今日にまで至ってしまいました。つまり、発表のために無理矢理ひねり出したネタで、以前から欲しかったとかではないです。ただ、思いついてから今までに、月に 1 回くらいのペースで「今これがあれば嬉しかったな」と思うことがあったので、自分の中では全く需要がないというわけでもなさそうです。

まぁ、たまには elisp も書かないと忘れる一方ですし、意思が弱くて締め切りがないとやれないタイプなので、Advent Calendar が丁度いい機会だったわけです。

名前の由来

動画でも触れていますが、srep は smart text repeater の略です。「オートフィル」というのは Emacs では別の機能のことを指すので使わない方がいいと思いますし、短くて覚えやすそうな名前がいいと考えました。何故なら、srep のような「ごくまれに便利なこともあるけれど普段はほとんど使わない」コマンドは、キーにバインドしても何にバインドしたか忘れてしまうんですよね。であれば、もう常に M-x で呼び出す事を前提に考えて、その時名前だけは思い出せるようなものにしよう、と。

今後の予定

今回は時間の都合で、本当にやりたかったところまで実装できませんでした。基本機能は完成していますが、繰り返し要素はもっと色々対応する予定だったのです。例えば、

  • 実数(今は整数にしか対応していない)
  • 時間(HH:MM:SS
  • 日付の色々な表現(2011/12/20、Dec. 20, 2011、etc)
  • 漢数字、全角数字

などなど。それぞれはちょっと時間があればすぐに実装できるのですが、この先そのモチベーションを保てるかどうか…。前述の通り、この機能が欲しかったわけではなく、elisp を書く事自体が目的だったので。


でも久しぶりに elisp を書いて楽しかったです。他の方々の記事もとても楽しんでます。皆さん、よいクリスマスを。

通りすがり通りすがり 2011/12/20 08:22 これは素晴らしい!
アイデア次第でいろいろ便利に使えそうですね。

私の環境

OSX 10.6.8
Carbon Emacs (Emacs 22.3.1)

では、91 行目の (defvar srep-repeat-functions .....) のところでエラーが発生しました。

(defvar SYMBOL &optional INITVALUE DOCSTRING)

に従って、"Functions for analyzing and repeating string." を、
それに続くリスト群の後に持ってきたら問題なく動作しました。
Emacs 23 以降のことは分からないのですが、Emacs 22 ではこうする必要があるようです。

素敵な elisp を有り難うございます。

ken_mken_m 2011/12/20 09:44 本当ですね、お恥ずかしい…。早速修正しました。ご指摘ありがとうございます。

RR 2012/02/01 00:25 素晴らしいです。
複数の連番割り当てと多彩さにいたく感激しました。

これを見てすぐにdmacro.elを思い浮かべましたが、こちらはコピーのみ。単純な連番ならdmacro.elを拡張すれば便利になるかもしれませんね。

今後のご活躍を期待しています。

ken_mken_m 2012/02/02 20:38 コメントありがとうございます。恐縮です…。

本当に単純な連番であれば、レジスタだけでできますね。
例えば、
C-u 0 C-x r n a
C-x (
C-x r i a
C-x r + a
C-x )
C-x e
C-x e
 :
 :
のように。srep を作るまでは、たまにこうしていました。