GNU Emacs の カスタマイズ方法を 紹介しています。 |
GNU Emacs には Emacs Lisp 言語を用いた超強力なマクロ機能があります。 ここでは、私がこれまでに培ってきた便利な設定/カスタマイズ用マクロを 紹介したいと思います。 自作パッケージも含め、サンプルコードも載せていますので、 「.emacs(あるいは .emacs.el や .emacs.d/init.el)」ファイルに コピー&ペーストして使ってください。
なお、2024年1月現在、私が使っている Emacs は次の通りです。 このページで紹介しているコードは 全て Emacs バージョン 24 以降を前提としています。 私の .emacs.el ファイルは ここ にあります。
「.emacs」ファイルに
(display-time-mode 1)
を書き加えると、下の図のように モードラインに時刻が表示されるはずです。
他にもモードラインにはさまざまな情報が追加できます。
(line-number-mode 1) (column-number-mode 1)
としてみましょう。
(line-number-mode 1)
は、カーソルのある位置(行)を「L??」のように表示します。
ファイルの25行目ならば「L25」になります。
この設定は、Emacs 22 ではデフォルトでオンになっているようです。
また、(column-number-mode 1)
は
カーソルが行の先頭から何文字目にあるかを「C??」のように表示します。
line-number-mode と column-number-mode を両方同時に使うと、
行と列が「(25,1)」のように表示されます。
最近の Emacs(Emacs 22)では、ノートPCのバッテリー状態を 「[97%]」のように表示することもできます。 Mac のメニューバーや Windows のタスクバーには たいていバッテリ残量が表示されているので、 これはあまり意味のない機能だと思いますが...
(display-battery-mode 1)
.emacs.el ファイルに次のような設定を書き込むと、 文字やカーソルの色をカスタマイズすることができます。 色名部分には、あらかじめ定義されている 700 以上の色を使うことができます。 具体的な色名や、色見本の出し方については 色見本のページの カラーテーブル を参考にするといいでしょう。 好みの色を設定して、あなた風の Emacs を作ってみましょう。
(if window-system (progn ;; 文字の色を設定します。 (add-to-list 'default-frame-alist '(foreground-color . "gray10")) ;; 背景色を設定します。 (add-to-list 'default-frame-alist '(background-color . "white")) ;; カーソルの色を設定します。 (add-to-list 'default-frame-alist '(cursor-color . "SlateBlue2")) ;; マウスポインタの色を設定します。 (add-to-list 'default-frame-alist '(mouse-color . "SlateBlue2")) ;; モードラインの文字の色を設定します。 (set-face-foreground 'mode-line "white") ;; モードラインの背景色を設定します。 (set-face-background 'mode-line "MediumPurple2") ;; 選択中のリージョンの色を設定します。 (set-face-background 'region "LightSteelBlue1") ;; モードライン(アクティブでないバッファ)の文字色を設定します。 (set-face-foreground 'mode-line-inactive "gray30") ;; モードライン(アクティブでないバッファ)の背景色を設定します。 (set-face-background 'mode-line-inactive "gray85") ))
なお、起動中の Emacs の色を変更させるときは、 以下の関数を使うことができます。例えば、 M-x set-foreground-color とタイプして関数を呼び出すと、 「Foreground color: 」というメッセージがミニバッファに現れます。 ここで色名を入力してリターンキーを押すと、 この色が即座に画面に反映されます。
関数名 | 内容 |
---|---|
set-foreground-color | 文字の色の設定 |
set-background-color | 背景色を設定 |
set-cursor-color | カーソルの色 |
set-mouse-color | マウスポインタの色 |
なお、ソースコードのカラー表示については、 次の「ソースコードをカラー表示する」 の項を参照して下さい。
Emacs は、プログラム言語の文法に応じて、 ソースコードをカラー表示するようになっています。 コードの見通しがよくなるし、キーワードのタイプミスも一目瞭然なので とても便利です。
このカラー表示の色をカスタマイズしてみましょう。
下の例は、私が使っているカラー設定です。
ご覧のとおり、
(set-face-foreground '(名前) "(色名)")
という書式で、対応する文字色を変更しています。
(名前) の部分は、たいていの場合は下の9パターンで足りるはずです。
(色名) の部分は、「画面の色を変える」と同様に
好きな色を選ぶことができます。
文字の地の色も設定することができます。
(if window-system (progn (set-face-foreground 'font-lock-comment-face "MediumSeaGreen") (set-face-foreground 'font-lock-string-face "purple") (set-face-foreground 'font-lock-keyword-face "blue") (set-face-foreground 'font-lock-function-name-face "blue") (set-face-bold-p 'font-lock-function-name-face t) (set-face-foreground 'font-lock-variable-name-face "black") (set-face-foreground 'font-lock-type-face "LightSeaGreen") (set-face-foreground 'font-lock-builtin-face "purple") (set-face-foreground 'font-lock-constant-face "black") (set-face-foreground 'font-lock-warning-face "blue") (set-face-bold-p 'font-lock-warning-face nil) ))
フォントをボールド体(太字)に変える場合は、
(set-face-bold-p '(名前) t)
と書きます。
また、
(set-face-bold-p '(名前) nil)
とすれば、ボールドが無効になって普通の字体に戻ります。
同様に、イタリック体や下線つきの字体を設定することができます。
関連コマンドをまとめると下の表のようになります。
関数 | 内容 |
---|---|
(set-face-foreground '(名前) "(色名)") | 文字色を変更する |
(set-face-background '(名前) "(色名)") | 文字の背景色を変更する |
(set-face-background '(名前) nil) | 文字の背景色を設定しない |
(set-face-bold-p '(名前) t) | 太字(ボールド体)にする |
(set-face-bold-p '(名前) nil) | 太字(ボールド体)にしない |
(set-face-italic-p '(名前) t) | イタリック体にする |
(set-face-italic-p '(名前) nil) | イタリック体にしない |
(set-face-underline-p '(名前) t) | 下線を表示する |
(set-face-underline-p '(名前) nil) | 下線を表示しない |
ウィンドウ(フレーム)の 縦スクロールバーの位置を変えるには次のようにします。 例えば Emacs 23 はスクロールバーが左側にありますが、 私は右側の方が使いやすいと思います。
(set-scroll-bar-mode 'left) ;; 左側 (set-scroll-bar-mode nil) ;; なし (set-scroll-bar-mode 'right) ;; 右側
Emacs 23 以降(あるいはCarbon Emacs パッケージ)では、 ウィンドウ(フレーム)の透明度を自由に設定することができます。 透明度の設定は、frame-parameter というウィンドウ設定変数の alpha というパラメーターで指定します。 .emacs.el の書式は、いくつか方法がありますが、以下のようにすれば良いでしょう。
;; デフォルトの透明度を設定する (85%) (add-to-list 'default-frame-alist '(alpha . 85)) ;; カレントウィンドウの透明度を変更する (85%) ;; (set-frame-parameter nil 'alpha 0.85) (set-frame-parameter nil 'alpha 85)
透明度は、整数で 0(透明)〜 100(不透明)、または 小数で 0.0(透明)〜 1.0(不透明)のように指定します。 下の画像は、透明度 85% のウィンドウのスクリーンショットです。
'(85 40)
のようなリスト形式で
複数の数値を渡してやると、1つめがアクティブなウィンドウの透明度、
2つめが非アクティブなウィンドウの透明度になります。
代わりに nil を代入すると Emacs は何もしません。
(add-to-list 'default-frame-alist '(alpha . (100 70))) (set-frame-parameter nil 'alpha '(100 70)) (set-frame-parameter nil 'alpha '(0.8 nil)) (set-frame-parameter nil 'alpha nil)
ところで、この設定は、テキストやツールバーも含めて、
ウィンドウ上のもの全てを透明にしてしまいます。
操作に支障が出るのを避けるため、
一定の閾値(20%)よりもウィンドウを透明にすることはできません。
この閾値を変更する場合は、
変数 frame-alpha-lower-limit
の値を変更してください。
;; 透明度の下限 (15%)
(setq frame-alpha-lower-limit 15)
(setq frame-alpha-lower-limit 0.15)
この機能のオリジナルは、 廣松さんが Carbon Emacs 用に作られたコード [1] です。 その後、私と吉武さんが作成した X Window および Cocoa Emacs 対応バージョンが Emacs 23 に取り込まれました [2]。 フィードバックを下さった方々に、この場を借りて御礼申し上げます。
Emacs のデフォルトの状態では、 何かエラーが起きるたびにビープ音が鳴ります。 これがうるさくて嫌な場合は、.emacs.el ファイルに
(setq visible-bell t)
というコードを追加して下さい。 代わりに、画面の一部がフラッシュして エラーを知らせてくれるようになります。 (なお、ターミナルで emacs を使う場合には、 この設定が有効にならない場合があります。)
私はビープ音も画面のフラッシュも、 どちらも好きではないので、代わりに
(setq ring-bell-function 'ignore)
というコードを書き加えていました。 Emacs 内部のエラー音を鳴らす関数に 空の関数を割り当てているので、 何も起こらなくなります。
cursor-type
変数の値を設定すると
カーソルの形状を変更することができます。
(add-to-list 'default-frame-alist '(cursor-type . 'box)) ;; ボックス型カーソル (add-to-list 'default-frame-alist '(cursor-type . 'hbar)) ;; 下線 (add-to-list 'default-frame-alist '(cursor-type . '(bar . 3)) ;; 幅3ポイントの縦棒カーソル
指定できるカーソルの種類は、下の表の通りです。 hbar, hollow は Emacs 21 では使えないかもしれません。
値 | 説明 |
---|---|
t | デフォルトの形状を利用。 |
nil | カーソルを表示しません。 |
box | 文字と同サイズのボックス型のカーソルを表示します。通常はこの形がデフォルトです。 |
bar | 縦棒型のカーソルです。 |
(bar . 3) | 幅が 3 ポイントの縦棒カーソルを表示します。 |
hbar | 下線を表示します。 |
(hbar . 3) | 下線の高さが 3 ポイントになります。 |
hollow | 中抜きのカーソルです。定義されていない値を代入すると、hollow 型が適用されます。 |
カーソルの色は「画面の色を変える」で紹介している
set-cursor-color
関数で設定して下さい。
(set-cursor-color "MediumPurple2")
多くの Mac / Windows アプリケーションと同じように、 最近使ったファイルをメニューに表示することができます。 試しに、次のように設定してみましょう。
(recentf-mode 1)
File メニューに「Open Recent」というサブメニューが追加されます。
このファイル名一覧は、ホームディレクトリの下の ~/.recentf というファイルに保存されています。 中身を他人に見られることがないよう、 パーミッションを 600 に設定しておくと良いでしょう。 「Open Recent」メニューに表示されるファイル数や ~/.recentf ファイルに記録されるファイル数は、 次の変数で指定することができます。
(setq recentf-max-menu-items 10) (setq recentf-max-saved-items 20)
一部のファイルを「Recent」メニューに加えたくないときは、
変数 recentf-exclude
に正規表現を定義しておきます。
次の設定は、Tramp のリモートファイル形式のファイル名
(/ssh:hostname〜, /scp:hostname〜 など)を除外します。
(setq recentf-exclude '("^/[^/:]+:"))
recentf は、読み込み時に「Recent」メニューの中の ファイルの有無をチェックして、 存在しないファイルをリストから削除するようです。 この機能をオフにする場合は、 recentf-mode をオンにするより先に 次の設定を追加して下さい。
(setq recentf-auto-cleanup 'never) (recentf-mode 1)
特に Tramp でリモートファイルを編集していた場合は、 毎回、リモートホストのパスワード入力を促されるので煩雑です。 上記のどちらかの設定を使って、 リモートファイルのチェックをオフにしましょう。
キーの割り当ても、自分の好きなように変えることができます。 下の例は、私が使っている設定の一部で、コントロールキー + Z で アンドゥーできるようにしています。 Lisp コード内では、コントロールキーと a の組み合わせは \C-a、 メタキー(通常、Escape キーで代用されます)は \M-a、 alt キーは [(alt a)] と表記します。
(global-set-key "\C-z" 'undo)
特定のモードの中でのみ、キーバインドを変更する場合は local-set-key に使います。 下のようにフックを設定して、 モードに切り替わったときにキーを変更すればいいでしょう。
(add-hook 'perl-mode-hook (lambda () (local-set-key "\C-c\C-c" 'smart-compile) ))
ファンクションキーは下のように [ ] で括って表記します。 ここでは F1 キーを info(マニュアルみたいなもの)に割り当てています。
(global-set-key [f1] 'info)
その他、各種キーの表記は以下の表の通りです。 理由はよくわかりませんが、 Return キーは C-m、TAB キーは C-i と同じ扱いになっていますので 注意して下さい。
キー | lisp 表記 | |
---|---|---|
C-a(コントロール + a) | [(control a)] | "\C-a" |
C-c C-c | "\C-c\C-c" | |
Meta + a | [(meta a)] | "\M-a" |
alt + a | [(alt a)] | |
シフト + a | [(shift a)] | |
Meta + コントロール + a | "\M-\C-a" | |
\ キー | "\\" | |
Return キー | [return] | "\C-m" |
TAB キー | "\C-i" | |
F1 キー | [f1] | |
コントロール + F1 キー | [(control f1)] | |
Meta + F1 キー | [(meta f1)] | |
alt + F1 キー | [(alt f1)] | |
シフト + F1 キー | [(shift f1)], [S-f1] | |
Page Up キー | [prior] | |
Page Down キー | [next] | |
Home キー | [home] | |
End キー | [end] | |
Insert キー | [insert] | |
↑ キー | [up] | |
↓ キー | [down] | |
← キー | [left] | |
→ キー | [right] | |
コントロール + ← | [(control left)], [C-left] | |
シフト + ← | [(shift left)], [S-left] |
オリジナルのキーバインドを定義する場合は、 標準キーバインドを上書きしてしまわないよう、 C-h k (「キーバインドを調べる」参照)で キーが空いているかどうか調べてみるといいでしょう。 C-c C-... や、ファンクションキー( F1 〜 F9 )は空いていることが多いです。 (F10 キーは、ターミナルモード:-nw で起動したとき、 メニューバー項目にアクセスするために使われています)
Emacs(の現在のモード)で使われているキーの割り当てを調べるためには、 C-h k(あるいは M-x describe-key) を押してから、キーを入力します。 例えば、'C-x C-f' に割り当てられたコマンドを調べるために C-h k C-x C-f と入力してみて下さい。 画面の下半分に新しいバッファ(*Help* バッファ)が開いて 対応する Lisp コマンドとその説明(英語)が表示されるはずです。 この場合は、find-file というコマンドが呼び出されて、 「指定されたファイルを編集用に開く」ことがわかります。
C-x C-f runs the command find-file which is an interactive compiled Lisp function in `files'. (find-file FILENAME &optional WILDCARDS) Edit file FILENAME. Switch to a buffer visiting file FILENAME, creating one if none already exists. Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files. Wildcard expansion can be suppressed by setting `find-file-wildcards'.
キーバインドが何も定義されていない場合は、 ミニバッファに「... is undefined」というメッセージが表れます。
標準で入っている time-stamp というライブラリの機能を利用して、 ファイルの更新日を自動的に書き換えることができます。 .emacs.el で次のように設定してみましょう。
(require 'time-stamp) (add-hook 'before-save-hook 'time-stamp) (setq time-stamp-active t) (setq time-stamp-start "last updated : ") (setq time-stamp-format "%04y/%02m/%02d") (setq time-stamp-end " \\|$")
ファイルの先頭近くに "last updated : " という文字列があれば、 ファイルを保存するたびに次のような日付が追加/更新されるようになります。
;; last updated : 1999/11/16 ← ここが更新される
日付の書式は、上の例のように
time-stamp-format
変数を編集してカスタマイズします。
% で始まる特殊文字の意味は、emacs のヘルプによると次のようになっています。
曜日名などは国・地域設定によって違う可能性がありますので注意して下さい。
特殊文字 | 内容 | 例 |
---|---|---|
%04y | 年(4桁) | 2003 |
%02y | 年(2桁) | 03 |
%02m | 月(2桁) | |
%02d | 日(2桁) | |
%02H | 時間(24時間、00〜23) | |
%02I | 時間(12時間、00〜11) | |
%02M | 分(2桁) | |
%02S | 秒(2桁) | |
%w | weekday(日曜日が 0 〜 土曜日 6) | 0 |
%:a | 曜日 | Monday |
%3a | 曜日 | Mon |
%#A | 曜日(大文字) | MONODAY |
%3A | 曜日(大文字) | MON |
%:b | 月の名前 | January |
%3b | 月の名前 | Jan |
%#B | 月の名前(大文字) | JANUARY |
%3B | 月の名前(大文字) | JAN |
%#p | am or pm | am |
%P | 同上(大文字) | AM |
%% | % の文字 | % |
%f | ファイル名 | file.html |
%F | ファイル名のフルパス | /home/zenitani/file.html |
%u | ユーザーのアカウント名 | zenitani |
%U | ユーザーのフルネーム | Seiji Zenitani |
%z | タイムゾーン | jst |
%Z | タイムゾーン(大文字) | JST |
日付部分の前後の文字列は
time-stamp-start
, time-stamp-end
変数を編集してカスタマイズします。
私の time-stamp-end
は " \\|$"
となっていますが、
これは正規表現で ' '
(スペース)か '$'
(行末)を意味しています。
('\\|'
は、or を意味する '|' を2回エスケープしています)
time-stamp-start/end
の文字列は、
ファイル先頭から8行以内に書いて下さい。
しかし、time-stamp-line-limit
変数の値を設定すれば、
文字列を置く位置も自由に設定できます。
(setq time-stamp-line-limit 10) ;; ファイルの先頭から10行以内を探す (setq time-stamp-line-limit -4) ;; ファイルの後ろから4行以内を検索
ファイルの先頭に #! が含まれているとき、 自動的に chmod +x を行ってくれます。
(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
新しくファイルを開く場合に、予め用意しておいたテンプレートファイルの中身を自動的に挿入するようにします。
(require 'autoinsert) (setq auto-insert-directory "~/lib/") (setq auto-insert-alist (nconc '( ("\\.c$" . "template.c") ("\\.f$" . "template.f") ) auto-insert-alist)) (add-hook 'find-file-not-found-hooks 'auto-insert)
とすると、「*.c」という名前で新しくファイルを作る場合、「~/lib/template.c」ファイルの中身が挿入されます。auto-insert-directory
はテンプレートを置いておくディレクトリで、自由に設定できます。
この機能に関しては以下のページに非常に詳しい解説があります。 お薦めですので、ぜひ参照してみて下さい。
設定用の Emacs Lisp コードを別ファイルに保存し、 予めコンピュータが解釈しやすいような中間コードにコンパイル (バイトコンパイルと呼びます)してから読み込むこともできます。
ファイルをバイトコンパイルするには、M-x byte-compile-file で コンパイルしたいファイルを選ぶか、ファイルを開いてから 「Emacs Lisp」メニューの「Byte-Compile This File」を選びます。 拡張子「*.elc」の付いた中間コードファイルができていることを確認して下さい。
あとはこの「*.elc」ファイルを「.emacs」から読み込むだけです。 例えば、~/lib/start.elc というファイルを読み込む場合は
(load-file "~/lib/start.elc")
のようにします。 「.emacs」ファイルが長くなると Emacs の起動に時間がかかってしまいがちですが、 コンパイルした別ファイルをロードすることで、かなり時間が短縮されます。
なお、Emacs は起動時に 1 .emacs.elc → 2 .emacs.el → 3 .emacs の順にファイルを探して、最初に見つかったファイルをロードします。 Emacs の設定ファイル「.emacs(.el)」を直接バイトコンパイルし、 emacs.elc ファイルを作っておくと有効でしょう。
Emacs では、編集中のファイルを シェルのコマンド行に戻らずにコンパイルすることができます。 実際には、Emacs の内部でコンパイル専用のシェルを呼び出しているようです。 M-x compile として、compile 機能を呼び出すと ミニバッファに
Compile command: make -k
というプロンプトが現れます。 ここで、「make -k」を自分が使いたいコンパイルコマンドに修正してから、 リターンキーを押してください。 画面が上下2つに分割されて、下の画面でコンパイルを実行してくれます。 この機能を使えば、修正したソースコードをコンパイルする際に 何度もシェルと Emacs を行き来する必要がなくなります。
また、.emacs.el に以下のようなコードを記述しておけば、 画面下半分のコンパイルウィンドウの大きさを調整することができます。 下の例では、ウィンドウの大きさ(高さ)が10行になっています。
(setq compilation-window-height 10)
このコンパイル機能をさらに使いやすく拡張した 自作ライブラリもありますので、 次のステップとして試してみて下さい。
なお、コンパイル機能では、一度にひとつのコンパイルプロセスしか 動かすことができません。複数のコンパイルを並列して行う場合は、 *compilation* バッファをリネームする等の工夫が必要です。
私のプログラムの中でも、最も広く使っていただいているものです。
標準の コンパイル機能 を拡張したもので、
コンパイルコマンドをシンプルな方法でカスタマイズできるのが特徴です。
同様のものに、mode-compile
というパッケージがありましたが、
今は公開されていないようです。
以下のファイルを適切な場所に置いてから、(load-file) を使ってロードします。
(load-file "~/your_directory/smart-compile.el")
あるいは load-path を設定してから (require) で読み込んで下さい。
(require 'smart-compile)
Emacs 24 以降では、新しく収録された package.el パッケージ管理機能で smart-compile をインストールすることができます。 smart-compile は MELPA に収録されています。
M-x smart-compile で呼び出します。(キーバインドを割り付けておくと便利です。)
標準のコンパイル機能(M-x compile)は デフォルトで「make -k」を呼び出します。 これに対して、M-x smart-compile を使った場合、 「*.c」というファイル名の C 言語ファイルに対しては gcc, 「*.java」の Java ファイルに対しては javac... というように、 ファイル名に応じてデフォルトのコンパイルコマンドを変えることができます。 さらに、これらのファイルに対しては、コンパイルコマンドがバッファローカルで定義されます。
また、コマンドをファイル中に直接書くこともできます。
smart-compile は変数
compile-command
がローカルに定義されていれば、
これを使ってコンパイルコマンドを生成します。
例えば、ファイル先頭のコメント中に
-*- compile-command: "echo hi" -*-
と書いたり、ファイルの末尾のコメント文中に下のような行を書いておくと
Local Variables: compile-command: "echo hi" End:
次回ファイルを開いたときから "echo hi" がコンパイルコマンドに設定されます。 (参考:Specifying File Variables)
C-u M-x smart-compile のように、 先頭に C-u を追加して smart-compile を呼び出せば、 強制的にコンパイルコマンドを再生成できます。 例えば、途中でファイル名を変えたときに便利だと思います。 C-u はコマンドの動作を微妙に変えるときに使う汎用キーストロークで、 prefix と言います。 smart-compile は prefix を考慮して設計されています。
ファイルの冒頭部分に、ファイル名パターンとコマンド名の対応が定義してありますので、 自分の環境にあわせて書き換えることができます。 各要素の書式は、( ファイル名パターン . コンパイルコマンド名 ) ですが、 ファイル名パターンの代わりに Emacs のメジャーモード名、 コマンド名の代わりに emacs-lisp 関数を使うこともできます。
(defcustom smart-compile-alist '( ("\\.c\\'" . "gcc -O2 %f -lm -o %n") ("\\.[Cc]+[Pp]*\\'" . "g++ -O2 %f -lm -o %n") ("\\.java\\'" . "javac %f") ("\\.f90\\'" . "gfortran %f -o %n") ("\\.[Ff]\\'" . "gfortran %f -o %n") ("\\.tex\\'" . (tex-file)) ("\\.pl\\'" . "perl -cw %f") (emacs-lisp-mode . (emacs-lisp-byte-compile)) ) "...")
コマンド名の文字列中の %f という文字は、 自動的にファイル名に変換されます。 上の例では、test.c というファイルをコンパイルしようとすると、
("\\.c\\'" . "gcc -O2 %f -lm -o %n")
という定義に従って、 "gcc -O2 test.c -lm -o test" というコンパイルコマンドが生成されます。 他には下のような特殊文字列を使うことができます。
特殊文字 | 内容 |
---|---|
%F | ファイル名(絶対パス) |
%f | ファイル名 |
%n | 拡張子なしのファイル名 |
%e | 拡張子 |
ファイル名部分は、ディレクトリ名を含めることもできます。
例えば、大きなプロジェクトでは、Makefile をトップに置いて、
ソースファイルをサブディレクトリに分散させることがあります。
こういう場合は、リストの先頭に項目を追加する add-to-list
関数を使って、
このディレクトリ専用のルールを追加すると良いでしょう。
(add-to-list 'smart-compile-alist '("^/your/project/.*" . "make -C /your/project"))
なお、私は次のようにして
C-c C-c と "Tools" メニューのメニュー項目に
smart-compile
を割り当てています。
(global-set-key "\C-c\C-c" 'smart-compile) (define-key menu-bar-tools-menu [compile] '("Compile..." . smart-compile))
Emacs 22 のドラッグ&ドロップ対応機能を 拡張するためのマクロです。上記の smart-compile と同様、 ファイルのドラッグ&ドロップ時の動作を 柔軟にカスタマイズできます。
以下のファイルを適当な場所にダウンロードします。 なお、Carbon Emacs パッケージには smart-dnd が収録されていますので、改めてダウンロードする必要はありません。
(load-file) を使ってロードするか、 load-path を設定してから (require) して下さい。
(load-file "~/your_directory/smart-dnd.el") (require 'smart-dnd)
例えば、次のようなコードを .emacs.el に追加してみます。
(add-hook 'html-mode-hook (lambda () (smart-dnd-setup '( ("\\.gif\\'" . "<img src=\"%R\">\n") ("\\.jpg\\'" . "<img src=\"%R\">\n") ("\\.png\\'" . "<img src=\"%R\">\n") ("\\.css\\'" . "<link rel=\"stylesheet\" type=\"text/css\" href=\"%R\">\n" ) ("\\.js\\'" . "<script type=\"text/javascript\" src=\"%R\"></script>\n" ) (".*" . "<a href=\"%R\">%f</a>\n") ))))
そして、同じディレクトリに
というファイルがあるケースを考えます。 Emacs で test.html ファイルを開くと、html モードで編集ウィンドウが開きますが、この編集中のウィンドウに、test.jpg ファイルをドラッグ&ドロップしてみて下さい。 デフォルトでは、Emacs のウィンドウにドロップされたファイルは 新しい Emacs のバッファで開かれます。 しかし、smart-dnd が有効になっていると、 代わりに <img src="test.jpg"> という文字列が挿入されます。
smart-dnd は、HTML モードだけでなく TeX などの他の書類モードでも動作します。 次章の「カスタマイズ」を参考にしてパラメーターを設定し、 メジャーモードの hook に smart-dnd-setup を設定して下さい。
ドラッグ&ドロップ時に挿入される文字列は、 smart-dnd-setup に与えるパラーメーター(リスト)を修正することで、 自由にカスタマイズすることができます。 このリストは、次の順のリスト構造になっています。
そして、文字列中の % 記号は、それぞれ次のように置き換えられます。
特殊文字 | 内容 |
---|---|
%F | ファイル名(絶対パス) |
%f | ファイル名(ディレクトリ名を含まない) |
%r | ファイル名(相対パス 1) |
%R | ファイル名(相対パス 2) |
%n | 拡張子なしのファイル名 |
%e | 拡張子 |
「相対パス」は2種類あります。 例えば、編集中のファイルを一度も保存していないなどの場合に、 相対パスを計算できないことがあります。 そのような場合、%r はファイルの絶対パスを代わりに返します。 一方、%R は URL 表記(例:file:///tmp/test.html)を返しますので HTML モードなどに最適です。
TeXのOTF/UTFパッケージ用のマクロです。
仕様は下記の通りです。Emacs 本体の仕様変更のため、Emacs 23 以降に対応する予定はありません。(今のロジックでは、変換しない文字(森)と変換する文字(鷗)を自動判別できないため)
;; M-x utf-sty-encode-buffer, utf-sty-encode-region は ;; バッファ・リージョン内のテキストを \UTF{...} などに変換します。 ;; M-x utf-sty-decode-buffer, utf-sty-decode-region は ;; その逆の処理を行います。 ;; ;; 例)森鷗外 ⇔ 森\UTF{9DD7}外 ;; ;; また、prefix(C-u)を付けて使うこともできます。 ;; C-u M-x utf-sty-encode-buffer = M-x utf-sty-decode-buffer
TeX の原稿を保存するときに、 自動的にコンパイル(タイプセット)を実行します。 AUCTeX の PDF モードに応じて、 pdflatex あるいは ptex コマンドを非同期で呼び出します。 機能を ON/OFF しやすいよう、 マイナーモードとして実装しました。
動作環境は以下の通りです。 Mac OS X に依存している部分は、エラーを知らせてくれる say コマンドの部分です。 また、ファイル名からコマンド名を生成する部分で smart-compile ライブラリの関数を利用します。 少し修正すれば、他の環境(YaTeX 等)でも利用できると思います。
;; automatically run background TeX process (defun my-autotex () (when (string-match "\\.tex$" (buffer-file-name)) (let ((buf (get-buffer "*Background TeX proccess*"))) (if (bufferp buf) (kill-buffer buf)) ) ;; flush previous log (require 'smart-compile) ;; for smart-compile-string (start-process-shell-command "Background TeX" "*Background TeX proccess*" (if (and (boundp 'TeX-PDF-mode) TeX-PDF-mode) (smart-compile-string "pdflatex -interaction=nonstopmode %f || say oops") ;; PDFTeX (smart-compile-string "( platex-euc -interaction=nonstopmode %f && dvipdfmx %n ) || say oops") ;; pTeX ) ))) ;; wrapper (define-minor-mode my-autotex-mode "My autotex mode." :global nil :lighter " Auto" (if my-autotex-mode (add-hook 'after-save-hook 'my-autotex t t) ;; set the local flag to t (remove-hook 'after-save-hook 'my-autotex t) )) ;; hook (add-hook 'TeX-mode-hook (lambda () ;; (TeX-PDF-mode 1) (my-autotex-mode 1) ))
このページを作成するにあたって参考にさせていただいたページや、 さらに詳しく Emacs (Emacs Lisp) を知るための書籍を挙げておきます。