紹介 *

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

link *

入手 *

使用法など *

外部パッケージ *

などを私は使っています。標準でついてくるライブラリも色々あって、例えばStandard Elisp Librariesなんかが参考になります。

Eshell *

lispで実装されたshellなのだそうだ。既存のシェルの利点を取り入れていたり、環境依存が少ないのがメリットであるが、何よりwindows環境で動く便利シェルという点がありがたい。lsやらgrepを自前で備えている点も良い。詳細についてはEshellを使いこなす - Meadow memoを見ればOK。

私の場合、Emacsではないファイラを日常的に使っており、その最中に「ここでコマンドラインが打てたらなあ」と思うことが多い。そんな場合には、ディレクトリを指定してeshellを呼出す操作が便利なわけであるが、下記はこれを行う(Eshellを使いこなす - Meadow memoより)。

(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 *

先程述べたように、Windows環境でEmacsを使用するためにはMeadowという選択肢が何かと便利です。ですが、Windows環境とUNIX環境の狭間で困ることが幾つかあります。私の場合migemoと印刷に苦労した覚えがあります。migemoに関してはこちらの「migemo」というページを、印刷に関しては川又研究室knowhow集を参考にさせてもらいました。

Lispメモ *

評価 *

C-j        出力つき
C-x C-e    出力なし

カスタムコメント化 *

thecommand(arg1, arg2)

をリージョンで指定してコマンドを実行すると

/* thecommand(arg1, arg2) */
thecommand(arg1, arg2)

となる。

(defun mycommentize (start end)
  (interactive "r")
  (save-excursion
  (let ((str (buffer-substring start end)))
    (goto-char end)
    (insert " */")
    (goto-char start)
    (insert "/* ")
    (end-of-line)
    (newline)
    (insert "\t")
    (insert str))
  )
)

カスタム置換 *

例えば"hoge"を"{hoge}"にしたいなら以下のようにする。(でもこの例だったらreplace-regexpでもできるので、わざわざdefunする意味はない)

(defun my-replace ()
  (interactive)
  (goto-char (point-min))
  (while (re-search-forward "^\"\\(.*?\\)\"" nil t)
    (let ((str (buffer-substring (match-beginning 1) (match-end 1))))
    (delete-region (match-beginning 0) (match-end 0))
    (insert (format "\"{%s}\"" str))
    )))

複数引数の受け取り *

文字列を考える。interactiveの後の"s"の指定が文字列引数を意味する。直後の文字列はミニバッファに現れる説明文。複数の引数の場合、ここを"\n"で区切る。

(defun my-insert (str1 str2) (interactive "sInput1: \nsInput2: ")
(insert str1)
(insert str2))

大文字小文字と部分文字列 *

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(); }")))

文字列リテラルと正規表現 *

引数として正規表現を要求される場合、バックスラッシュは文字列リテラルとしてもエスケープされることに注意。なんで、バックスラッシュは普段の倍記述しなくてはならない。例えば「数字6つ」なんかは

"[0-9]\\{6\\}"

となる。

設定その他 *

キーボードマクロ *

Lispを書くまでもない単純作業の繰り返しに便利。以下で最低限のことはできる。

C-x (   マクロ記録開始
C-x )   マクロ記録終了
C-x e   最近のキーボードマクロ実行

gnuserv *

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

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

その後、Meadow + gnuservを参考にして、.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のみ)。

検索と置換 *

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- であることに注意。

正規表現 *

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

そこでre-builderを使うとよい。

M-x re-builder

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

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

実例 *

ANSIリテラル文字("hoge")をUnicodeリテラル文字(L"hoge")に一括で変換したい時

Replace regexp \"\([a-z]\) with: L"\1

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

ナローイング *

指定箇所以外不可視にする。あるリージョン内でのみreplace-stringしたい時などに便利

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

デフォルトでは無効になっているので、手動で呼出すと「本当か」みたいな事を聞かれる。

(put 'narrow-to-region 'disabled nil)

としておけば聞かれない。

SKK *

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

Emacsenではない状況の漢字入力は、Windowsではskkimeを使っている。このユーザー辞書は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 *

バイナリエディタをわざわざ導入せずともEmacsで良い。

hexl-mode-find-file

で開いたり、開いたファイルを

hexl-mode

しても良い。

hexl-modeに限らず、バイナリエディタというものは上書きが原則(「ココにこの文字を挿入」というのができない)のようである。残念。

info *

個人用の Info を追加する方法というページでお勉強。

(setq Info-default-directory-list
      (append Info-default-directory-list (list (expand-file-name "~/usr/info"))))

などとするわけである。

ecb *

ECB - Emacs Code Browserなのだそうで、スクリーンショットが派手。いじりたいが時間がない。

speedbar *

speedbarでツリー表示ができるみたい。いじりたいが時間がない。とりあえず

(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まわり *

http://wiki.gohome.org/teranisi/?EmacsOnWindows

face *

文脈の機能に応じて色分けが可能。

list-faces-display

で閲覧

印刷 *

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 *

バッファの俯瞰ができる。

キーバインド *

ファイル操作 *

C-x C-f     開く
C-x C-r     読みとり専用で開く
C-x C-s     上書き保存
C-x C-w     別名で保存
C-x C-c     emacsの終了

カーソル・文字操作 *

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に割り当てる人が多い)

ウィンドウ、フレーム *

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   フレームを閉じる

領域操作 *

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に矩形でコピー

矩形編集 *

テキストを「表」とみなして編集できます。便利です。
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を挿入する.

バッファ操作 *

C-x C-b    バッファのリスト表示
C-x b      バッファ間移動
M-n        次のバッファへ
M-p        前のバッファへ

YaTeX *

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 の使い方に詳しく解説されています。

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モード *

C-c C-r   ルーラーの表示
C-c C-w   幅72文字のウィンドウ表示
C-M-a     副プログラムの先頭へ
C-M-e     副プログラムの末尾へ
C-c C-n   現在か次の文の先頭へ
C-c C-p   現在か次の文の末尾へ

w3m *

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 *

PREFIX(defaultは C-c @)の後に下記を入力する。色々種類があるが、個人的には以下で十分

C-e   見せる
C-c   隠す
C-t   bodyを隠す
C-a   全て見せる

動的略語展開 *

要はキーワード補完がです。

M-/ 文字列の補完

Diredモード *

ファイラです。操作はdired/dired-x A Leafy Treeより)にまとめられています。

C-x d   Diredモード

文字、改行コード *

バッファ内を変更するには以下のようにします。

C-x RET f     バッファ内の文字、改行コード変更

なお、モード行表記の意味は以下の通り。

E ...... EUC
J ...... JIS
S ...... Shift JIS
nil .... たぶんASCII
: ...... unix 改行コード
(DOS)... dos
(Mac)... Mac

その他 *

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-/    アンドゥ

Last-modified: Wed, 20 Sep 2006 20:29:24 JST