操作方法

・→ キー: 次のページへ
・← キー: 前のページへ
・↑ キー: 目次ページへ
・↓ キー: 目次ページから戻る
・目次ページでは ← → キーで一覧を移動し、クリックで選択します

cunning-mode.el

3年 情報システム分野
石川 直樹
http://usi3.com/

方針

ソースを簡略化して書く

・1年経った後でもソースを簡単に読み返せるようにしたい
・Emacs Lisp でメジャーモードの開発は初めて
・(Lisp 的に考えて)変な所があったら教えて下さい

メインヒロインの攻略を優先する

・サブヒロインに対しては冷たい選択肢を選ぶ
・このシナリオではフラグを出来るだけ立てない → 学校でのみ作業する

動機

Eclipse のチート機能
ずるすぎワロタ

チート機能とは

・定型文を瞬間的に挿入
・定型文は事前に登録する
・すごい勢いでプログラムが書ける
・典型問題に有用なクラスとか登録しておいたら…!

AutoHotkey でデモを
作ってみたらすごく快適!

TekitouSugiruInsert.ahk

$#m::
    Send, int main(void){{}{Enter}
    Send, {Tab}{Enter}
    Send, {Tab}return 0`;{Enter}
    Send, {}}{Up}{Up}{Tab}
    Return

Emacs Lisp で本格的に
作る事にした

概要

まず,
ユーザー視点から見ると…

実演

・最初の一手(jk)
・for文(fn)
・標準入力(ci)
・classを追加(cl)
・ヘッダーファイルを追加(in)
・地味に便利な中括弧({)

プログラムの方は…

ソースコードを読む前に

・「λかわいいよλ」
・PrettyLambda を使用
・「λ」→「lambda」

ソースファイルの構成

・cunning-mode.el
 プログラム本体
・dot.cunning-mode
 設定ファイル

使用ライブラリ

;; 疑似Common Lisp
(require 'cl)
;; キーの同時押しをサポート
(require 'key-chord)

cunning-mode.el

主な関数

1. insert
 → insert-subs
2. キー定義テーブル
 → 別バッファ
 → ミニバッファ
3. point-*

insert

カーソル関係の処理

insert-subs

文字列をインデントしながら挿入
@ - read-from-minibuffer
$ - カーソルをここに移動

キー定義テーブル

キーと定型文を対応付ける
2つの方法で利用可能

(setq cunning-table-wafoo
      '(("キー" "挿入したい定型文"))
        ("w" "wafoo("@", stdout);\n$"))

キー定義テーブル
→ 別バッファ

画面右に一覧表示する
1. ask-buffer
2. table-to-buffer
3. key-to-insert

キー定義テーブル
→ミニバッファ

ミニバッファに一覧表示する
1. ask-minibuffer
2. table-to-minibuffer
3. key-to-insert

point-*

適切な挿入位置を調べる
include, difine, using, class, main の前後に対応

dot.cunning-mode

設定ファイルの書き方

1. 2通りの方法でマップにキー定義
 define-key, key-chord-define
2. 3通りの方法で関数に渡す
 insert, ask-buffer, ask-minibuffer

以上でプログラムの説明は
おわり

けどそもそも,
たくさんペタペタして
何が嬉しいのか?

お勧めの使い方

TopCoder とかから
上手い人のソースを,
どんどん引用して
張り付けていく

設定ファイルにあなたの経験を蓄積して下さい

・.emacsみたいな肥大化推奨
・サンプルの設定ファイルは160行くらいしかない
→ 無断引用はまずいから省略している

本来は1000行くらい
設定してほしい

何なの? ゆとりなの?
たくさん登録しすぎたら

・コードを探すのが大変
・登録も面倒
・そもそも肥大化したキー定義テーブルは画面に収まりきらない

今すぐ実装したい機能

問題1: コードを探すのが大変

解決案: 登録したコード全てに対してisearchする機能
 → C-x-f-r みたいな
 → 一覧性も向上する

問題2: 登録が面倒

解決案: SKKの辞書ファイルみたいな管理機能
・region → ミニバッファで少し設定
・終了時に自動保存

これで発表はおわりです

ご静聴
ありがとうございました

Thanks

・天野 仁史 (id:amachang)
  S6
  プレゼンテーションライブラリ
・David Andersson
  key-chord.el
  キーの同時押しをサポート

質疑応答

Q.プログラミングの大会で使ったら反則ですよね?

A.「Eclipse使用可」としている大会なら「たぶん」大丈夫です。心配なら確認してみて下さい。 無理なら設定ファイルを印刷するといいかもしれません。

Q.それキーボードマクロで出来るよ // それレジスタで出来るよ

A.登録するのが大変です。あとたくさんのレジスタを勝手に消費するのもよくありません。

Q.Eclipse で出来る事を何でわざわざ Emacs で実装したんですか?

A.プログラミングはEmacsでやりたいからです

Q.標準キーバインドが使いにくすぎます

A.設定ファイルはあくまでサンプルなので,ご自由に編集してお使い下さい。

Q.どうして Emacs Wiki に登録しないんですか?

A.今は英語とかで質問されても答える時間がないので登録を見送っています。 時間の余裕が出来たら登録します。