Home | Wiki | Blog | Github  

トレース: emacs
現在位置: start » emacs
このエントリーをはてなブックマークに追加

Emacs

エディタといえば,Emacsです.先人の大いなる知恵と努力が結晶となったこのエディタを使わないのは,損以外のなにものでもありません.

Mac では,GNU Emacs (nextstep版) を使います.残念ながら,Carbon Emacs は開発終了が決まっているため,Aquamacs を使うか,自分でビルドする方法があります.私は inline-patch を適用して自分でビルドしています.なお,日本語なぞ使わないという方は,デフォルト設定でビルドされたパッケージをインストールすれば手間を省けます.また,いくつかのパッケージがプリインストールされたEmacs24もあります

「派生コンテンツ一覧」

以下はそれ以外のメモ

コード共有時代の Emacs Lisp 公開作法

GoogleDocで共同編集中(どなたでも書き込めます)

  1. provide を忘れずに付ける
  2. autoload マジックコメントを適切に付ける
  3. global-set-key を適切に使う

provide を忘れずに付ける

Github に作成した elisp を公開すると, emacsmirror がフォークしてくれて emacsmirror-rcp が el-get 用のレシピを自動で作ってくれる(ことがある).もし provide が書かれていないと,このレシピを使って elisp をインストールするユーザが Emacs を起動できなくなる.

autoload マジックコメントを適切に付ける

autoload マジックコメントが付いた関数は,自動的に autoload 関数に組み込まれた設定が作成され,loaddefs.el に記述される.パッケージを require せずとも,autoload に記述した関数が呼ばれると自動でロードされる.すべての関数にマジックコメントをつけるのは誤りで,必要最小限の関数にコメントを付けるべき.

;;;####autoload
(defun hoge ()
  (message "hoge"))

global-set-key を適切に使う

global-set-key を使って,むやみにキーバインドを施した elisp を公開すると,ユーザの既存環境と衝突することがある.解決方法として,マニュアルを作成し,推奨設定を明記する,もしくは,マイナーモード化して define-key を使うことが考えられる.

世界時刻を確認する

http://kanis.fr/hg/lisp/ivan/wclock.elが使えます.

q の挙動が好みでなかったので,次のように書き換えて使っています.

M-x wclock でポップアップして, q で閉じます.

(defvar wclock-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "q" 'wclock-close)
    map)
  "Keymap of the wclock mode")
 
(defun wclock-close ()
  (interactive)
  (let
      ((w (get-buffer-window wclock-buffer-name)))
    (when w
      (delete-window w))))

[Bongo] iTunes の代わりに Emacs を使う

Date: [2012-01-10 Tue]

Emacs を使った作業中に iTunes で音楽を流している人は,Bongo を利用すると iTunes を起動しなくて済みます!動画の再生にも対応しています.

Bongo のインストール

https://github.com/dbrock/bongo からダウンロードして,bongo.el を load-path に置きます.

次に .emacs に以下のコードを追加します.

(autoload 'bongo "bongo"
  "Start Bongo by switching to a Bongo buffer." t)

また,VLC や MPlayer が置かれている場所を指定しておく必要があります.exec-path を設定しておきましょう.

私の環境はMacで,mplayer は MacPorts を使ってインストールしています.以下の設定用コードはあくまで参考ということで.

(defun load-path-setter (path-list target-path)
  (dolist (x path-list) (add-to-list target-path x)))
(load-path-setter
 '("/opt/local/bin" "/usr/local/bin"
   "/Applications/pTex.app/teTeX/bin"
   "/Users/taka/Applications/Viewer/VLC.app/Contents/MacOS")
 'exec-path)

プレイヤーを選択する

Bongo は VLC の利用を推奨しています.以前は mplayer へのインターフェイスが提供されていましたが,ライセンス問題を回避するためにサポートしなくなりました.それでも mplayer を使いたい場合は,bongo-mplayer.el をインストールします1)

そのままだと,m4aとm4vを再生できないので,少し修正します.bongo-mplayer.el の50行目あたりに,m4aとm4vを追加します.

:matcher '((local-file "file:" "http:" "ftp:")
           "m4a" "m4v" "ogg" "flac" "mp3" "mka" "wav" "wma"
           "mpg" "mpeg" "vob" "avi" "ogm" "mp4" "mkv"
           "mov" "asf" "wmv" "rm" "rmvb" "ts")

最後に bongo-mplayer.el を読み込み,vlc よりも優先して使うように設定します.

(require 'bongo-mplayer)
(setq bongo-enabled-backends '(mplayer))

Bongo を使ってみる

起動は, M-x bongo です.起動すると,Bongoの音楽ライブラリが表示されます. i を押して,任意のメディアを追加します.初期起動ではライブラリは空です.

例として hoge.m4a と X_MEN.m4v を追加すると,ライブラリに表示されます.なお,ディレクトリを指定すると,そのディレクトリに含まれる複数のメディアファイルを,一度に追加できます.

追加したメディアを選択して ENT を押すと再生されます.同時に,モードラインにコントローラが表示されます.

動画の再生も可能です.X_MEN.m4v を ENT で再生させると,新しいフレームがポップアップします.(わざと黒い画面にしています)

再生/停止/早送りなどの制御は,モードラインのコントローラを使います.マウスのホイール機能でも早送り/巻き戻しが可能なので,意外と操作性も良いです.次の曲に移動するには,コントローラの早送りボタンを右クリックします.

再生済み/訪問したメディアは,プレイリストバッファに表示されます.dired と連携しているので( d を押す. h で戻る),メディアファイルの入ったフォルダを移動しながらプレイリストを作れます.

さらに詳しい操作は,READMEをご覧下さい.

ライブラリ/プレイリストを保存する

ライブラリの保存は,Bongo ライブラリバッファを保存するだけです.すなわち,*Bongo Library* バッファで C-x C-s するだけです.ファイル名を,hoge.bongo-library のような拡張子にしておくと,いつでも Bongo ライブラリバッファとして開くことが可能です.

プレイリストの保存は, hoge.bongo-playlist のような拡張子にしておけばOKです.

hoge.bongo と拡張子を指定することもできますが,デフォルトではライブラリとして扱われます.

プレイリストで連続再生する

Bongo ライブラリバッファは,再生する対象のメディアをリストしているだけ(のよう)です.一方,プレイリストにあるメディアは連続再生してくれます.

プレイリストにメディアを追加するには,

  • Bongo ライブラリバッファで =e= を押して,選択しているメディアをプレイリストに格納する
  • =M-x bongo-sprinkle-mode= を有効にして,自動的にプレイリストに登録されるようにする

の方法があります.

Bongo ライブラリバッファを開いている状態で h を押すと,*Bongo Playlist* バッファが開くので, M-x bongo-sprinkle-mode でマイナーモードを有効にします.数曲がライブラリから選択されて2),プレイリストに追加されます.ENTで再生を開始すれば,あとは自動的にライブラリからメディアが抽出されて順次プレイリストに追加されます.

連続再生の手順をまとめると,

  1. 保存しておいた hoge.bongo-library を開く
  2. *Bongo Playlist* バッファを開く(=h= を押す)
  3. =M-x bongo-sprinkle-mode= でマイナーモードを有効にする
  4. 再生を開始する(=ENT= を押す)

プレイリスト自体を保存している場合は,hoge.bongo-playlistを開いてbongo-sprinkle-modeを有効にするだけです.

スキップ再生

ライブラリ/プレイリストのバッファで s を押すと,ミニバッファにプログレスバーが表示されます. その状態で left/right を押せばスキップ再生できます.フォーカスを元に戻すには,再度 s を押します.

Bongo を org-mode から制御する

Orgバッファにあるメディアリンクを Bongo で再生できます3)

org-player.el

例のごとく load-path にインストールしたら,.emacs で読み込みます.

(require 'org-player)

org-player.el は,bongo.el に依存しているので,Bongoのインストールが必要です.

[[file:/path/to/song.mp3]]

のようなハイパーリンクがある org バッファを表示しているときに,次のコマンドを通じて Bongo を制御できます.

org-player-start/stop 再生/停止
org-player-pause/resume 一時停止/再開
volume-raise ボリュームを上げる
volume-lower ボリュームを下げる
bongo-seek-backward-10 10秒巻き戻し
bongo-seek-forward-10 10秒早送り
org-player-print-track-info アクティブなメディア情報を表示

なお,ボリュームの制御にはhttps://github.com/dbrock/volume-elが必要です.

関連情報

XEmbed を利用すると,mplayer を Emacs のバッファに埋め込むことが可能らしいです.要追加調査.

XEmbed Protocol Specification

[autoload-if-found] Emacs を高速起動する

Date: [2012-01-10 Tue]

.emacs をカスタマイズしまくると,設定ファイルが2000行なんてことになります.Emacsの起動時にすべてを評価していると非常に重くなり,3000[ms]以上かかることもよくあります.

読み込みが重いパッケージとして,Anything と Org-mode とそのカスタマイズがありますが,どちらも外すことができません.そこで,以下のテンプレートを使って,Emacsの高速起動を簡単に実現します.

テンプレート

このテンプレートには,autoloadのパワーアップ版 autoload-if-found が必要です.私は,リストで関数を渡せるようになった autoload-if-found を使っています.感謝!

Org-mode の org-capture を例にテンプレートを紹介します.

(when (autoload-if-found 'org-capture "org-install" "org-capture を呼んだら org-mode を有効化する" t)
  (global-set-key (kbd "C-c r") 'org-capture)
  (setq auto-mode-alist
        (cons (cons "\\.org$" 'org-mode) auto-mode-alist))
  (eval-after-load "org-install"
    '(progn
       (setq org-default-notes-file "~/Desktop/hoge.org")
       (setq org-capture-templates
             '(("t" "Add TODO" entry (file+headline nil "INBOX")
                "** TODO %?\n\t"))))))

何が起こるかを順番に説明します.

  1. autoload-if-found は,org-install.el が存在すると non-nil を返す
  2. 1. で nil が返ったら以下をすべて無視する
  3. 1. で non-nil が返ったら,グローバルキーと auto-mode-alist を設定する
  4. eval-after-load の中身は,org-install.el がロードされるまで評価を保留する

つまり起動時には,

  • autoload-if-found の評価
  • グローバルなキーバインドの設定
  • auto-mode-alist の設定
  • eval-after-load の評価

だけが実行され,org-install.el はロードされませんし,org-capture関連の各種設定も評価されません.

任意のタイミングで C-c r を押すと,

  1. org-capture が呼ばれ,org-install.el がロードされます
  2. eval-after-load の中身が評価され,org-capture-templates などが評価されます

以上のような仕組みです(と理解しています).

テンプレートの適用

Emacsの起動時に評価しておきたいものは,eval-after-load の前に記述しておき,あるモードに依存した変数や,カスタマイズした関数は eval-after-load の中に記述すればOKです.万が一,autoload-if-found で指定したパッケージが存在しない場合は,when 内部が全部スキップされるので,エラーが生じてもEmacsは起動します.

あるパッケージをロードするトリガーとして複数の関数を指定したい時は,次のように設定します.

(when (autoload-if-found
       '(cycle-buffer cycle-buffer-backward) "cycle-buffer" nil t)
  (global-set-key (kbd "M-]") 'cycle-buffer)
  (global-set-key (kbd "M-[") 'cycle-buffer-backward)
  (eval-after-load "cycle-buffer"
    '(progn
       (setq cycle-buffer-allow-visible t)
       (setq cycle-buffer-show-length 12)
       (setq cycle-buffer-show-format '(" <(%s)>" . " %s")))))

このようにテンプレートを使ってパッケージを設定すると, M-]M-[ を初めて押すときに cycle-buffer.el がロードされ,各種変数群が有効になります.

たまにテンプレートをうまく適用できないパッケージもありますが4),ほとんどの場合は有効で,Emacsの起動をかなり高速化できると思います.私の場合は500[ms]程度です5).なお,point-undo.el のように,Emacs起動直後から有効にしておくべきパッケージもあるので臨機応変に autoload-if-found を使いましょう.

起動時に Emacs がエラーで止まらないように require するには,

(require 'point-undo nil t)

とすればOKです.

[inline-patch] Lion で Emacs23 が落ちて困る

このパッチを使うと幸せになれるかもしれません.

inline-patch(本家+ぐぐって集めたパッチ+ハング対策

パッチの内容

  • IME-ONの時,インライン表示する
  • IME-ONの時,C-c a のようなコマンドが C-c あ になるのを防ぐ
  • Shift+hoge のとき,IME-ON状態を維持する
  • Lion でメニューバーを表示する
  • 日本語変換時に落ちないようにする

パッチの当て方

  • 最新の Emacs23 をダウンロードする(snapshotをクリック)
  • 解凍したディレクトリに移動して,同じディレクトリに inline-patch をコピーする
  • パッチをあてる
patch -p0 < ./inline_patch.patch
  • ビルドする
./configure --with-ns --without-x
make bootstrap -j1
make install -j1

nextstepディレクトリの下にEmacs.appが生成されるので,任意の場所にコピペして使う.

Anything

anything.el をインストールする

詳しくは,@rubikitch さんの記事を読んでください. ⇒ http://d.hatena.ne.jp/rubikitch/20100718/anything

anything のインストールは,auto-install をインストールするところから始まります.auto-install を利用したインストール中に,HTTP hoge のようなエラーが出たら,wget が原因の場合があります.(今思えば,exec-path をちゃんと設定していないのが原因)

(setq auto-install-wget-command "/opt/local/bin/wget")

とすれば,問題回避できます.gctさんからの情報です.

anything.el の情報源に spotlight インデックスを使う

anything-sources を直接変更することは推奨されていないので,spotlight用のanythingコマンドを設計します.

  1. anythingコマンドを追加する(.emacs などに,以下を追加)
(defun anything-spotlight ()
  (interactive)
  (anything-other-buffer
   '(anything-c-source-mac-spotlight)
   " *anything-spotlight*"))
  1. ショートカットを割り振る(.emacs などに,以下を追加)
(global-set-key [?\C-\M-S] 'anything-spotlight)

以上のような設定をすると,Ctrl-Meta+s で spotlight を情報源にして anything を動かせます.ミニバッファ(M-x anything-spotlight)でクエリを渡してから TAB でコマンドを選択,ENT でファイルを開きます.

コマンドで,Open file with default tool を選べば,Mac で設定されたデフォルトアプリが立ち上ります.

アクションの選び方に少々不満があるので,改良案を調査中です 'O'

パッケージ管理

Date: [2012-01-12 Thu]

  • TODO この章はまだドラフト段階です

auto-install

el-get

  • パッケージの所在を「レシピ」に記述する
  • 任意のURL,git,emacswiki などを指定できる

emacsmirror-rcp からレシピを導入する

2011年11月に約数千パッケージ?(重複カウントされてそう)

  1. Github に emacs-lisp のプロジェクトが立つ
  2. emacsmirror がフォークする
  3. emacsmirror-rcp がレシピを作成する

なお,emacsmirror は,emacswiki.org の git リポジトリになっている

package.el

  • Emacs24 から標準搭載のパッケージ
  • ELPA (Emacs Lisp Package Archive) で管理される
  • 登録できる elisp は,autoload のマジックコメントが施されていること
  • 代替リポジトリとして,Marmalade がある.

GNU, ELPA, and Marmalade からパッケージを導入する設定

http://emacs-fu.blogspot.com/2011/11/package-management-revisited.html

2011年11月に約870パッケージ程度.

(setq package-archives
      '(("ELPA" . "http://tromey.com/elpa/") 
        ("gnu" . "http://elpa.gnu.org/packages/")
        ("marmalade" . "http://marmalade-repo.org/packages/")))

文字コードと改行コード

Emacs において,編集中に利用している文字コードと改行コードは,常に確認することができます.Emacs の左下にて確認できます.

表示 文字コード 改行コード
E: EUC UNIX(LF)
E(Mac) EUC Macintosh(CR)
E(DOS) EUC Windows(CR+LF)
S(DOS) Shift JIS Windows
u: UTF-8 UNIX

そして,これらを切り替えるには,次の操作をします.

C-x ENT f

すると,

Coding system for saving file (default nil):

のように表示されるので,例えば Shift JIS + Windows に変えたい場合には,

Coding system for saving file (default nil): sjis-dos

とします.入力するコードは,

UNIX Macintosh Windows
EUC *euc-jp-unix* euc-jp-mac euc-jp-dos
Shift JIS sjis-unix sjis-mac *sjis-dos*
UTF-8 *utf-8-unix* utf-8-mac utf-8-dos

という対応関係にあります.慣れると分かりやすいです. (太字は自分がよく利用する組み合わせ)

Comments

1) 私の環境では,VLCでは動画を再生できず,mplayer を使う必要がありました.
2) デフォルトで5曲
3) mp3に対するorg-player-pause/resume以外未検証
4) bongo.el をうまく設定できない
5) desktop.elを使ってバッファを復元している場合は,ここまで高速にはならない.