*紹介 [#f0fe8d83]

Emacsはエディタとの見方が最も一般的でしょうが、Emacs Lisp言語のインタプリタともいえます。Lispを用いて際限なくカスタマイズできるため、往々にして手段と目的が逆転しがちです。おかげで各種プログラミング言語やTeXソースなどの編集支援や、MUA・WWWブラウザ等様々な機能がどこかのだれかによって実現されています。Muleと呼ばれているものはEmacsを多言語対応にしたものであり、本質的には同じものです。(Emacs20.1で統合されたそうですが、詳しくは知りません)

*link [#p76aae7e]

**入手 [#ya8ff613]

-[[GNU Emacs:http://www.gnu.org/software/emacs/emacs.html]] 総本山(と言ってよいのでしょうか)
-[[XEmacs:http://www.xemacs.org/]] こちらも人気
-[[Meadow:http://www.meadowy.org/meadow/wiki/]] Windows環境ならこれを
-[[xyzzy(ばさらやる気のない謎のぺぇじ):http://www.jsdlab.co.jp/~kamei/]] これも人気

**使用法など [#i519b3da]
-[[Emacs 電子書棚:http://www.bookshelf.jp/]] 膨大!ここだけでOK
-[[Programming in Emacs Lisp: Table of Contents:http://www.math.s.chiba-u.ac.jp/~matsu/lisp/emacs-lisp-intro-jp_toc.html]]

**外部パッケージ [#eeb26e95]

-TeXには[[YaTeX:http://www.yatex.org/]]か[[AUC TeX:http://www.gnu.org/software/auctex/]]を。bibtex-modeと組合せると良い感じ。[[BibTeX と bibtex-mode, reftex-mode の使い方:http://www.fan.gr.jp/~ring/doc/bibtex.html]]及び[[備忘録 - Meadow:http://chaosweb.complex.eng.hokudai.ac.jp/~hagi/contents/memo-meadow-tex.html]]というページが参考になります。

-HTMLには[[html-helper-mode:http://www.santafe.edu/~nelson/tools/]]など。キーバインドは[[こちらの「html-helper-mode command reference」というページ:http://www.os-omicron.org/~takano/private/obsolete/html-helper-mode.html]]を参考にしています。

-[[TRAMP:http://savannah.nongnu.org/projects/tramp]]により、SSH経由でリモートのファイル操作ができます。

-[[Wanderlust:http://www.gohome.org/wl/index.ja.html]] -- メール/ニュース管理システム

などを私は使っています。標準でついてくるライブラリも色々あって、例えば[[Standard Elisp Libraries:http://www.boreas.dti.ne.jp/~miyoshi/Meadow/elisp.html]]なんかが参考になります。

*Eshell [#r895e13c]
lispで実装されたshellなのだそうだ。既存のシェルの利点を取り入れていたり、環境依存が少ないのがメリットであるが、何よりwindows環境で動く便利シェルという点がありがたい。lsやらgrepを自前で備えている点も良い。詳細については[[Eshellを使いこなす - Meadow memo:http://www.bookshelf.jp/pukiwiki/pukiwiki.php?Eshell%A4%F2%BB%C8%A4%A4%A4%B3%A4%CA%A4%B9]]を見ればOK。

私の場合、Emacsではないファイラを日常的に使っており、その最中に「ここでコマンドラインが打てたらなあ」と思うことが多い。そんな場合には、ディレクトリを指定してeshellを呼出す操作が便利なわけであるが、下記はこれを行う([[Eshellを使いこなす - Meadow memo:http://www.bookshelf.jp/pukiwiki/pukiwiki.php?Eshell%A4%F2%BB%C8%A4%A4%A4%B3%A4%CA%A4%B9]]より)。

 (defun eshell-in-the-directory (targetdir)
   (interactive)
   (let ((dir default-directory))
     (eshell)
     (cd targetdir)
     (eshell-interactive-print (concat "cd " targetdir "\n"))
     (eshell-emit-prompt)
     (cd dir)
     (end-of-buffer)
     ))

ファイラは外部プロセスなので、gnuservで例えば以下の様に呼出すと目的は達成される。
 C:\programs\emacs-21.3\bin\gnuclientw.exe -e (eshell-in-the-directory "c:/target/dir") -f

*Meadow [#xb451ba5]
先程述べたように、Windows環境でEmacsを使用するためには[[Meadow:http://www.meadowy.org/meadow/wiki/]]という選択肢が何かと便利です。ですが、Windows環境とUNIX環境の狭間で困ることが幾つかあります。私の場合[[migemo:http://migemo.namazu.org/]]と印刷に苦労した覚えがあります。migemoに関しては[[こちらの「migemo」というページ:http://www4.kcn.ne.jp/~boochang/emacs/migemo.html]]を、印刷に関しては[[川又研究室knowhow集:http://www.mk.ecei.tohoku.ac.jp/~masahide/knowhow/knowhow.html]]を参考にさせてもらいました。

*Lispメモ[#r2026b70]
**評価 [#r2e46425]
 C-j        出力つき
 C-x C-e    出力なし

**複数引数の受け取り [#s7211731]
文字列を考える。interactiveの後の"s"の指定が文字列引数を意味する。直後の文字列はミニバッファに現れる説明文。複数の引数の場合、ここを"\n"で区切る。
 (defun my-insert (str1 str2) (interactive "sInput1: \nsInput2: ")
 (insert str1)
 (insert str2))

**大文字小文字と部分文字列 [#v4bad1f9]
C++なんかでは、privateなメンバ変数のアクセサを作りたいことがよくある。
 abstruct  =====> const char* GetAbstruct(void){ return abstruct.c_str(); }
のように。これを実現するには。。。
 (defun my-acc (str) (interactive "sInput: ")
 (insert (concat "const char* Get"
                 (upcase (substring str 0 1)) (substring str 1)
                 "(void){ return " str ".c_str(); }")))

**文字列リテラルと正規表現 [#ubbf5ea1]
引数として正規表現を要求される場合、バックスラッシュは文字列リテラルとしてもエスケープされることに注意。なんで、バックスラッシュは普段の倍記述しなくてはならない。例えば「数字6つ」なんかは
 "[0-9]\\{6\\}"
となる。
-[[正規表現:http://www.mew.org/~kazu/doc/elisp/regexp.html]]

*設定その他 [#l39c35ca]

**キーボードマクロ [#v4315cac]
Lispを書くまでもない単純作業の繰り返しに便利。以下で最低限のことはできる。
 C-x (   マクロ記録開始
 C-x )   マクロ記録終了
 C-x e   最近のキーボードマクロ実行

**gnuserv [#f9447034]
外部からファイルを渡し、そのままemacsで開けるようにしたりするもの。NTEmacs 21で使えるようにした際のメモ。

まず[[Guy GASCOIGNE-PIGGFORD:http://www.wyrdrune.com/gnuserv.html]]からgnuserv.zipを入手。展開したのち、gnuserv.el をsite-lispディレクトリに入れ、Releaseディレクトリ中の4つのバイナリをbinディレクトリに入れた。

その後、[[Meadow + gnuserv:http://kawacho.don.am/win/meadow/gnuserv/gnuserv.html]]を参考にして、.emacsに
 (require 'gnuserv) 
 (gnuserv-start) 
 (setq gnuserv-frame (selected-frame))
の記述をしたら、
 gnuclientw.exe my_file.txt
などとしてファイルをEmacsに読みこますことができるようになった。-eオプションでlisp式の評価もできる。
 C:\programs\emacs-21.3\bin\gnuclientw.exe -f -e (gomoku)
とか。-fオプションは、ウィンドウを前面に出すことを意味する(windowsのみ)。

**検索と置換 [#dceb8cc3]
 ESC C-r     isearch-backward-regexp
 ESC C-s     isearch-forward-regexp
 C-q C-j     改行文字入力
 M-p,M-n     履歴(ミニバッファの履歴も一般にこれでOKのようだ)
 C-s C-s     直前の検索をくりかえす
 C-m         検索終わり
空白文字は \s- であることに注意。

***正規表現 [#u9f8b825]
ややこしい文字列を正規表現で検索する時なんかは、なかなか望むものにマッチするパターンが得られなかったりする。そんな時、isearch-forward-regexp でtry&errorで突き進むのは結構面倒くさい。

そこでre-builderを使うとよい。
 M-x re-builder
とすると、編集容易なバッファが登場し、そこにパターンを入力すれば、ターゲットのバッファのどの部分が現在のパターンにマッチするかリアルタイムでわかる。壮絶に便利。

-[[48.3.1 正規表現の作成・確認:http://www.bookshelf.jp/soft/meadow_48.html#SEC687]]

なお、デフォルトで最長マッチなのを最短マッチにするためにはメタキャラクタの後にクエスチョンを置く。

***実例 [#z0f00bd8]
ANSIリテラル文字("hoge")をUnicodeリテラル文字(L"hoge")に一括で変換したい時
 Replace regexp \"\([a-z]\) with: L"\1

\(\)のグルーピングにマッチした文字列を、後に\1の後方参照で取得している。

**ナローイング [#v472f79f]
指定箇所以外不可視にする。あるリージョン内でのみreplace-stringしたい時などに便利

 C-x n p     narrow-to-page  (指定箇所をナローイング)
 C-x n w     widen (元に戻す)



**SKK [#p02494ce]
漢字変換は専らATOKを愛用していたが、非Windows環境への対応のためSKKを使うようになった。

Emacsenではない状況の漢字入力は、Windowsでは[[skkime:http://www.tatari-sakamoto.jp/~tatari/skkime.jis.html]]を使っている。このユーザー辞書はUnicodeであるが、変換にちょっと苦労したので下に手順をメモする。

ファイルの先頭にはByte Order Markがついてないといけない(参考:http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm)ようなので、その分の領域をあらかじめ確保しておく。
 echo -n "  " > .skk-jisyo-utf16
そして、変換元のユーザー辞書からiconvで変換。x86なのでリトルエンディアンにする。これを先のファイルに追記する。
 iconv -f SHIFT-JIS -t UTF-16LE .skk-jisyo-sjis >> .skk-jisyo-utf16
そしてByte Order Mark (FF FE)を埋め込む。
 hexedit .skk-jisyo-utf16
こうして、元々使っていた辞書をskkimeの方に適用することができた。


**hexl-mode [#f98b3637]
バイナリエディタをわざわざ導入せずともEmacsで良い。
 hexl-mode-find-file
で開いたり、開いたファイルを
 hexl-mode
しても良い。

hexl-modeに限らず、バイナリエディタというものは上書きが原則(「ココにこの文字を挿入」というのができない)のようである。残念。
-http://www.ysnb.net/meadow/meadow-users-jp/2004/msg00381.html

**info [#e41ad8ff]
[[個人用の Info を追加する方法:http://www.namazu.org/~tsuchiya/elisp/texinfo-tips.html]]というページでお勉強。
 (setq Info-default-directory-list
       (append Info-default-directory-list (list (expand-file-name "~/usr/info"))))
などとするわけである。


**ecb [#q9f22f7d]
[[ECB - Emacs Code Browser:http://ecb.sourceforge.net/]]なのだそうで、[[スクリーンショット:http://ecb.sourceforge.net/screenshots/1.png]]が派手。いじりたいが時間がない。


**speedbar [#aab18484]
[[speedbar:http://cedet.sourceforge.net/speedbar.shtml]]でツリー表示ができるみたい。いじりたいが時間がない。とりあえず

 (define-key speedbar-file-key-map "a" 'speedbar-toggle-show-all-files)

でファイルの表示/非表示のトグルが可能(http://chaosweb.complex.eng.hokudai.ac.jp/~hagi/contents/files/meadow199.el より)。マウス中クリックのメニューからも辿れる。

**Windowsまわり [#p29bc302]
http://wiki.gohome.org/teranisi/?EmacsOnWindows

**face [#oc1fbef6]
文脈の機能に応じて色分けが可能。
 list-faces-display
で閲覧

**印刷 [#rcaca37c]
 C-u M-x ps-print-buffer-with-faces
で、現在のバッファをfaceつきでPostScriptのファイルを作ってくれる。詳しくはps-print.el参照。日本語が含まれる場合は
 (setq ps-multibyte-buffer 'non-latin-printer)
などとしておく。詳しくはps-mule.elを参照。

ps-lpr-commandをカラにして、ps-printer-nameにファイル名を指定すると、
 M-x ps-print-buffer-with-faces
でファイルを作ってくれるようだ。やっつけで
 (setq hiroitoh-gsview-dir "C:/Program Files/Ghostgum/gsview/")
 (setq hiroitoh-gsview-executable (concat hiroitoh-gsview-dir "gsview32.exe"))
 (setq hiroitoh-gsview-tempps (concat hiroitoh-gsview-dir "temp.ps"))
 
 (setq ps-print-color-p t
       ps-lpr-command ""
       ps-lpr-switches '("-sDEVICE=mswinpr2" "-dNOPAUSE" "-dBATCH")
       ps-printer-name hiroitoh-gsview-tempps
       ps-paper-type 'a4
       ps-multibyte-buffer 'non-latin-printer)
 
 (defun hiroitoh-print-buffer () (interactive)
   (ps-print-buffer-with-faces)
   (call-process hiroitoh-gsview-executable nil 0 nil hiroitoh-gsview-tempps)
 )
なんて書いてみた(初めてのLispプログラミング!)ら、ちゃんと動いてしまったようだ。


**iswitchb [#t5de893d]
バッファの俯瞰ができる。
-[[YEDO.COM - PukiWiki - NTEmacs/iswitchbを使う:http://www.yedo.com/modules/pukiwiki/index.php?%5B%5BNTEmacs%2Fiswitchb%A4%F2%BB%C8%A4%A6%5D%5D]]

*キーバインド [#l9e590ba]

**ファイル操作 [#j40641e2]
 C-x C-f     開く
 C-x C-r     読みとり専用で開く
 C-x C-s     上書き保存
 C-x C-w     別名で保存
 C-x C-c     emacsの終了

**カーソル・文字操作 [#rebaf805]
 C-f      前へ
 C-b      後へ
 C-p      上へ
 C-n      下へ
 C-a      行頭へ
 C-e      行末へ
 M->      ファイル末尾へ
 M-<      ファイル先頭へ
 M-a      文頭へ
 M-e      文末へ
 C-s      検索
 M-%      置換
 M-x      query-replace-regexp 正規表現による文字列の置換
 C-x i    カーソル位置にファイル挿入
 M-l      ポイントに続く単語を小文字に
 M-u      ポイントに続く単語を大文字に
 M-c      ポイントに続く単語を大文字で始める
 C-x C-l  選択した領域を小文字に
 C-x C-u  選択した領域を大文字に
 (.emacsによって C-h をbackspaceに割り当てる人が多い)

**ウィンドウ、フレーム [#ec54d5a3]
 C-x 2     ウィンドウ横分割
 C-x 3     ウィンドウ縦分割
 C-x o     他のウィンドウへ移動
 C-x 0     現在のウィンドウ消去
 C-x 1     他のウィンドウ消去
 C-x ^     ウィンドウを高く
 C-x }     ウィンドウ幅を広く
 C-x {     ウィンドウ幅を狭く
 C-M-v     別ウィンドウのスクロール
 C-x 5 2   別フレームを開く
 C-x 5 f   別フレームでファイルを開く
 C-x 5 b   別フレームでバッファを開く
 C-x 5 0   フレームを閉じる

**領域操作 [#w874d032]

 C-w     キル(カット)
 C-y     ヤンク(ペースト)
 M-y     "C-y"の後に使うと、以前キルしたリージョンをヤンクできる
 M-w     コピー

 
複数の領域のペーストを何度も使い回したいときは、レジスタを使うのが便利です。アルファベット1文字で指定されるレジスタ名に領域を保持することができます。
 C-x x REGISTER      領域を指定されたREGISTERにコピー
 C-x g REGISTER      指定されたREGISTERをペースト
 C-x r r REGISTER    領域を指定されたREGISTERに矩形でコピー
 
**矩形編集 [#lc0cddd4]
 テキストを「表」とみなして編集できます。便利です。
 C-x r k         矩形切り取り
 C-x r y         矩形貼り付け
 C-x r c         矩形クリア
 C-x r d         矩形削除
 C-x r o         矩形空白挿入
 C-x r t STRING  各行のrectangle regionにSTRINGを挿入する.

**バッファ操作 [#g7a8caee]
 C-x C-b    バッファのリスト表示
 C-x b      バッファ間移動
 M-n        次のバッファへ
 M-p        前のバッファへ

**YaTeX [#rfbcb1c1]
 C-c b space  begin型補完
 C-c B space  既存の箇所のbegin型補完
 C-c e        endの補完
 C-c s        section型補完
 C-c S        既存の箇所のsection型補完
 C-c l        large型補完
 C-c L        既存の箇所のlarge型補完
 C-c m        maketitle型補完
 C-c a        アクセント記号補完
 ;           数式記号補完
 ; TAB       数式記号補完の一覧
 :           ギリシャ文字補完
 : TAB       ギリシャ文字補完の一覧
 C-c tj       compile
 C-c tp       preview
 C-c '        エラー箇所にジャンプ
 C-c (        label作成
 C-c )        ref作成
 C-c g        対応するlabel <-> ref 間にジャンプ(labelとrefに限らない)
 C-c k        section型命令で、命令文だけ消せる

tabular[*], array, itemize, enumerate, tabbing 環境をbegin型補完で入力した時、または各環境内では次のものが有効です。
 ESC RET ... おまかせ改行。その環境に応じた行エントリを次の行に挿入する
 
YaTeXと直接関係ありませんが、reftex-modeというのが文献引用に役立ちます。こちらの[[BibTeX と bibtex-mode, reftex-mode の使い方:http://www.fan.gr.jp/~ring/doc/bibtex.html]]に詳しく解説されています。
 C-c [   citeコマンドの挿入
 
YaTeXの知らない補完を行う時は、ホームディレクトリの.yatexrcに
 (setq user-section-table '(
 ("DD" 2)
 ))

などと記述すれば覚えてくれます。(この例はsection型)「2」というのは引数の数です。微分dy/dxを表すコマンド\DD{y}{x}を
 \newcommand{\DD}[2]{\frac{\mathrm{d}#1}{\mathrm{d}#2}}
の様に作った時、上の記述を.yatexrcに加えると便利です。
 
**FORTRANモード [#n6ef6649]
 C-c C-r   ルーラーの表示
 C-c C-w   幅72文字のウィンドウ表示
 C-M-a     副プログラムの先頭へ
 C-M-e     副プログラムの末尾へ
 C-c C-n   現在か次の文の先頭へ
 C-c C-p   現在か次の文の末尾へ

**w3m [#kc327993]
 g,U         指定したURIへ
 B           戻る
 a           ブックマークに追加
 v           ブックマークを閲覧
 M           外部ブラウザで見る
 R           リロード
 C-c C-c     フォーム送信
 C-c C-t     バッファをコピー、タブ生成
 C-c C-n,p   タブ切り替え
 C-c C-w     タブ消去
 SHIFT RET   新しいタブで開く
 TAB         次のリンクへ
 M-TAB       前のリンクへ

**Outline minor mode [#wd96d9ee]
PREFIX(defaultは C-c @)の後に下記を入力する。色々種類があるが、個人的には以下で十分
 C-e   見せる
 C-c   隠す
 C-t   bodyを隠す
 C-a   全て見せる

**動的略語展開 [#c4d3fc35]
要はキーワード補完がです。
 M-/ 文字列の補完

**Diredモード [#s58a99b4]
ファイラです。操作は[[dired/dired-x:http://www.math.s.chiba-u.ac.jp/~matsu/emacs/emacs21/dired.html]]
[[A Leafy Tree:http://www.math.s.chiba-u.ac.jp/~matsu/index-j.html]]より)にまとめられています。
 C-x d   Diredモード

**文字、改行コード [#qe54bcef]
バッファ内を変更するには以下のようにします。
 C-x RET f     バッファ内の文字、改行コード変更

なお、モード行表記の意味は以下の通り。
 E ...... EUC
 J ...... JIS
 S ...... Shift JIS
 nil .... たぶんASCII
 : ...... unix 改行コード
 (DOS)... dos
 (Mac)... Mac

**その他 [#aa6921d9]
 F1-m     describe-mode 現在のモードの説明
 F1-b     describe-bindings 現在のキーバインドの説明
 F1-v     describe-variable こうして、major-modeとタイプすると現在のモード名がわかる
 C-u M-x info  こうしてinfoファイルを直接呼びだして読める。
 C-c C-r           シェルモードで、最後に実行したコマンドへ移動
 C-c C-y           シェルモードで、最後に実行したコマンドを貼り付ける
 M-(num) (command) 数引数を指定した上でコマンド実行
 C-x u  アンドゥ
 C-/    アンドゥ