Emacs Lispテクニックバイブル

[表紙]Emacs Lispテクニックバイブル

A5判/336ページ

定価(本体2,980円+税)

ISBN 978-4-7741-4897-7

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

本書は普段Emacsを使っている人を対象に,カスタマイズをする際,ちょっとしたことをLispで書く手助けとなる本です。前作『Emacsテクニックバイブル』は,自分でEmacs Lispを書くわけではなく,すでに用意されているEmacs Lispを知ってもらい,そのまま組み込むことで,自分の環境がより便利になる本をめざしました。便利さを知ると既存のLispをカスタマイズしたり,自分でanything.elなどに組み込んで使いたいという欲が出てきます。そこで初心者にも理解できるようEmacs Lispの基礎から丁寧に解説しています。また,一度読み終わった後からでも辞書的に使えるように,目的別の逆引きリファレンスにも対応しています。

こんな方におすすめ

  • 本書はEmacsを普段から使っている人を対象に,Emacsを自分用にチューニングする方法を知りたい人

著者の一言

本書であなたをEmacs Lisp使いに進化させます。Lispは楽しい言語なので,怖がらずに挑戦してみましょう。

目次

1章 Emacs Lisp始めの一歩

1-1 ようこそEmacs Lispの世界へ

  • 1-1-1 Emacs Lispとは
  • 1-1-2 Emacs Lisp習得のメリット・目的
  • 1-1-3 Emacs Lispが得意なこと・不得意なこと

1-2 Emacs Lispを書くための設定

  • 1-2-1 auto-install.elをインストールする
  • 1-2-2 必須ファイルのインストール
  • 1-2-3 設定

1-3 文法

  • 1-3-1 括弧だらけの文法
  • 1-3-2 構成要素
  • 1-3-3 コメント

1-4 Emacs Lispプログラム実行の仕組み

  • 1-4-1 フォーム
  • 1-4-2 評価とは
  • 1-4-3 関数呼び出し
  • 1-4-4 評価の具体例
  • 1-4-5 クォート
  • 1-4-6 明確性

1-5 評価の方法

  • 1-5-1 いろいろな評価の方法
  • 1-5-2 入力補完
  • 1-5-3 コマンド呼び出し
  • 1-5-4 ミニバッファにフォームを入力して評価する
  • 1-5-5 対話的に評価する
  • 1-5-6 メモファイルにてフォームを評価し,結果を書き込む

1-6 数値

  • 1-6-1 基本的な演算
  • 1-6-2 比較
  • 1-6-3 整数の範囲
  • 1-6-4 浮動小数点数

1-7 文字列

  • 1-7-1 文字列の例
  • 1-7-2 バックスラッシュ記法
  • 1-7-3 文字
  • 1-7-4 書式文字列
  • コラム いろいろなLisp

まとめ

2章 Emacs Lispの基礎

2-1 Emacs Lispプログラムの編集方法

  • 2-1-1 S式を操作するコマンド
  • 2-1-2 インデントを整える
  • 2-1-3 paredit.elを使用する

2-2 シンボルとオブジェクト

  • 2-2-1 シンボル
  • 2-2-2 シンボルと変数・関数
  • 2-2-3 代入
  • 2-2-4 データ型
  • 2-2-5 関数名・変数名の命名

2-3 ローカル変数

  • 2-3-1 ローカル変数を定義する

2-4 コンスセル・リスト・ベクタ

  • 2-4-1 コンスセル
  • 2-4-2 リスト
  • 2-4-3 コンスセルとリストとnil
  • 2-4-4 ベクタ
  • 2-4-5 配列としての文字列

2-5 同一性と同値性

  • 2-5-1 2つの「同じ」
  • 2-5-2 同値比較
  • 2-5-3 同一比較

2-6 条件分岐

  • 2-6-1 真偽値
  • 2-6-2 条件付き実行
  • 2-6-3 条件分岐
  • 2-6-4 複数の式をひとまとめにする
  • 2-6-5 if+prognをすっきり書く
  • 2-6-6 多重条件分岐
  • 2-6-7 論理式

2-7 ループ

  • 2-7-1 条件によるループ
  • 2-7-2 リストの各要素のループ

2-8 正規表現

  • 2-8-1 正規表現とは
  • 2-8-2 基本的なメタ文字
  • 2-8-3 バックスラッシュ付きのメタ文字
  • 2-8-4 正規表現の例
  • 2-8-5 正規表現と文字列表現
  • 2-8-6 正規表現にマッチするか確かめる関数
  • 2-8-7 正規表現に一致した文字列を得る
  • 2-8-8 M-x re-builderで正規表現を対話的に組み立てる

2-9 関数定義

  • 2-9-1 関数定義の方法
  • 2-9-2 関数定義の意義
  • 2-9-3 省略可能引数
  • 2-9-4 可変長引数
  • 2-9-5 無名関数

2-10 コマンド定義

  • 2-10-1 はじめての自作コマンド
  • 2-10-2 interactive宣言
  • 2-10-3 キーボードマクロをコマンドとして使えるようにする

2-11 ロード

  • 2-11-1 Lispファイルの置いているディレクトリを指定する
  • 2-11-2 Lispファイルをロードする
  • 2-11-3 Lispファイルを1度だけロードする

2-12 バイトコンパイル

  • 2-12-1 バイトコンパイルとは
  • 2-12-2 Lispファイルをバイトコンパイルする
  • 2-12-3 保存時に自動バイトコンパイル

2-13 スタイル

  • 2-13-1 コメントの付け方
  • 2-13-2 インデント

まとめ

3章 バッファ・ファイル

3-1 バッファ

  • 3-1-1 テキストを入れる器
  • 3-1-2 バッファとファイル
  • 3-1-3 表示用・作業用バッファ
  • 3-1-4 カレントバッファとは
  • 3-1-5 バッファオブジェクトを得る
  • 3-1-6 カレントバッファを切り換える

3-2 バッファの作成・削除

  • 3-2-1 バッファを作成するケース
  • 3-2-2 バッファを新規作成する
  • 3-2-3 ファイルをバッファに読み込む
  • 3-2-4 バッファを削除する

3-3 バッファ出力

  • 3-3-1 出力関数
  • 3-3-2 文字列に出力する
  • 3-3-3 バッファに文字列を出力して表示する

3-4 バッファ情報の取得

  • 3-4-1 一時的にカレントバッファを切り換える
  • 3-4-2 バッファ名
  • 3-4-3 メジャーモード
  • 3-4-4 バッファローカル変数
  • 3-4-5 ポイントの情報を得る

3-5 バッファ編集

  • 3-5-1 バッファに書き込む内容を得る
  • 3-5-2 カーソル移動
  • 3-5-3 削除
  • 3-5-4 一時的な状態変更
  • 3-5-5 検索
  • 3-5-6 置換
  • 3-5-7 キルリング
  • 3-5-8 編集領域を限定する

3-6 ミニバッファ

  • 3-6-1 文字列を読み込む
  • 3-6-2 補完付き文字列読み込み
  • 3-6-3 二択選択
  • 3-6-4 その他の入力関数
  • 3-6-5 複雑なinteractive指定

3-7 リージョンとマーカー

  • 3-7-1 リージョン
  • 3-7-2 マーカー

3-8 ファイル

  • 3-8-1 パス名操作
  • 3-8-2 ディレクトリ内のファイルを得る
  • 3-8-3 ファイルテスト
  • 3-8-4 バッファにファイルの内容を挿入する
  • 3-8-5 保存する
  • コラム ファイルサイズ・バッファサイズ・バイト数

まとめ

4章 ウィンドウ

4-1 ウィンドウの分割

  • 4-1-1 ウィンドウとフレーム
  • 4-1-2 分割する
  • 4-1-3 分割されているかを確かめる

4-2 ウィンドウの削除

  • 4-2-1 選択されたウィンドウを削除する
  • 4-2-2 他のすべてのウィンドウを削除する

4-3 ウィンドウの選択

  • 4-3-1 ウィンドウを選択する
  • 4-3-2 他のウィンドウを選択する

4-4 ウィンドウとバッファ

  • 4-4-1 ウィンドウに表示中のバッファを得る
  • 4-4-2 バッファを表示しているウィンドウを得る

4-5 バッファの表示

  • 4-5-1 バッファを切り換える
  • 4-5-2 ユーザに読ませる目的でバッファを表示する
  • 4-5-3 表示方法をカスタマイズする

4-6 ウィンドウとカーソル

  • 4-6-1 ウィンドウ上のポイント
  • 4-6-2 現在行の表示位置を設定する

4-7 ウィンドウの大きさ

  • 4-7-1 高さと幅を得る
  • 4-7-2 ウィンドウを広げる・縮める
  • 4-7-3 ウィンドウを適切な大きさにする

4-8 ウィンドウ構成

  • 4-8-1 ウィンドウ構成を保存・復元する
  • 4-8-2 表示関数を無視する

まとめ

5章 様々な関数

5-1 数値

  • 5-1-1 四捨五入・切上げ・切り捨て
  • 5-1-2 乱数

5-2 文字列

  • 5-2-1 部分文字列
  • 5-2-2 文字列を分割する
  • 5-2-3 大文字小文字を変換する
  • 5-2-4 正規表現置換を行う

5-3 シンボル

  • 5-3-1 シンボル・文字列を変換する
  • 5-3-2 シンボルをポインタとして使う

5-4 リスト

  • 5-4-1 同一要素から構成されるリストを作成する
  • 5-4-2 carとcdrの連続適用の省略形
  • 5-4-3 リストにリストを追加する
  • 5-4-4 リストの要素をひっくり返す
  • 5-4-5 ソートを行う
  • 5-4-6 要素をリストから削除する

5-5 ベクタ

  • 5-5-1 同一要素から構成されるベクタを作成する
  • 5-5-2 シーケンスを結合したベクタを作成する

5-6 シーケンス

  • 5-6-1 シーケンスをコピーする
  • 5-6-2 シーケンスの長さを得る

5-7 型変換

  • 5-7-1 型変換関数一覧

まとめ

6章 Emacs Lisp応用

6-1 Emacsオンラインヘルプ

  • 6-1-1 Emacs内の検索エンジンを利用する
  • 6-1-2 関数・変数を調べる
  • 6-1-3 シンボルを検索する
  • 6-1-4 定義を調べる
  • コラム anything.elを使う

6-2 連想リスト

  • 6-2-1 連想リストとは
  • 6-2-2 キーからペアを得る
  • 6-2-3 値からをペアを得る
  • 6-2-4 キーから値を得る
  • 6-2-5 正規表現で場合分けをする

6-3 ハッシュテーブル

  • 6-3-1 ハッシュテーブルとは
  • 6-3-2 ハッシュテーブルを作成する
  • 6-3-3 ハッシュテーブルを使う
  • 6-3-4 キー・値のリストを得る

6-4 属性リスト

  • 6-4-1 属性リストとは
  • 6-4-2 シンボルと属性リスト

6-5 関数プログラミング

  • 6-5-1 関数オブジェクト
  • 6-5-2 関数オブジェクトとシンボル
  • 6-5-3 リストの各要素を関数の引数にする
  • 6-5-4 リストの各々の要素を処理する
  • 6-5-5 リストの各要素をつなげた文字列を作成する
  • 6-5-6 動的に関数を呼び出す
  • 6-5-7 複数の関数を連続実行する
  • 6-5-8 成功・失敗するまで関数を連続実行する

6-6 エラー処理

  • 6-6-1 エラーメッセージ・エラーシンボル・原因
  • 6-6-2 エラーメッセージを表示して終了する
  • 6-6-3 シグナルを発信する
  • 6-6-4 エラーを無視する
  • 6-6-5 エラーを捕捉する
  • 6-6-6 後片付けをする

6-7 正規表現応用

  • 6-7-1 文字列の集合にマッチする正規表現を作成する
  • 6-7-2 S式から正規表現を作成する

6-8 評価機

  • 6-8-1 readとeval
  • 6-8-2 オブジェクトを永続化する

6-9 マクロ定義

  • 6-9-1 マクロとは
  • 6-9-2 マクロのタイプ
  • 6-9-3 マクロとバイトコンパイル
  • 6-9-4 バッククォート
  • 6-9-5 マクロを定義する
  • 6-9-6 マクロ制御構造のインデントを整える
  • 6-9-7 評価回数と変数束縛の問題

6-10 互換性確保

  • 6-10-1 Emacsのバージョンを得る
  • 6-10-2 不足している関数を補う
  • 6-10-3 プラットフォームを得る
  • コラム elisp勉強法

まとめ

7章 Common Lispマクロ

7-1 (require 'cl)の是非

  • 7-1-1 cl.elとは
  • 7-1-2 (require 'cl)は禁止されている
  • 7-1-3 実際のところ
  • 7-1-4 本書では

7-2 関数・マクロの仮引数の拡張

  • 7-2-1 リスト構造を分解する
  • 7-2-2 関数定義を拡張する
  • 7-2-3 マクロ定義を拡張する

7-3 汎変数

  • 7-3-1 setqを拡張する
  • 7-3-2 letを拡張する
  • 7-3-3 インクリメント・デクリメントを行う
  • 7-3-4 リスト要素を追加・削除する

7-4 クロージャー

  • 7-4-1 ダイナミックスコープとレキシカルスコープ
  • 7-4-2 レキシカルスコープを使う
  • 7-4-3 クロージャーを使ってムダなグローバル変数を減らす

7-5 一時的な関数定義

  • 7-5-1 一時的な関数再定義を行う
  • 7-5-2 ローカル関数を定義する
  • 7-5-3 letfでも関数再定義を行う
  • 7-5-4 アドバイスされた関数に対応する

7-6 値による場合分け

  • 7-6-1 式の値による場合分けを行う
  • 7-6-2 型・数値の範囲による場合分けを行う

7-7 ブロックとジャンプ

  • 7-7-1 レキシカルスコープの非局所脱出メカニズム
  • 7-7-2 暗黙のブロック
  • 7-7-3 ダイナミックスコープの非局所脱出メカニズム

7-8 構造体

  • 7-8-1 構造体とは
  • 7-8-2 構造体を定義する
  • 7-8-3 構造体のインスタンスを作成する
  • 7-8-4 構造体のメンバにアクセスする

7-9 loopマクロ

  • 7-9-1 loopマクロとは
  • 7-9-2 loopマクロの構造
  • 7-9-3 典型的なパターン
  • 7-9-4 もう少し数値ループ
  • 7-9-5 もう少し繰返し節
  • 7-9-6 もう少し演算節
  • 7-9-7 節の解釈のされ方と並列ループ
  • 7-9-8 ローカル変数作成
  • 7-9-9 事前処理と事後処理
  • 7-9-10 条件分岐
  • 7-9-11 ループからの脱出
  • コラム Common Lispのシーケンス関数

まとめ

8章 テスト・デバッグ

8-1 Emacsを呼び出してテスト

  • 8-1-1 まっさらな環境でEmacsを立ち上げる
  • 8-1-2 save-load-path.elのインストール
  • 8-1-3 emacs-testスクリプトを作成する

8-2 ユニットテスト

  • 8-2-1 ユニットテストとは
  • 8-2-2 el-expectations.elのインストール
  • 8-2-3 ユニットテストの構造
  • 8-2-4 簡単なユニットテストを書く
  • 8-2-5 まっさらな環境でユニットテストを実行する
  • 8-2-6 スタブを使う
  • 8-2-7 モックを使う

8-3 関数のトレース

  • 8-3-1 トレーサとは
  • 8-3-2 トレーサを使う
  • 8-3-3 再帰呼び出しとトレーサ
  • 8-3-4 複数の関数をまとめてトレースする

8-4 デバッガ

  • 8-4-1 エラー時にデバッガを開くようにする
  • 8-4-2 エラーを起こしてデバッガを開く
  • 8-4-3 バイトコンパイルとデバッガ
  • 8-4-4 デバッガでの操作

8-5 デバッグ(edebug)

  • 8-5-1 edebugとは
  • 8-5-2 edebugを有効・無効にする
  • 8-5-3 基本的な使い方
  • 8-5-4 ブレークポイント
  • 8-5-5 評価リスト

8-6 ベンチマーク

  • 8-6-1 実行時間を計測する
  • まとめ

    9章 Emacsの挙動を変更する

    9-1 キーマップ設定

    • 9-1-1 キーを割り当てる
    • 9-1-2 キー割り当てを簡潔に記述する
    • 9-1-3 キーシーケンスを割り当てる
    • 9-1-4 プレフィクスキーを新設する
    • 9-1-5 キーマップを作成する

    9-2 特殊なキー割り当て方法

    • 9-2-1 one-key
    • 9-2-2 key-chord

    9-3 フック

    • 9-3-1 フックとは
    • 9-3-2 フックを登録・削除する
    • 9-3-3 フックを実行させる

    9-4 アドバイス

    • 9-4-1 アドバイスとは
    • 9-4-2 アドバイスを定義する
    • 9-4-3 beforeアドバイス
    • 9-4-4 引数へのアクセス
    • 9-4-5 afterアドバイス
    • 9-4-6 aroundアドバイス
    • 9-4-7 アドバイスを配置する
    • 9-4-8 有効・無効を切り換える

    まとめ

    10章 モード作成

    10-1 メジャーモードの作成方法

    • 10-1-1 まっさらなメジャーモードを作成する
    • 10-1-2 メジャーモードに肉付けをしていく
    • 10-1-3 ファイルとメジャーモードを関連付ける

    10-2 テキストに色付けをするためのメジャーモード作成

    • 10-2-1 独自フォーマットのテキストをメジャーモード化する
    • 10-2-2 UNIXの設定ファイルを自動認識させる
    • 10-2-3 ジェネリックモードを作成する

    10-3 font-lockによる色付け

    • 10-3-1 font-lockとは
    • 10-3-2 ジェネリックモードで色をつける
    • 10-3-3 もう少し踏み込んだ色つけをする
    • 10-3-4 派生モードから色をつける

    10-4 マイナーモード

    • 10-4-1 マイナーモードとは
    • 10-4-2 マイナーモードとキー
    • 10-4-3 マイナーモードを定義する
    • 10-4-4 ローカルマイナーモード
    • 10-4-5 グローバルマイナーモード

    10-5 別名定義

    • 10-5-1 互換性を保つ
    • 10-5-2 関数の別名定義を行う
    • 10-5-3 変数の別名定義を行う

    まとめ

    11章 外部プログラムとの協調

    11-1 外部プログラムの実行

    • 11-1-1 外部プログラム活用のメリット
    • 11-1-2 シェルコマンドを実行する
    • 11-1-3 Emacsと同時にシェルコマンドを実行する

    11-2 外部プログラムの検索

    • 11-2-1 外部プログラムサーチパスを利用する
    • 11-2-2 外部プログラムの存在確認をする

    11-3 非同期プロセス

    • 11-3-1 非同期プロセスとは
    • 11-3-2 非同期プロセスを立ち上げる
    • 11-3-3 非同期プロセス終了時に処理を行わせる
    • 11-3-4 プロセスに文字列を送信する
    • 11-3-5 リファクタリングを行う

    11-4 外部プログラムの実行

    • 11-4-1 よく使うプログラムを登録する
    • 11-4-2 シェルコマンドを実行する関数を定義する関数を定義する

    11-5 eshellのススメ

    • 11-5-1 eshellとは
    • 11-5-2 eshellを起動する
    • 11-5-3 eshellのコマンド解釈
    • 11-5-4 リダイレクトを行う
    • 11-5-5 eshellとEmacs Lisp
    • 11-5-6 エイリアス機能を利用する

    まとめ

    12章 非同期プログラミング

    12-1 非同期プログラミングの概念

    • 12-1-1 Emacs Lispはシングルスレッド
    • 12-1-2 Emacsはマルチスレッド
    • 12-1-3 プロセスの例
    • 12-1-4 ネットワークの例

    12-2 タイマー

    • 12-2-1 未来に関数を呼び出す
    • 12-2-2 アイドルタイマーを使う
    • 12-2-3 タイマーを管理する
    • 12-2-4 次に実行する関数を指定する

    12-3 deferred.elで非同期プログラミング

    • 12-3-1 deferred.elとは
    • 12-3-2 deferred.elのインストール
    • 12-3-3 deferred.elの基本
    • 12-3-4 遅延実行の例
    • 12-3-5 プロセス
    • 12-3-6 M-!の置き換えを行う
    • 12-3-7 ネットワーク

    まとめ

    13章 anything.elで簡単アプリケーション作成

    13-1 anything.elの正体

    • 13-1-1 anything.elとは
    • 13-1-2 インストール
    • 13-1-3 候補の絞り込み
    • 13-1-4 複数のアクション
    • 13-1-5 いろいろなanythingコマンドを試す

    13-2 anythingコマンドの作成

    • 13-2-1 どういう情報源が定義されているかを調べる
    • 13-2-2 anythingコマンドを作成する

    13-3 情報源の作成

    • 13-3-1 情報源作成の流れ
    • 13-3-2 候補のリストを作成する
    • 13-3-3 アクションを設定する
    • 13-3-4 複数のアクションを設定する
    • 13-3-5 バッファの各行を候補にする
    • 13-3-6 ファイルの各行を候補にする
    • 13-3-7 型から選ぶ
    • 13-3-8 Migemoに対応させる

    13-4 実例

    • 13-4-1 M-x anything-world-time
    • 13-4-2 M-x anything-filelist
    • 13-4-3 M-x anything-timers
    • 13-4-4 M-x anything-manage-advice

    13-5 応用anythingプログラミング

    • 13-5-1 anything関数
    • 13-5-2 型のアクションを変更する
    • 13-5-4 プラグインを作成する

    まとめ

    以下に逆引きの目次(PDF)を用意いたしました。

    著者プロフィール

    るびきち

    1996年からLinuxを使い出し,EmacsとRubyに出会う。それ以来,必要な情報を素早くわかりやすい形で取り出す方法を模索し続けている。Emacsに新たな風を吹き込むべくanything.el等多数のEmacs Lispプログラムを開発。著書に「Ruby逆引きハンドブック」(シーアンドアール研究所)「Emacsテクニックバイブル」(技術評論社)他がある。