読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

Emacs Application Development #kansai_emacs

kansai_emacs #5

speaker さくらいまさし
福岡で医療系ソフトウェア研究開発をやっている
ユーザインターフェイスに注目
deferred.el skype.e Emacs asyncなどを紹介


ECB
emacsをIDEモドキにする

hown
Emacs で断片的なメモをどんどんとるための環境

emacsでアプリケーションを作る (需要あるのか?)

キーボードじゃないプログラミング環境 (手書き、iPhoneなど)
もおもしろい?

Emacsでのアプリケーション開発とは

Emacser Level

使う、設定、カスタマイズ
自前関数、コマンド<< 壁 >>
メジャーモード
Emacsアプリ

Emacsアプリ開発の難しさ

  • そもそもエディタである
    • スタートラインがはるか後方
  • データの持ち方、部品が少し独特
    • Emacs worldに慣れる

Emacsアプリ開発のとりかかり

  • スコープ
    • データをどこに保存するのか
  • 作り方、設計
    • エディタのうえでどう作るか
  • ローカル
  • グローバル
  • ダイナミック
  • レキシカル

変数をどう見るか

バッファ(ファイル、データ)
フレーム(ウィンドウ)
それぞれにデータをひもづけることが出来る
どこに変数をもってくればいいかを考える

  • セッションデータ
    • Emacsでアプリ動作中に保持しているデータ
  • 永続データ
    • Emacsが終了しても残るデータ

永続データ

  • アプリ起動時に読み込みたい
    • ローカルファイル (recentf anythingなど)
  • ネットワーク経由で読み込みたい
    • ネットワーク(navi2ch)
  • データベース
    • 外部プログラム(ほとんど無いに等しい)

セッションデータ

  • バッファにひもつけたい場合
    • バッファローカル
  • バッファにまたがる場合
    • グローバル(しょうがない)

グローバルは避けてなるべく狭いスコープ

  • 複数起動、組み合わせ
    • バッファローカル、クロージャ(起動時に入れて、グローバルだけど誰も触れない)
  • グローバルに置く(ただの変数アクセスではなく、関数経由でのアクセスに限定)
  • その他のテクニック

コントロール用バッファ、親子バッファ

どう作るのか?

Emacsの自然な形式

ほとんどのアプリがこの形

問題

  • バッファごとに独立している
    • たくさんのviewを組み合わせたいときは?
  • バッファ間の関係
    • 独立か親子関係か、全員killすべきか

magit…mainのバッファがあって、子供のバッファにデータを割り当てる

バッファがたくさんある場合のウィンドウ管理
(独自制御だと混ぜられない popwinなど)

UI部品:低レベル

  • ボタン
    • 形(face) キー マウス (keymap)
    • action-lock (ちまちまやるのは大変)
  • レイアウト
    • 固定幅フォント、ウィンドウ幅と高さ
    • 右寄せ、左寄せ、中央寄せ
  • ポップアップメニュー
    • 普通のメニュー、GUIメニュー
    • anythingなどのminibuffer系
    • popup.elなどのoverlay系

UI部品:高レベル

  • テーブル
    • みんな自前で実装している dired list-processes list-buffers
    • ctable.el (標準のテーブルを提供する)
  • ツリー
    • tree-widget (widetのパーツ、でもあまり便利じゃない)
    • dire-x.el (ファイルをツリーで表示する)
  • フォーム(の形)

フォームライブラリ widget

  • emacs標準添付
  • 歴史が古く、かなり独特
  • 作り手としては使い辛い
    • 必要なコード量が多すぎ
    • 融通が効かない
    • Hackしまくりで混ぜられない
    • webのフレームワーク相当が必要

EmacsLisp言語方面

GUIOOPによる設計が自然でノウハウも多い

  • Emacsでのオブジェクトシステム
    • defstruct eieio
    • 独自OOP実装が多い
      • luna widget ewoc (コードを見ても皆結構複雑)
      • eieioの標準添付で統一されるか?

現状のまとめ

バッファをまたぐ場合は、データのスコープやバッファ間の関係が重要
CLOS知らなくても作れるけどあとで便利
Emacs上でのUI構築はまだ発展途上
フォームを作る場合はwidgetしかない

フレームワーク (MVCモデル) の登場が待たれる!!!!

既視感

  • 画面遷移をまたぐ場合は、データのスコープや画面間の関係が重要
  • prototypeを知らなくても作れるが、後で便利

(JSによる開発とあまり変わらない?)

Emacsとそれ以外のツールを使ったアプリ開発の違いについて

アプリについては別にEmacsで動かなくてもよいものも多いが、
開発環境として見ればすごく便利だし、
逆に.netでメールアプリを作るのはしんどいしかったるいし楽しくない。

deferred.elを使えばスレッドを複数作れる