kwatch

え〜。消失したので、googleのcacheからとってきました。いずれ吸収します。


これはG o o g l eのhttp://kwatch.at.infoseek.co.jp/mule/mule.txtのキャッシュです。 G o o g l eがクロール時にページを保存したものです。 そのため、このページの最新版でない場合があります。こちらから最新のページ(ハイライト表示なし)を参照してください。 このページのリンク又はお気に入りの登録にはこのURLをお使い下さい:http://www.google.com/search?q=cache:Fr55W1HX6xsJ:kwatch.at.infoseek.co.jp/mule/mule.txt++site:kwatch.at.infoseek.co.jp+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEMule%E3%80%80%E3%82%AD%E3%83%BC%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%80%80%E3%82%B9%E3%83%88%E3%83%AD%E3%83%BC%E3%82%AF%E3%82%AD%E3%83%BC&hl=ja&lr=lang_ja&ie=UTF-8

Googleはこのページまたはページ内のコンテンツとは関連ありません。

これらのキーワードがハイライトされています: プログラマープログラマ の ため の mule キーキイ 割り当て ストローク キーキイ

.=title: プログラマーのためのMule .?title: プログラマーのためのMule .?author: kwatch <kwatch@lycos.jp>

●はじめにpreface
ここんとこ、Muleをやめて{{別のエディタhttp://www.jsdlab.co.jp/~kamei/}}を使っています。Muleによく似ている上により便利になっています。

ホントいうと、UNIXにおいていつまでもMuleやViが主流ではアカンと思ってます。それらを打ち負かすような特長をもった、それでいて初心者にも敷居が低いエディタがどんどんでてこないと、UNIXはいつまでたってもマニアの道具でしかないです。

といっても、プログラマにとってMule(Emacs)が最強のエディタであることは変わらないでしょう。ここではMuleの使い方がよくわからんという人に、実はMuleってこんなにすごいんだよということを紹介しています。内容は中級者向けです。

.+toc: 目次: .<<< mule.toc .-toc:

.# .+table_of_contents: 目次:

.# .* {{表記法#notation}}{{*(必ず読んで!)*}}
.# .* {{変数 load-path の設定#loadpath}}{{*(必ず読んで!)*}}
.# .* {{略語展開機能を使おう!(基本編)abbrev.html}}
.# .* {{略語展開機能を使おう!(応用編)abbrev2.html}}
.# .* {{動的略語展開機能を使おう!dabbrev.html}}
.# .* {{cc-mode を使おう!cc-mode.html}}
.# .* {{キーバインドを変更しよう!keybind.html}}
.# .* {{ソースコードに色をつけよう!color.html}}
.# .* {{フォントを変えよう!(for Win32)winfont.html}}
.# .* {{フォントの変え方 その1winfont.html#winfont1}}
.# .* {{フォントの変え方 その2winfont.html#winfont2}}
.# .* {{フォントの変え方 その3winfont.html#winfont3}}
.# .* {{インフォでの斜体をやめるwinfont.html#winfont4}}
.# .* {{コンパイルを楽にしよう!compile.html}}
.# .* {{コンパイルコマンドを変更するcompile.html#compile1}}
.# .* {{コンパイルウィンドウを小さくするcompile.html#compile2}}
.# .* {{そのほかcompile.html#compile3}}
.# .* {{テンプレートを使おう!template2.html}}
.# .* {{insert-templateの使い方template2.html#template}}
.# .* {{insert-template-hookの使い方template2.html#template}}
.# .* {{rectangle機能を使おう!rectangle.html}}
.# .* {{一行入力を簡素化しよう!ez-insert.html}}
.# .* {{その他、便利な機能tips.html}}
.# .* {{余分な空白を削除するtips.html#blank}}
.# .* {{大文字を簡単に入力するtips.html#uppercase}}
.# .* {{プログラムを整形するtips.html#indent}}
.# .* {{中身を確認して貼り付けるtips.html#browseyank}}
.# .* {{罫線を入力するtips.html#keisen}}
.# .* {{バッファ移動を便利にするtips.html#listbuf}}
.# .* {{改行文字を置換するtips.html#CqCj}}
.# .* {{日付を入力するtips.html#date}}
.# .* {{Muleに関するリンク集links.html}}
.# .-table_of_contents:

◎表記法notation

{{*C-x*}} とは、Controlキーを押しながらキー x を押すことです。.^ {{*CM-x*}} とは、Altキーを押しながらキー x を押す、.^ あるいは Escキーを{{*押した後に*}}キー x を押すことです。

.: 例: C-q C-r C-k

Controlキーを押しながら q を押し、.^ 次にControlキーを押しながら r を押し、.^ 最後にControlキーを押しながら k を押します。

.: 例: C-x a i l

Controlキーを押しながら x を押し、.^ 次にControlキーを{{*離して*}} a、i、l と押します。

.: 例: M-C-s

ControlキーとAltキーを押しながら s を押す、.^ あるいは ESCキーを{{*押した後に*}}Controlキーを押しながら s を押します。

◎変数 load-path の設定loadpath

あとで紹介する cc-mode.el や browse-yank.el を使うために、 自分のホームディレクトリの下に lib/emacs というディレクトリを作ってください。.^ そして自分の .emacs に .========================================

;;; load-path の設定 (setq load-path (append (list (expand-file-name "~/lib/emacs")   ) ; list end load-path)) .======================================== と書いておいてください。.^ そして cc-mode.el や browse-yank.el を、この emacs というディレクトリに入れておくと、これらのファイルが使えるようになります。

説明の中で、「xxxxxx.el をパスが通るところに入れてください」という表現があったら、xxxxxx.el をこのフォルダに入れるようにしてください。

●略語展開機能を使おう(基本編)!abbrev

Muleには、略語展開機能という非常に便利な機能があります。どういうものかというと、例えば "p" と入力して、あるキーを押すと、"printf" と展開してくれるというものです。これを使えば、例えば "al" という入力を "actionListener" に展開する、"sop" という入力を "System.out.println(" に展開する、ということが できます。

略語展開機能を用いることで、入力が軽減されるだけでなく、打ち間違いも少なくなります。また、「えーと、Javaではmain関数の書き方はどうだったっけ?」と忘れてしまっても、略語として登録しておけば、簡単に"public static void main(String args[]) {" と展開できます。

どの単語(略語)をどういう文字列に展開するかは、ユーザが自由に登録できます。また、登録はメジャーモード毎に行いますので、例えば "main" という単語を、C-mode では "int main(int argc, char argv[])" に展開し、Java-mode では "public static void main(String args[]) {" に展開するということができます。

◎略語の登録abbrev1

それでは実際に登録してみましょう。ここでは C-mode において、"w" が "while (" と展開されるように登録します。

まずはMuleを起動し、適当なプログラム(xxx.c)を書いてみてください。 すると C-mode になりますね。ここで "w" と押してください。 この状態ではカーソルが "w" の右隣にあります。 そして C-x a i l(Ctrlキーを押しながら x を押し、そのあとCtrlキーを 離して a、i、l) と打ちます。するとミニバッファに .----------------------------------------

Mode expansion for "w": .---------------------------------------- と聞かれますので、ここで "while (" と入力します。 .---------------------------------------- Mode expansion for "w": while ( .---------------------------------------- そしてリターンキーを押してみてください。先ほどの "w" が "while (" に展開されたと思います。これで "w" が "while (" に展開されるように登録できました。

◎略語の展開abbrev2

さて、今度は登録した単語(略語)を展開してみましょう。略語を展開するのは、C-x ' です。

まず、もう一度 "w" と入力してみてください。そして C-x ' (Ctrlキーを押しながら x を押し、そのあとCtrlキーを離して ' (シングルクォート))と入力します。すると "w" が "while (" に展開されたと思います。

また、お分かりとは思いますが、C-x ' で展開されるのは、あるいは C-x a i l で登録されるのは、カーソルの右にある単語です。よって、いくら "w" を略語として登録したといっても、"now" と入力してC-x ' と打っても "nowhile (" とは展開されません。.^ また、略語(単語)とカーソルとの間に空白や記号が入っていてもきちんと展開されますが、数字はだめです(数字は単語として認識されます)。他にも、略語が大文字だったりキャピタライズ(先頭の文字だけ大文字になっていること)されていたりした場合の動作など、自分でいろいろ試してみてください。

◎登録内容の保存abbrev3

最後に、この登録した略語を保存しましょう。どうやらMuleは、デフォルトで は登録した略語を保存してくれないようです(これについては後で説明します)。 そこで、次回もこの略語展開を使いたいと思ったら、自分で明示的に保存する 必要があります。それには、M-x write-abbrev-file(ESCキーを押した後に x を押し、write-abbrev-file と(ミニバッファに)入力してリターン)を 実行します。するとミニバッファに .----------------------------------------

Write abbrev file: ~/ .---------------------------------------- と聞かれますので、登録した略語を書き出すファイル名を入力します。 今回は ".abbrev_defs" と入力します(別にどんな名前でもいいのですが、 ふつうはこの名前にするようです)。 .---------------------------------------- Write abbrev file: ~/.abbrev_defs .---------------------------------------- 入力したらリターンキーを押してください。 これで登録した略語がホームディレクトリの下の ".abbrev_defs" という ファイルに保存されました。 次回のMule起動時にもこの設定を読み込むようにするには、 ホームディレクトリの下の .emacs に .======================================== ;;; abbrev(略語展開)のための設定 ;;; デフォルトでは "~/.abbrev_defs" を読み込む (read-abbrev-file) .======================================== と書いておきましょう。略語を保存するファイルの名前を他の名前にした人は、 .======================================== (read-abbrev-file "some/where/file") .======================================== としてください(当然ながら、"some/where/file" は適切に書き換えてください)。

さて、Mule はデフォルトでは登録した略語を保存してくれないと先ほど書きました。しかし、上の設定を行ってMuleの起動時に登録内容を読み込むように設定すると、今度は自動的に略語を保存してくれるようになります(略語登録の保存といっても、実際は "~/.abbrev_defs" ファイルを保存することです)。Mule の終了時や C-x s を押したときに、ミニバッファに .----------------------------------------

Save abbrevs in ~/.abbrev_defs? (y or n) .---------------------------------------- と聞かれますので、 y と打てば登録した内容が保存されます。

.+note: もう少し詳しく言うと、変数 save-abbrevs の値が nil だと保存してくれませんが、それ以外だと保存してくれます。そして、デフォルトでは変数 save-abbrevs は nil ですが、read-abbrev-file すると nil 以外の値になるということです。 .-note:

◎まとめabbrev4

まとめると、

. {{*略語の登録*}} .1) 略語を入力 .1) C-x a i l .1) ミニバッファに展開する語を登録 .^ .* {{*略語の展開*}} .1) 略語を入力 .1) C-x ' .^ .* {{*登録内容の保存*}} .1) M-x write-abbrev-file を実行 .1) ファイル名 ~/.abbrev_defs で保存 .1) ~/.emacs に (read-abbrev-file) と記述 .^ となります。

●略語展開機能を使おう!(応用編)abbrevx

さて、略語展開機能については基本的なことを述べました。 応用編として、略語展開機能をさらに便利につかうためのカスタマイズを説明します。また、私が C-mode と Java-mode でどのように略語展開機能を利用しているかを紹介します。

.+table_of_contents: 目次:

.* {{キー割り当ての変更#abbrevx1}}
.* {{複数行の登録#abbrevx2}}
.* {{C-modeでの登録例#abbrevx3}}
.* {{Java-modeでの登録例#abbrevx4}}
.-table_of_contents:

◎キー割り当ての変更abbrevx1

略語展開は非常に便利なものですが、ひとつだけ欠点があります。それは、略語を展開するためのキー C-x ' が{{*とっても打ちにくい!!*}}ことです。そこでこれをもっと打ちやすいキーに割り当てましょう。

私の場合、C-l に割り当てています(元々このキーには recenter という 機能(関数)が割り当てられていますが、私はこれを C-q C-l に割り当てています)。この変更により略語展開機能が非常に使いやすくなり、とても幸せです。.^ プログラムを書いているときには、略語展開を使いまくるので、本当に自分が打ちやすいと思うキーに割り当てるのがいいです。

C-mode においてキーの割り当てを変更するには、.emacs に .======================================== (define-key c-mode-map "キー" '関数名) .======================================== と書いておきます。例えば、私のように C-l に略語展開機能(関数名は expand-abbrev)を割り当てようと思ったら、.emacs に .======================================== (define-key c-mode-map "\C-l" 'expand-abbrev) .======================================== と書いておきます。

C-modeだけでなく、全てのモードでキーバインドを変更したいなら、 .======================================== (define-key global-map "\C-l" 'expand-abbrev) .======================================== とします(私はこうしています)。

C-l のような、既にキー割り当てがあるものは変更したくないなー、ということでしたら、M-n や M-p などが空いてますので、これらに割り当てるといいでしょう。例えば C-mode で M-n に略語展開機能を割り当てようと思ったら、.emacs に .======================================== (define-key c-mode-map "\M-n" 'expand-abbrev) .======================================== と書いておきます。

.+note:

キー割り当てについての詳しいことは、{{「キー割り当てを変更しよう!」keybind.html}}を参照してください。
.-note:

.+##### キー割り当て変更のためのヒントを少し。.^ Mule では、C-\ と M-g と M-o と M-s と M-p と M-n には機能(関数)を割り当てていませんので、これらに好きな機能(関数)を割り当てましょう。 .^ また、C-] は quail-mode という機能(関数)が割り当てられていますが、日本ではあまり使わないので、変更してもいいでしょう。.^ さらに C-q も押しやすいキーなのに quoted-insert というあまり使われない機能(関数)が割り当てられています。これももっとよく使う機能に割り当て直すといいでしょう。 .-#####

◎複数行の登録abbrevx2

略語展開では、ひとつの略語を複数行に展開することができます。例えば、"main"という単語(略語)を C-x ' で .========================================

int main(int argc, char argv[]) { .======================================== と展開させたり、"comment"という単語(略語)を .======================================== /*********************************************************

***********************************************************/

.======================================== と展開させたりすることができます。

複数行を登録するには改行を入れなければいけませんが、登録する際にミニバッファで C-q C-j と打つと改行を入力できます(リターンキーを押しても改行を登録することはできません)。.^ また、あらかじめ C-w や M-w で複数行をコピーしておき、ミニバッファで展開する語を入力する場面で C-y として入力してもよいです。.^ さらに、直接 ~/.abbrev_defs をいじって登録することもできます(もちろん、注意していじってください)。

私はこれを使って関数のコメントを略語として登録しており、"sfunc" を展開することでstaticな関数のコメントを、"gfunc" を展開することでglobalな関数のコメントを入力しています。みなさんもそれぞれ便利な使い方を考えてみてください。

◎C-modeでの登録例abbrevx3

以下に、わたくしが C-mode で登録している内容を示します。.^ 登録する際の方針としては、頻出度の高いものを中心に登録しています。だいたい1文字で登録しています。.^ 個人的には、"q" で "exit(0);"と展開されるのが気に入っています("q" は "quit" のつもりです)。.^ また、"ture" と打ち間違えることの多い "true" を登録しています。これで、「あ、打ち間違えた!」と思っても、キー操作一発で修正できてしまうので便利です。略語展開機能には、入力ミスを防ぐだけでなく修正するチカラまであるんです。

.+-----------------------------------------------------------------------

w ., while ( while ., while ( i ., if ( if ., if ( f ., for (i = 0; i < for ., for (i = 0; i < s ., switch ( sw ., switch ( sz ., sizeof( st ., struct d ., default b ., break; r ., return n ., NULL e ., extern p ., printf(" fp ., fprintf(stderr," q ., exit(0); ture ., true in ., #include def ., #definle ifdef ., #ifdef elif ., #elif else ., #else end ., #end /* / dont ., / do nothing /; sfunc ., /----------------------------------------.^.^----------------------------------------/ gfunc ., /========================================.^.^========================================*/ main ., #include .^.^int main(int argc,char argv[]).^{ hasami.[].[].[].[].[].[].[].[].[] ., / ----- 8< ------ 8< ------ 8< ------ 8< ------ / .+----------------------------------------------------------------------- 《 C-mode の略語 》

◎Java-modeでの登録例abbrevx4

次は Java-mode での略語登録です。.^ Javaはキーワード(予約語)が多いうえに、クラス名やメソッド名が頻出するので、登録することも多くなってしまいました。 Cならprintfですんだものが、JavaではSystem.out.printlnですから、略語として登録すべきでしょう。.^ synchronized なんて略語登録でもしておかないと、打ちにくいわ綴りは分からんわでストレスのもとになり、血圧も上がります。しかし、略語登録すればストレスはなくなり血圧も70以下まで下がるといわれています。健康のためにも、ぜひ略語登録をしたいものです。

変わった使い方としては、exceptionの名前をいくつか登録しています。こうすると、"exception" と入力して C-x ' を何回か押していくと、目的のexceptionになります。こんな使い方もできるとは、恐るべし略語展開機能。

.+-----------------------------------------------------------------------

w ., while ( while ., while ( i ., if ( if ., if ( f ., for (int i = 0; i < for ., for (int i = 0; i < s ., switch ( sw ., switch ( sz ., sizeof( d ., default b ., break; r ., return n ., null ture ., true pub ., public st ., static pro ., protected sync ., synchronized syc ., synchronized v ., void in ., import int ., interface ins ., instanceof pri ., private pub ., public c ., catch cat ., catch catch ., catch (Exception e) { l ., length bool ., boolean bl ., boolean imp ., implements pv ., public void ex ., extends sop ., System.out.println(" sep ., System.err.println(" q ., System.exit(0); exit ., System.exit(0); sg ., String g ., Graphics im ., Image main ., public static void main(String[] args) { jap ., java.applet ja ., java.awt.; jawt ., java.awt.*; ju ., java.util.*; exception ., MalFormedURLException malformedurlexception ., NumberFormatException numberformatexception ., InterruptedException ap ., public void actionPerformed(ActionEvent ev) {.^.[].[].[].[]String command = ev.getActionCommand();.^} aal ., addActionListener actionp ., public void actionPerformed(ActionEvent ev) { .^.[].[].[].[]String command = ev.getActionCommand(); .^} addactionlistener ., addActionListener(new ActionListener() { .^.[].[].[].[]public void actionPerformed(ActionEvent ev) {.^.[].[].[].[].[].[].[].[]ev.getSource(); .^.[].[].[].[]} .^} .+----------------------------------------------------------------------- 《 Java-mode の略語 》

●動的略語展開機能を使おう!dabbrev
先ほどの{{略語展開機能#abbrev}}は、
あらかじめ登録しておいたものだけしか展開できませんでした。 いまから紹介する動的略語展開機能(dynamic abbrev、略してdabbrev)は、 あらかじめ登録していなくても展開してくれるというスグレモノです。

例えば、次のようなプログラムを入力していたとします。 .======================================== String errorMessage = "segmentation fault!"; System.out.println({{*e*}} .======================================== さて、最後の e ですが、これは errorMessage と入力するつもりです。 カーソルはこの e のすぐ後ろにあるとします。.^ ここで M-/ (関数dabbrev-expand)を押してください。 すると、e が errorMessage となって、次のようになります。 .======================================== String errorMessage = "segmentation fault!"; System.out.println({{*errorMessage*}} .======================================== これは、M-/ を押すと 「カーソルのすぐ右にある単語を取り出し、 その単語と先頭の文字列が一致する単語を探してきて置き換えてくれる」 からです。 探すのはカーソルより上の行からですが、 なければ下の行から探してくれます。

もうひとつ例をだします。先の例と似ていますが、少し違います。 .======================================== String systemErrorMessage = "segmentation fault!"; System.out.println({{*s*}} .======================================== 最後の s は、systemErrorMessage と入力するつもりです。 カーソルは、最後の s のすぐ後ろにあるとします。.^ ここで M-/ を押すと、s は system に展開されます。.^ .======================================== String systemErrorMessage = "segmentation fault!"; System.out.println({{*system*}} .======================================== もう一度 M-/ を押すと、s は segmentation に展開されます。.^ .======================================== String systemErrorMessage = "segmentation fault!"; System.out.println({{*segmentation*}} .======================================== もう一度 M-/ を押すと、s は systemErrorMessage に展開されます。.^ .======================================== String systemErrorMessage = "segmentation fault!"; System.out.println({{*systemErrorMessage*}} .======================================== もう一度 M-/ を押すと、s は string に展開されます。.^ .======================================== String systemErrorMessage = "segmentation fault!"; System.out.println({{*string*}} .======================================== このように、連続して M-/ を押すことで、次々と単語が展開されます。

これが動的略語展開機能です。 先の略語展開機能と違い、まさに動的です。 これも非常に便利な機能ですので、ぜひ使いこなしましょう。 Muleを使っているのに略語展開機能と動的略語展開機能を使わないのは 非常にもったいないですよ。

ちなみに、私にとって M-/ は押しにくいので、C-o にこの機能を割り当てています。 あまりによく使う機能のうえ、連続して押すことも多いので、押しやすいキーに割り当てました。 .======================================== ;;; C-o に動的略語展開機能を割り当てる (define-key global-map "\C-o" 'dabbrev-expand)     .========================================

●cc-mode を使おう!cc_mode

cc-modeとは、従来のc-modeに替わるものであり、従来はバラバラに存在していた c-mode, c++-mode, Objective-c-mode, Java-mode をまとめてサポートしたものです。ここでは cc-mode について、簡単ではありますが説明します。私の .emacs のうち、cc-modeに関する部分も載せておきましたので、参考にして下さい。

.+#####

また{{Mule FAQhttp://www.cit.ics.saitama-u.ac.jp/faq/mule-faq.html}}も参考にして下さい。
.-#####

.+table_of_contents: 目次:

.* {{cc-modeを使うための設定#cc_mode1}}
.* {{cc-modeでのインデント#cc_mode2}}
.* {{cc-modeの簡単な使い方#cc_mode3}}
.* {{cc-modeのカスタマイズ例#cc_mode4}}
.-table_of_contents:

◎cc-modeを使うための設定cc_mode1
Emacs 19.?? からは、従来のc-modeに替わり、cc-mode が 標準で使われるようになりました。 ただし、バージョンが古いので、新しいのを入れたほうがいいです。 最新のバージョンは1996/7/15現在で 5.21 ですが、これは Mule for Win32 では動かないかもしれないので、ここでは Version 4.379 を使います。

cc-mode Version4.379は{{ここからcc-mode-4-379.zip}}ダウンロードできます。.^
ダウンロードしてきたら解凍し、cc-mode.elを取り出します。 そしてこれを自分のパスが通るところにコピーしてください
(わからない方は{{こちらindex.html#loadpath}}を参照してください)。

次に、自分の .emacs を設定します。以下を付け加えてください。 .======================================== ;;; ;;; cc-mode.el の使用 ;;; (fmakunbound 'c-mode) (makunbound 'c-mode-map) (fmakunbound 'c++-mode) (makunbound 'c++-mode-map) (makunbound 'c-style-alist) (autoload 'c-mode "cc-mode" "C Editing Mode" t) (autoload 'c++-mode "cc-mode" "C++ Editing Mode" t) (autoload 'objc-mode "cc-mode" "Objective-C Editing Mode" t) (autoload 'java-mode "cc-mode" "Java Editing Mode" t) (setq auto-mode-alist

(append '( ("\\.c$" . c-mode) ("\\.h$" . c-mode) ("\\.java$" . java-mode) ("\\.m$" . objc-mode) ("\\.c\\+\\+$" . c++-mode) ("\\.cpp$" . c++-mode) ("\\.cc$" . c++-mode) ("\\.hh$" . c++-mode) ) auto-mode-alist)) .======================================== これでcc-modeが使えるようになりました。.^ 試しに、何らかの C や Java のファイルを開いてみてください。そして、 M-x c-version を実行して見てください。ミニバッファに "Using CC Mode version 4.379" と表示されればOKです。なお、cc-modeを使っていてもミニバッファに "cc-mode" と出るわけではなく、"C" や "Java" と表示されますので間違わないように。

◎cc-modeでのインデントcc_mode2
.+##### cc-modeのカスタマイズについての詳細は
{{インフォhttp://www.comnets.rwth-aachen.de/doc/gnu/emacs/cc-mode_toc.html}}を参照してもらうとして、ここでは簡単に説明します。
.-#####

Cc-modeにおけるソースコードのインデントについてです。.^

インデントは各自それぞれのスタイルがあるかと思いますが、cc-modeにはあらかじめ幾つかのスタイルが用意されています(これを{{ビルトインモードhttp://www.comnets.rwth-aachen.de/doc/gnu/emacs/cc-mode_19.html}}といいます)。列挙すると、次のとおりです。

.: {{*gnu*}} GNUが推奨するスタイル .: {{* k&r }} 「プログラミング言語C(通称K&R)」のスタイル .: {{ bsd }} BSD Unix のスタイル .: {{ stroustrup }} 「プログラミング言語C++」のスタイル .: {{ whitesmith }} B.J.プローガー氏のスタイル .: {{ ellemtel }} C++ではポピュラーなスタイル(らしい) .: {{ java }} Javaを書くのに適したスタイル。java-modeになると自動的に選択される .: {{ CC-MODE*}} cc-modeで用意しているスタイル。大文字であることに注意

.+# .# .: ellemtel .# "Programming in C++, Rules and Recommendations", Erik Nyquist and .# Mats Henricson, Ellemtel で紹介されている、ポピュラーなスタイル(らしい) .-#

デフォルトでは、gnuスタイルが選択されています。これを他のスタイルにするには、M-x c-set-style [Return] スタイル名 [Return] とするか、あるいは自分の .emacs に以下のように書き加えてください。 .======================================== (add-hook 'c-mode-common-hook

'(lambda () (c-set-style "--スタイル名--"))) .========================================

私がお勧めするスタイルは CC-MODE です。インデント量も4ですし、これがいちばん癖がなくていいでしょう。ちなみに、k&rスタイルはインデント量が5です。前述したスタイルをいろいろ試してみて、気に入ったものを見つけてください。

当然ですが、自分で新しいスタイルを作ったり、既存のスタイルをカスタマイズ することもできます。残念ながらここでは説明を割愛しますので、インフォを参照してください。また、私のカスタマイズ例を最後に載せておきますので、参考にしてください。

スタイルを変更すると、新しく書くコードは新しいスタイルに従ってインデントされますが、既存のコードは(何もしなければ)自動的にインデントされるわけではありません。既存のコードを新しいスタイルに従って整形するには、

.: C-x h バッファ全体にリージョンを設定する .: M-C-\ リージョンをインデントする

を使うと便利です。また、関数{{indent-and-next-linetips.html#indent}}も便利ですので使ってみてください。
◎cc-modeの簡単な使い方cc_mode3

cc-modeの使い方を簡単に説明します。

.:C-c C-d

BackSpaceを押したときに、カーソルの左側にある空白を全て消す/ひとつずつ消すを入れ替える .:C-c C-a "{" や ")" で自動的に改行をする/しないを入れ替える .:C-c C-c リージョンをコメントアウトする。引数として -1 を与えると、コメントを外す .:C-c C-q 関数をインデントする .:C-c RET 関数にリージョンを設定する .:C-c C-n プリプロセッサの #if に対応する #endif に移動する .:C-c C-p プリプロセッサの #endif に対応する #if に移動する .:C-c C-u #if と #endif のあいだにカーソルがあるとき、#if に移動する .:C-c C-e プリプロセッサを使ってマクロを展開したものを表示する .:C-c C-\ リージョンの行末に "\" をつける。複数行のマクロを書くときなどに便利

◎cc-modeのカスタマイズ例cc_mode4

参考までに、自分の .emacs のうち、cc-modeに関する部分を載せておきます。新しく自分用のスタイルを定義していますが、新しいスタイルを定義するときはCC-MODEスタイルとの差分を記述すればいいそうです。私の場合、caseラベル部分とコメント部分のインデントを除き、ほぼCC-MODEスタイルで済みました。 .======================================== (defconst my-style

'( ;; インデント幅を空白4コ分にする ;(c-basic-offset . 4) ;; コメントだけの行のインデント幅 ;(c-comment-only-line-offset . 4) ;; インデント量の設定 (c-offsets-alist . ( (comment-intro . 0) (case-label . ) ; or 2 (statement-case-intro . ) ; or 2 ;(access-label . 0) )) ;; '{' や '}' での改行の制御 ;(c-hanging-braces-alist . ( ; ;; デフォルトは以下の4つ ; (brace-list-open) ; (substatement-open after) ; (block-close . c-snug-do-while) ; (extern-lang-open after) ; ;; 以下を追加 ; (brace-list-close) ; ;(class-open after) ; (class-close before) ; (inline-open after) ; (arglist-cont-noempty after) ; (statement-cont after) ; )) ;; '}' で改行したのをもどす ;(c-cleanup-list . ( ; ;brace-else-brace ; empty-defun-braces ; ;defun-close-semi ; list-close-comma ; scope-operator ; )) ) "My Style")

;;; ;;; cc-mode共通の設定 ;;; (add-hook 'c-mode-common-hook

'(lambda () ;; 自分用のスタイルを使う (c-add-style "my-style" my-style t) (c-set-style "my-style")

;; いつでも TAB でインデント (setq c-tab-always-indent t)

;; hungry-state にしない (c-toggle-hungry-state -1)

;; ;; 新規作成時だけ auto-indent にする (if (not (file-exists-p buffer-file-name)) (c-toggle-auto-state 1))

;; C-c C-c でコンパイル, C-c c でコメントアウト (define-key c-mode-map "\C-c\C-c" 'compile) (define-key c-mode-map "\C-cc" 'comment-region)

;; コンパイルウインドウの大きさを制限する (setq compilation-window-height 8)

;; 日本語コードをEUCにする (if (not (eq system-type 'windows-nt)) (set-default-file-coding-system euc-japan}}

;; かんなで "、" を入力できるようにする (if (and (boundp 'CANNA) CANNA) (local-set-key "," 'canna-self-insert-command))

;; RET と C-j を入れ替える ;(local-set-key "\C-j" 'newline) ;(local-set-key "\C-m" 'newline-and-indent)

)) ;; end c-mode-common-hook .========================================

●キー割り当てを変更しよう!keybind

キー割り当てこそカスタマイズの基本です。.^ エディタは、自分が使いやすいようにキー割り当てを変更してこそ、自分の道具となります。.^ あなたもバリバリにキー割り当てをカスタマイズして、Muleなしでは生きていけない体になってください。

.+table_of_contents: 目次:

.* {{キー割り当ての基本#keybind1}}
.* {{ホームポジションを離れないために#keybind2}}
.* {{デフォルトで空いているキー#keybind3}}
.* {{2ストロークキーによる拡張#keybind4}}
.* {{キー割り当ての方針#keybind5}}
.-table_of_contents:

◎キー割り当ての基本keybind1

キー割り当てを変更する方法を説明します。

あるキーに対して機能(関数)を割り当てるには、define-key または global-set-key という関数を使います。例えば C-h に delete-backward-char という関数を割り当てるには、以下のようにします。 .======================================== (define-key global-map "\C-h" 'delete-backward-char) ; あるいは (global-set-key "\C-h" 'delete-backward-char) .========================================

あるモードだけキー割り当てを変更したいときには、 define-key の例に出てきた global-map の代わりに、モードごとのキーマップを指定します。例えば、 C-mode でだけ M-p に compile という関数を割り当てるには、次のようにします。 .======================================== (define-key c-mode-map "\M-p" 'compile) .========================================

機能(関数)を2ストロークキーに割り当てることもできます。例えば C-x C-y に {{browse-yanktips.html#browseyank}}を割り当てるなら、次のようにします。
.======================================== (define-key global-map "\C-x\C-y" 'browse-yank) ; または (global-set-key "\C-x\C-y" 'browse-yank) .========================================

ファンクションキーに割り当てることもできます。例えば F4 に toroku-region を割り当てるなら、次のようにします。 .======================================== (define-key global-map [F4] 'toroku-region) .========================================

◎デフォルトで空いているキーkeybind2

Mule のデフォルト設定では、以下のキーには 機能(関数)を割り当てていませんので、これらに好きな機能(関数)を割り当てましょう。 .---------------------------------------- C-\, M-g, M-n, M-o, M-p, M-s, C-x c, C-x p, C-x t, C-x w, C-x y, C-x z, C-x C-a, C-x C-h, C-x C-j, C-x C-m, C-x C-y, M-C-m, M-C-q, M-C-x, M-C-y, M-C-z .----------------------------------------

また、記号でもかまわなければ、以下のキーも空いています。 .---------------------------------------- C-x 7, C-x 8, C-x 9, C-x !, C-x @, C-x #, C-x %,

C-x ~, C-x &, C-x , C-x _, C-x, C-x {, C-x },
C-x ", C-x :, C-x \, C-x ?, C-x ,, M- `, M- &, M- , M- _, M- +, M- [, M- ], M- ", M- :, M- ?, .----------------------------------------

例えば、指定された行番号へ移動する goto-line という関数があります。 この関数は筆者もよく使いますが、なぜか標準ではどのキーにも割り当てられ ていません。そこで、これを M-g に割り当てることにします。 以下を自分の .emacs に書いてください。 .======================================== ;; 指定した行に移動する (global-set-key "\M-g" 'goto-line) .========================================

また、C-] は quail-mode という機能(関数)が割り当てられていますが、 日本ではめったに使わないでしょう。 C-q も非常に押しやすいキーなのに、 quoted-insertという使用頻度の低い機能(関数)が割り当てられています。 これらを、自分がよく使う機能(関数)を割り当てると幸せになれます。

ちなみに、現在のキー割り当てを一覧するには C-h b を使います。 これで空いているキーを捜してください。

◎2ストロークキーによる拡張keybind3

Mule では、デフォルトで空いているキーがいくつかありますが、 これだけでは自由に割り当てられるキーが少ないですね。 そんなときは、2ストロークキーで拡張しましょう。.^ 私は C-q を使って拡張しています。 C-q には quoted-insert という関数が割り当てられてますが、 これを C-q C-q に割り当てます。 .======================================== ;;; C-q でキーバインドを拡張する (global-unset-key "\C-q") ; default 'quoted-insert (global-set-key "\C-q\C-q" 'quoted-insert) ; default C-q .======================================== これで準備はできました。あとは自分の好きなように拡張してください。 以下は私の例です。 .======================================== ;;; C-q を接頭辞として使うことができる。 (global-set-key "\C-q\C-q" 'quoted-insert) ; default C-q (global-set-key "\C-q\C-]" 'quail-mode) ; default C-] (global-set-key "\C-q\C-o" 'open-line) ; default C-o (global-set-key "\C-q\C-u" 'universal-argument) ; default C-u (global-set-key "\C-q\C-w" 'kill-region) ; default C-w (global-set-key "\C-q\C-l" 'recenter) ; default C-l ; (global-set-key "\C-q\C-p" 'beginning-of-buffer); default M-< (global-set-key "\C-q\C-a" 'beginning-of-buffer); default M-< (global-set-key "\C-q\C-n" 'end-of-buffer) ; default M-> (global-set-key "\C-q\C-e" 'end-of-buffer) ; default M-> (global-set-key "\C-q2" 'compare-windows) ; default unbinded (global-set-key "\C-q\C-y" 'browse-yank) ; default unbinded (global-set-key "\C-q\C-k" 'compile) ; default unbinded (global-set-key "\C-q\C-c" 'comment-region) ; default .========================================

また、3ストロークキーを設定することもできます。 以下は、C-q C-mを3ストロークキーの接頭辞にした私の例です。 .======================================== ;;; C-q C-m を用いた拡張 (global-unset-key "\C-q\C-m") ;;; (global-set-key "\C-q\C-m\C-o" 'overwrite-mode) ;(global-set-key "\C-q\C-m\C-o" 'outline-minor-mode) (global-set-key "\C-q\C-m\C-a" 'auto-fill-mode) (global-set-key "\C-q\C-m\C-f" 'fundamental-mode) (global-set-key "\C-q\C-m\C-t" 'text-mode) (global-set-key "\C-q\C-m\C-i" 'indented-text-mode) (global-set-key "\C-q\C-m\C-p" 'picture-mode) (global-set-key "\C-q\C-m\C-l" 'japanese-latex-mode) (global-set-key "\C-q\C-m\C-y" 'yatex-mode) (global-set-key "\C-q\C-m\C-e" 'emacs-lisp-mode) (global-set-key "\C-q\C-m\C-c" 'c-mode) (global-set-key "\C-q\C-m\C-d" 'c++-mode) ; 'c++' is 'd' (^-^) (global-set-key "\C-q\C-m\C-m" 'objc-mode) (global-set-key "\C-q\C-m\C-j" 'java-mode) (global-set-key "\C-q\C-m\C-h" 'html-helper-mode) .========================================

◎ホームポジションを離れないためにkeybind4

{{*Tabの入力は C-i で*}}.^ タブを入力するのに、普通はTabキーを使います。しかし、C-i でもタブを入 力することができます。同じように、改行を入力するのに普通はEnterキーを 用いますが、C-m でも入力することができます。これらはホームポジションか らあまり指を動かすことなく入力できるので、便利です。ぜひ使ってみてくだ さい。

{{*改行は C-m で、字下げもするなら C-j で*}}.^ プログラムを書いているときは、EnterキーあるいはC-mで改行し、Tabキーあ るいはC-iで字下げするということを頻繁に行います。しかし、C-jを使えば これがいっぺんにできます。つまり、C-jを押せば、改行と字下げとを一度に やってくれるのです。まさに一石二鳥、一挙両得、両手に花(意味不明)。 とにかく便利ですのでこれも使いましょう。

{{*ESC は C-[ で *}}.^ ESCキーは、キーボードによって位置がまちまちだったりするうえに、ホーム ポジションから遠い位置にあります。そんなあなたに耳寄りな話があります。 実は、C-[ が ESCキーと同じ役目を果たしてくれます。つまり、C-[ を押せば エスケープシーケンスが発生するのです。M-x と入力するときも、C-[ x と入 力すればOK。ホームポジションから手を離さないですみます。 これで、ESCキーを押すために、画面から目を離してキーボードを見るとい うことがなくなるでしょう。

{{*BackSpaceキーの代わりに C-h を*}}.^ ESCキーと同じくらいホームポジションから遠いのが BackSpaceキー(BSキー)です。頻繁に使うキーなのに、なぜあんな遠いところにあるんや!もっと打ちやすいところにないんかい!そんなあなたに、term/keyswap.el をオススメします。これは、BackSpaceキーと C-h とを入れ替えてしまうEmacsLispです。.^ もともとUNIXではC-hで一文字消去が行えることが多いですし、MS-DOSプロンプトでもC-hで一文字消去が行えます。このように、C-hをBackSpaceキーのかわりにすることはよく行われることなので、Emacs(Mule)ではBackSpaceキーとC-hとを入れ替えるEmacsLispがあらかじめ用意されているのです。.^ これを用いると、C-hが一文字消去、BackSpaceキーがヘルプになります。使い方は、以下の通りです。 .======================================== ;; C-h と BS を入れ替える (load "term/keyswap" nil t) ;; "term/bobcat" でもOK .======================================== ちなみに筆者は C-h もBackSpaceキーも一文字消去にしています。どっちも一文字消去として使うのです。.^ そしてヘルプは C-q C-h に割り当てています。これには C-q を接頭辞として使うための設定が必要となりちょっと面倒ですので、通常は C-x C-h に割り当てるほうが面倒がなくていいでしょう。 .======================================== ;;; C-h でカーソルの左にある文字を消す (define-key global-map "\C-h" 'delete-backward-char)

;;; C-h に割り当てられている関数 help-command を C-x C-h に割り当てる (define-key global-map "\C-x\C-h" 'help-command) .========================================

{{*Deleteキーのかわりに C-d を*}}.^ BackSpaceキーと似た働きをするものに、Deleteキー(Delキー)があります。Windowsのアプリケーションでは普通、BackSpaceでカーソルの左にある文字を消し、Deleteキーで右にある文字を消します。.^ ところが、Mule for Win32 ではDeleteキーがBackSpaceキーと同じ働きをする ようです。つまり、Deleteキーでもカーソルの左にある文字が消えます。 なぜこうなっているかはわかりませんが、もしカーソルの右にある文字を消し たいのなら、C-d が使えます。ホームポジションから遠い位置にあるDeleteキー を使うより、C-d を使いましょう。

.#+++++

◎Tabキー、Enterキー、Escapeキー、Backspaceキー についてspecial

C-i はTabキーの代わりになります。.^ C-m はEnterキーの代わりになります。.^ C-[ はEscape(ESC)キーの代わりになります。.^ C-j はEnterキーを押してTabキーを押したのと同じ効果があります(つまり、改行とインデントを同時にやってくれます)。.^

C-h は、UNIXやMS-DOSではよく BackSpace として使われます。 BackSpaceキーは押しにくい位置にあるので、 押しやすい C-h で一文字消去ができると便利です。.^ しかし、Muleではデフォルトで C-h にヘルプが割り当てられています。 これを変更するには、自分の .emacs に以下のように書いてください。 .======================================== ;;; C-x C-h をヘルプにする (define-key global-map "\C-x\C-h" 'help-command) ;;; C-h でカーソルの後ろの文字を消す (define-key global-map "\C-h" 'delete-backward-char) .======================================== .#-----

◎キー割り当ての方針keybind5

キー割り当ての大原則は、

.* よく使う機能はは押しやすいキーに割り当てる.^ .* あまり使わない機能は押しにくいキーに割り当てる(またはキーに割り当てない) です。これは誰もが考えつくことです。

しかし、もうひとつ大事なことがあります。

.* 連続して使う機能は1ストロークキーに割り当てる .* 連続して使わない機能は1ストロークキーに割り当てない 例えば、一行を消す機能は連続して使うことが多いので C-k という1ストロークキーが便利です。 連続して使いたいときは C-k を押しっぱなしにすればいいわけです。 それに対し、ファイルを開くという機能も非常によく使いますが、 連続して使うことはないので C-x C-f という2ストロークキーでいいわけです。

この観点からいうと、あまり使わない機能でも、連続してつかいたいことがあるなら1ストロークキーに割り当てるべきです。.^ 例えば私の場合ですと、キーボードマクロを実行する機能(標準で C-x e)は、普段使わないけど使うときは連続して使うので、2ストロークキーでは都合がわるく、自分で C-] に割り当てています。.^

また私の作った、{{インデントして次の行に移動するtips.html#indent}}という機能は、連続して使ってこそ意味があるものなので、やはり1ストロークキーの M-n に割り当てています。

また逆に、よく使う機能でも連続して使わないのなら、1ストロークキーに割り当てなくても構わないということですから、 C-q や C-l や C-w や C-z や C-u や C-h などは2ストロークキーにしてもよく、他に1ストロークキーで割り当てたほうがよい機能があれば、そちらにキーを譲るべきだと思います。

もうひとつ、キー割り当てで考慮すべきことがあります。 それは、 .* 間違って押すとよくないものを1ストロークキーに割り当てない ということです。.^ 例えば、指定した範囲を削除する機能は C-w に割り当てられていますが、これはよくない。C-q や C-e を押そうとして、間違って C-w を押してしまう可能性が高いです。

もちろん、間違って押したときは C-_ を押せばもとに戻せますし、C-y を押して削除したのを同じ場所に貼り付けることもできます。しかし、問題は「間違って押したことに気づかないことがある」ということです。

私は結構このミスを繰り返しました。 プログラムが完成した!と思ってコンパイルすると、全然通らない。 あれ〜?と思ってみると、できたはずのプログラムのうち、 上半分が全てなくなっているではないか! そう、気づかぬうちに C-w を押していたのです。.^ 通常、Muleは削除したものを20個まで覚えてくれるのですが、 それ以上は覚えていませんので復活できません。 このときも、復活できませんでした。 おかげで、もう一度プログラムを書く羽目に・・・.^ これに懲りて、指定した範囲を削除する機能は C-q C-w に割り当て、 C-w にはスクロールダウンする機能を割り当てました。 C-w なら、間違って押しても害はないですから。

●ソースコードに色をつけよう!color

.#+ .#それには、hilit19.elをロードします .#(hilit19.el は Mule に標準でついてきます)。 .#どんな感じになるかを見たかったら、 .#.---------------------------------------- .# M-x load-library {{*RETURN*}} hilit19 {{*RETURN*}} .#.---------------------------------------- .#と打つと hilit19.el をロードすることができますので、 .#ロードしたあとに C のソースや自分の .emacs を開いてみてください .#(javaのソースは色がつきません。これについては後述)。 .#いつも色をつけたかったら、自分の .emacs に .#.======================================== .#;;; 編集画面に色をつける .#(load-library "hilit19") .#.======================================== .#と書いてください。 .# .#hilit19をロードすると、いろんな主モードで色がつくようになります。 .#例を挙げると、c-mode、c++-mode、html-helper-mode、dired-mode、 .#emacs-lisp-mode、GNUS、info、‥‥ などです。.^ .#ただし、java-mode では色がつきません。 .#java-mode で色をつけるには、hilit-java.el を読み込んでください .#(hilit-java.el はここからとってこれます。 .#これをパスが通っているディレクトリにおいてください)。 .#自分の .emacs に、次のように書いておくとよいでしょう。 .#.======================================== .#(add-hook 'java-mode-hook .# '(lambda () .# (load-library "hilit-java"))) .#.======================================== .# .#hilit19についての注意を少々。.^ .#hilit19をロードした後に開いたファイル(を編集するバッファ)は色がつきます .#が、ロードする前に開いたものは色がつきません。 .#このときは C-l で再表示させると、色がつきます(もしつかないときは、 .#そのバッファを消して、もう一度ファイルを読み込み直してください)。.^ .#また、入力したテキストにすぐ色がつくわけでもありません。 .#色をつけるには、やはり C-l で再表示させる必要があります。 .#このへんは不満が残るところですが仕方ありません。.^ .#さらに、Mule for Win32 においては hilit19をロードして色をつけると、 .#画面にゴミがでることがあるようです。 .#私の環境では頻繁にでます。しかもこれは C-l で再表示しても消えません。 .#気になるかどうかは人によると思います(私は気になるほうです)。.^ .#これらの理由により、私は hilit19 を使っていません。 .#よって、実は hilit19 のカスタマイズなどは全然知りません。ごめんちゃい。 .#-

{{Mule FAQにも載っていますhttp://www.cit.ics.saitama-u.ac.jp/faq/mule-faq.html#G-2}}が、
ソースコードを編集するときに、 コメントや予約語に色をつけて表示させることができます。 色をつけるには、 .1) hilit9.elをロードする .1) font-lock.elをロードする と2つのやり方があります。.^ しかし、hilit9では入力した文章に自動的に色がつきません。 色をつけるためには C-l でバッファを表示しなおす必要があります。.^ もうひとつのfont-lock.elなら、入力するはしから色がついていきます。 (ただし、ときどき間違えるので、そのときは関数 font-lock-fontify-buffer を実行する必要があります)。 そこで、ここではfont-lock.elの使い方を説明します。

font-lock.el を使うには、M-x font-lock-mode とします (font-lock-mode はマイナーモードですので、c-modeやjava-modeと併用できます)。 いつも font-lock-mode で色をつけたいのなら、色をつけたいモード毎に .======================================== (add-hook 'c-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'c++-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'objc-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'java-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'emacs-lisp-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'html-helper-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'dired-mode-hook '(lambda () (font-lock-mode 1)))

・・・・・・ .======================================== と、自分の .emacs に書いてください。.^ また、デフォルトでは色がつくのではなく、かわりに太字や斜体になります。 自分の好きな色をつけるには、 以下を自分の .emacs に書いてください。.^ ここで、 "tomato" とか "darkolivegreen" と書かれてある部分に、 自分の好きな色を入れてください。どのような色が使えるかは、

{{こちらrgb.html}}
を参考にしてください。 .======================================== (add-hook 'font-lock-mode-hook

'(lambda () (my-font-lock-set-face))) (defun my-font-lock-set-face () ;; ;; 'if' や 'while' といった予約語 (make-face 'my-keyword-face) (set-face-foreground 'my-keyword-face "tomato") (setq font-lock-keyword-face 'my-keyword-face) ;(setq font-lock-keyword-face 'bold) ;; ;; コメント (make-face 'my-comment-face) (set-face-foreground 'my-comment-face "violetred4") (setq font-lock-comment-face 'my-comment-face) ;; ;; 文字列 (make-face 'my-string-face) (set-face-foreground 'my-string-face "darkgreen") (setq font-lock-string-face 'my-string-face) ;; ;; 関数名 (make-face 'my-function-face) (set-face-foreground 'my-function-face "blueviolet") (setq font-lock-function-name-face 'my-function-face) ;(setq font-lock-function-name-face 'default) ;; ;; 'typedef' や 'class' (make-face 'my-type-face) (set-face-foreground 'my-type-face "darkolivegreen") (setq font-lock-type-face 'my-type-face) ;(setq font-lock-type-face 'default) ;; ;; document ;;(make-face 'my-doc-string-face) ;;(set-face-foreground 'my-doc-string-face "lightgrey") ;;(setq font-lock-doc-string-face 'my-doc-string-face) ) .========================================

これで、コメントや文字列や関数名に色がつくようになるはずです。 どの部分がコメントでどの部分が文字列かといったことは、主モードごとに違います。 例えば、c-mode では '/*' から '*/' までがコメントなので色がつきますが、 emacs-lisp-mode では '#' から行末までがコメントなので色がつきます。

c-modeやc++-modeでは、コメントや文字列や関数名には色がつきますが、 'if' や 'for' や 'while' といった予約語(キーワード)には色がつきません。 つけたい人は、自分の .emacs に以下を加えてください。 .======================================== ;;; ;;; c-mode, c++-modeの設定 ;;; (add-hook 'c-mode-hook

'(lambda () (font-lock-mode 1) (setq font-lock-keywords c-font-lock-keywords-2) )) (add-hook 'c++-mode-hook '(lambda () (font-lock-mode 1) (setq font-lock-keywords c++-font-lock-keywords-2) )) .========================================

デフォルトでは、java-mode ではコメントと文字列にしか色がつきません。 クラス名やメソッド名や予約語に色をつけるには、

{{こちらからfont-lock-java.zip}}
font-lock-java.el をとってきて、パスの通っているディレクトリにおいてください。 そして自分の .emacs に以下を加えてください。 色を設定している部分は、自由に変更してください。 .======================================== (add-hook

'java-mode-hook '(lambda () ;; ;; font-lock-mode にする (font-lock-mode 1) ;; ;; font-lock-java をロードする (require 'font-lock-java) ;; ;; java-mode用の face を設定する ;; -- 予約語は色をつけず、太字にする。 (setq font-lock-java-keyword-face 'bold) ;; -- 新たに darkolivegreen の face をつくり、クラス名に使う (make-face 'my-java-class-face) (set-face-foreground 'my-java-class-face "darkolivegreen") (setq font-lock-java-class-face 'my-java-class-face) ;; -- コンストラクタもクラス名と同色にする (setq font-lock-java-constructor-face 'my-java-class-face) ;; -- メソッド名は色をつけない。 (setq font-lock-java-method-face 'default) ;; ;; 設定を反映させる (set-font-lock-keywords-for-java) ; )) .======================================== この font-lock-java.el は、font-lock.el を参考にして私が書いたものです。 しかし、私は Emacs Lisp をあまり詳しくは知らないので、 font-lock-java.el は不完全なうえに稚拙です。 とりあえず Java のソースに色がつく、という程度ですが、 それでもよければお使いください。

.+note:

{{andersl-java-font-lock.elftp://ftp.csd.uu.se/pub/users/andersl/emacs/andersl-java-font-lock.el}} というものがあるそうです。使ったことがないので解説はできませんが、参考までに。
.-note:

最後に、参考になるか混乱のタネになるかわかりませんが、 私の .emacs のうち font-lock に関係する部分を載せておきます。 .======================================== ;;; ;;; どんな face があるかは M-x list-faces-display で分かる。 ;;; また、どんな色が指定できるかは ;;; http://www.geocities.co.jp/SiliconValley-PaloAlto/5236/rgb.html ;;; を参照のこと。

;;; ;;; faces の設定 ;;; (add-hook 'font-lock-mode-hook

'(lambda () (my-font-lock-set-face) ;; )) (defun my-font-lock-set-face () ;; ;; 'if' や 'while' といった予約語 (make-face 'my-keyword-face) (set-face-foreground 'my-keyword-face "midnightblue") (setq font-lock-keyword-face 'my-keyword-face) ;(setq font-lock-keyword-face 'bold) ;; ;; コメント (make-face 'my-comment-face) ;(set-face-foreground 'my-comment-face "darkkhaki") ;(set-face-foreground 'my-comment-face "darkgoldenrod4") ;(set-face-foreground 'my-comment-face "dimgray") (set-face-foreground 'my-comment-face "slategray") (setq font-lock-comment-face 'my-comment-face) ;; ;; 文字列 (make-face 'my-string-face) (set-face-foreground 'my-string-face "darkgreen") (setq font-lock-string-face 'my-string-face) ;; ;; 関数名 (make-face 'my-function-face) (set-face-foreground 'my-function-face "violetred4") (setq font-lock-function-name-face 'my-function-face) ;(setq font-lock-function-name-face 'default) ;; ;; 'typedef' や 'class' (make-face 'my-type-face) (set-face-foreground 'my-type-face "royalblue") (setq font-lock-type-face 'my-type-face) ;(setq font-lock-type-face 'default) ;; ;; ドキュメント ;;(make-face 'my-doc-string-face) ;;(set-face-foreground 'my-doc-string-face "lightgrey") ;;(setq font-lock-doc-string-face 'my-doc-string-face) )

;;; ;;; diredモードのカスタマイズ ;;; diredモードでは、ヘッダの表示に font-lock-type-face, ;;; シンボリックリンクの表示に font-lock-function-name-face, ;;; マーク(印)とディレクトリの表示に font-lock-keyword-face ;;; が使われている。これを変更するための emacs lisp。 (add-hook

'dired-mode-hook '(lambda () ;; ;; font-lock-mode にする (font-lock-mode 1) ;; ;; dired-mode 用の face (setq font-lock-path-face 'bold) (copy-face 'bold 'my-dir-face) (set-face-foreground 'my-dir-face "navyblue") (setq font-lock-dir-face 'my-dir-face) (setq font-lock-symlink-face 'bold) (setq font-lock-mark-face 'bold) ;; ;; dired-mode 用の font-lock-keywords (setq font-lock-keywords-for-dired '(;; ヘッダ ("^ \\(\\([a-z]:\\)?/.+\\)$" 1 font-lock-path-face) ;; シンボリックリンク ("\\([^ ]+\\) -> [^ ]+$" . font-lock-symlink-face) ;; マーク(印) ("^\\([^ ]\\).*$" 1 font-lock-mark-face) ;; ディレクトリ ("^..d.* \\([^ ]+\\)$" 1 font-lock-dir-face) )) (setq font-lock-keywords font-lock-keywords-for-dired) ))

;;; ;;; infoモード ;;; (add-hook

'Info-mode-hook '(lambda () ;; ;; メニューやクロスリファレンスの face を変更する (copy-face 'default 'info-node) (copy-face 'bold 'info-menu-5) (copy-face 'default 'info-xref) (set-face-foreground 'info-node "darkslateblue") (set-face-foreground 'info-menu-5 "dimgray") (set-face-foreground 'info-xref "darkgreen") ;; ;; あるいはこちらのやり方 ;(make-face 'my-info-face) ;(set-face-foreground 'my-info-face "tomato") ;(copy-face 'my-info-face 'info-node) ;(copy-face 'my-info-face 'info-menu-5) ;(copy-face 'my-info-face 'info-xref) ))

;;; ;;; モードラインの色を変える ;;; (set-face-background 'modeline "skyblue2") (set-face-foreground 'modeline "skyblue4")

;;; ;;; c-mode, c++-modeの設定 ;;; (add-hook

'c-mode-hook '(lambda () ;; ;; font-lock-mode にする (font-lock-mode 1) ;; ;; デフォルトでは 'if' や 'for' といった予約語に ;; 色がつかないので、色をつけるようにする ;(setq font-lock-keywords c-font-lock-keywords-2) )) (add-hook 'c++-mode-hook '(lambda () (font-lock-mode 1) ;(setq font-lock-keywords c++-font-lock-keywords-2) ))

;;; ;;; java-mode 用の face を設定 ;;; (add-hook

'java-mode-hook '(lambda () ;; ;; font-lock-mode にする (font-lock-mode 1) ;; ;; font-lock-java をロードする (require 'font-lock-java) ;; ;; java-mode用の face を設定する ;(setq font-lock-java-keyword-face font-lock-keyword-face) (setq font-lock-java-keyword-face 'default) ;(setq font-lock-java-class-face font-lock-type-face) ;(setq font-lock-java-constructor-face font-lock-type-face) ;(setq font-lock-java-method-face font-lock-funtion-face) ;; ;; 設定を反映させる (set-font-lock-keywords-for-java) ; ))

;;; ;;; html-helper-mode 用の設定 ;;; (add-hook

'html-helper-mode-hook '(lambda () (font-lock-mode 1) (setq font-lock-html-tag-face font-lock-keyword-face) (setq font-lock-html-anchor-face font-lock-string-face) (setq font-lock-html-bold-face 'bold) (setq font-lock-keywords-for-html '(("\\(]*>\\)" 1 font-lock-html-anchor-face) ("" . font-lock-html-anchor-face) ("\\(<.[^>]*>\\)" 1 font-lock-html-tag-face) ("\\(.*\\)" 1 font-lock-html-bold-face))) (setq font-lock-keywords font-lock-keywords-for-html) (font-lock-fontify-buffer) ))

;;; ;;; font-lock-mode を使用するその他の主モードの設定 ;;; (add-hook 'emacs-lisp-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'html-helper-mode-hook '(lambda () (font-lock-mode 1))) ;(add-hook 'dired-mode-hook '(lambda () (font-lock-mode 1))) ;(add-hook 'c-mode-hook '(lambda () (font-lock-mode 1))) ;(add-hook 'c++-mode-hook '(lambda () (font-lock-mode 1))) (add-hook 'objc-mode-hook '(lambda () (font-lock-mode 1))) ;(add-hook 'java-mode-hook '(lambda () (font-lock-mode 1)))

;;; ;;; フォントの色を付け直す関数 font-lock-fontify-buffer を ;;; F6 に割り当てる ;;; (define-key global-map [f6] 'font-lock-fontify-buffer)

;;; ;;; C-l (recenter) に、色を付け直す機能を付け加える ;;; (defun my-recenter-and-fontify-buffer ()

(interactive) (recenter) (font-lock-fontify-buffer))

(add-hook

'font-lock-mode-hook '(lambda () ;; 普通の人は、recenter が C-l に割り当てられている ;(local-set-key "\C-l" 'my-recenter-and-fontify-buffer) ;; 私は recenter を C-q C-l に割り当てているので、こうなる (local-set-key "\C-q\C-l" 'my-recenter-and-fontify-buffer) )) .========================================

●フォントを変えよう! (for Win32)winfont

Mule for Win32 は、デフォルトでは字間(文字と文字の間隔)が広すぎるように感じます。これを狭めるには、フォントを変更する必要があります。しかし、そのやり方がよく分かりません。

フォントについて説明した Readme.fontset というファイルが Mule for Win32 についてますが、これを読んでも私はよく分かりませんでした。そこで、私が試行錯誤した範囲でわかったことをここでは書いてみます。

とりあえず、手っ取り早く字間を狭めたいという人は、 次の Emacs-Lisp を自分の .emacs に書いてください。 .======================================== ;;; Mule for Win32 で文字と文字の間隔を狭める (if (eq system-type 'windows-nt)

(progn (apply 'win32-change-fontset-attribute (win32-get-font-metric "default" 0)) ;; 画面を再描写する (win32-refresh-fontset (selected-frame)) )) .========================================

.+table_of_contents: 目次:

.* {{フォントを変更する#winfont1}}
.* {{もっと簡単にフォントを変更する#winfont2}}
.* {{もっともっと簡単にフォントを変更する#winfont3}}
.* {{インフォでの斜体をやめる#winfont4}}
.#.+#####
.# .* {{フォントの説明#winfont5}}
.#.-##### .-table_of_contents:

◎フォントを変更するwinfont1

フォントを設定するには、本当なら fontset やら font やら logfont やらの知識が必要となります。が、ここでは説明をしません(私もよくわかってない)。こうすればフォントを変更できる、というやり方だけを説明します。 .+##### 以下では、例としてフォントを Terminalフォント 14ポイント(pt) に変更する手順を示します。 .-#####

まず Mule for Win32 を起動すると、初めに「*scratch*」という名前のついたバッファが開かれます。これを「*scratch*バッファ」といいます。特別な設定をしていなければ、*scrach*バッファは lisp-interaction-mode になっているはずです。もしなっていなければ、M-x lisp-interaction-mode を実行してください。

この *scrach*バッファで、 .======================================== (win32-query-get-logfont) .======================================== と書きます。カーソルは最後の閉じカッコの後ろにあるとします。 そして、C-j を押してください。 すると、フォントを選択するダイアログが出てきます。 このダイアログでは、フォントのフォント名・スタイル・サイズが選べます。

ここで、スタイルを 'Regular' にし、好きなフォント名・好きなサイズを選びます。例としてフォント名に 'Terminal'、サイズに 14 を選んでみます。.^ 選んだら、OKボタンを押します。すると、*scratch*バッファに .======================================== ("Terminal" 0 -19 400 0 nil nil 128 1 1 49) .======================================== という行が挿入されました。これが、フォント 'Terminal' の、スタイルが 'Regular' でサイズが 14 のときの属性です。.^ 属性は、11個の要素からなるリストです(ここでは、属性についての詳しい説明はしません)。.^ 同じようにして、 スタイルが 'Bold'、'Italic'、'Bold Italic' のときの属性を調べます。

このようにして調べた属性が、例えば次のようだとします。 .======================================== ;;; フォント名:Terminal、サイズ:14 ("Terminal" 0 -19 400 0 nil nil 128 1 1 49) ; regular ("Terminal" 0 -19 700 0 nil nil 128 1 1 49) ; bold ("Terminal" 0 -19 400 0 t nil 128 1 1 49) ; italic ("Terminal" 0 -19 700 0 t nil 128 1 1 49) ; bold italic .======================================== ここまで調べたら、あとは自分の .emacs に以下を加えてください。 ここで、フォントの属性部分は各自で調べた値を使用してください。 .======================================== (if (eq system-type 'windows-nt)

(progn ;; regular (win32-change-font-property "default" 0 '("Terminal" 0 -19 400 0 nil nil 128 1 1 49)) ;; bold (win32-change-font-property "default" 1 '("Terminal" 0 -19 700 0 nil nil 128 1 1 49)) ;; italic (win32-change-font-property "default" 2 '("Terminal" 0 -19 400 0 t nil 128 1 1 49)) ;; bold italic (win32-change-font-property "default" 3 '("Terminal" 0 -19 700 0 t nil 128 1 1 49)) ;; 設定したフォントの属性を適用する (apply 'win32-change-fontset-attribute (win32-get-font-metric "default" 0)) ;; 画面を再描写する (win32-refresh-fontset (selected-frame)) )) .========================================

これでもう一度 Mule for Win32 を起動すると、フォントが変更されているはずです。

参考までに、代表的なフォントの属性を{{こちらにlogfonts.txt}}
書いておきます。 ちなみに、個人的には Terminalフォントが見やすくてよろしいかと思います。

◎もっと簡単にフォントを変更するwinfont2

先の方法よりも、フォントをいろいろと変更しやすい方法を紹介します。.^ まず、フォントの属性について説明し、そのあとに変更方法を紹介します。 フォントセットやフォントについての詳しい説明はしません(私がよくわかっていないため)。

先の代表的なフォントの属性を見れば分かりますが、 フォントの属性は11個の要素から構成されています。

最初の要素は、フォント名です。.^ 2番目の要素は、フォントの幅を表しますが、気にしないで下さい。 通常は 0 になるようです。.^ 3番目の要素は、フォントの高さを表します。 高さを表す数字はフォントの大きさと対応しています。 例えば、フォントの大きさが 10pt なら高さは -13、12pt なら -16、 14pt なら -19、・・・です。 マイナスであることに注意してください。.^ 4番目の要素は、太字(bold)かそうでないかを表します。 700なら太字、400なら普通の文字です。.^ 5番目の要素は、気にしないで下さい。ここも 0 になるようです。.^ 6番目の要素は、斜体(italic)かそうでないかを表します。 t なら斜体、nilなら普通の文字です。.^ 7番目の要素は、気にしないで下さい。必ず nil になるようです。.^ 8番目の要素は、文字コードを表しますが、気にしないで下さい。 128であればOKです。.^ 9番目の要素は、フォントの品質を表します。1 になるようですが、 0 にしていても問題ないようです。.^ 10番目の要素は、フォントの出力精度を表します。1 や 3 になるようですが、 0 にしていても問題ないようです。.^ 11番目の要素は、Pitchとフォントファミリを表します。 フォントごとに違いますが、1 にしていても問題はないようです。.^

つまり、 全てのフォントで 2・4・5・6・7・8番目は同じ値を使用できることが分かります。

これらのことから、以下のような関数を作りました。 こちらのほうが、フォントを選択しやすいでしょう。 .======================================== ;;; ;;; フォントを選択する関数 ;;; (defun my-set-font (font h q o p)

(let (;; regular (logfont0 (list font 0 h 400 0 nil nil 128 q o p)) ;; bold (logfont1 (list font 0 h 700 0 nil nil 128 q o p)) ;; italic (logfont2 (list font 0 h 400 0 t nil 128 q o p)) ;; bold italic (logfont3 (list font 0 h 700 0 t nil 128 q o p))) ;; フォントの属性を設定する (win32-change-font-property "default" 0 logfont0) (win32-change-font-property "default" 1 logfont1) (win32-change-font-property "default" 2 logfont2) (win32-change-font-property "default" 3 logfont3) ;; 設定した属性を適用する (apply 'win32-change-fontset-attribute (win32-get-font-metric "default" 0)) ;; 画面を再描写する (win32-refresh-fontset (selected-frame)) ))

;;; ;;; フォントを選択する。 ;;; この中のどれかひとつのコメントをはずす ;;; ;(my-set-font "Terminal" -13 1 1 49) ; Terminal 10pt (my-set-font "Terminal" -19 1 1 49) ; Terminal 14pt ;(my-set-font "Terminal" -23 1 1 49) ; Terminal 17pt ;(my-set-font "MS ゴシック" -11 1 3 49) ; MSゴシック 8pt ;(my-set-font "MS ゴシック" -12 1 3 49) ; MSゴシック 9pt ;(my-set-font "MS ゴシック" -13 1 3 49) ; MSゴシック 10pt ;(my-set-font "MS ゴシック" -15 1 3 49) ; MSゴシック 11pt ;(my-set-font "MS ゴシック" -16 1 3 49) ; MSゴシック 12pt ;(my-set-font "MS ゴシック" -19 1 3 49) ; MSゴシック 14pt ;(my-set-font "MS ゴシック" -21 1 3 49) ; MSゴシック 16pt ;(my-set-font "MS ゴシック" -24 1 3 49) ; MSゴシック 18pt ;(my-set-font "MS 明朝" -11 1 3 17) ; MS明朝 8pt ;(my-set-font "MS 明朝" -12 1 3 17) ; MS明朝 9pt ;(my-set-font "MS 明朝" -13 1 3 17) ; MS明朝 10pt ;(my-set-font "MS 明朝" -15 1 3 17) ; MS明朝 11pt ;(my-set-font "MS 明朝" -16 1 3 17) ; MS明朝 12pt ;(my-set-font "MS 明朝" -19 1 3 17) ; MS明朝 14pt ;(my-set-font "MS 明朝" -21 1 3 17) ; MS明朝 16pt ;(my-set-font "MS 明朝" -24 1 3 17) ; MS明朝 18pt .========================================

あるいは、フォントの属性において 9・10・11番目の要素をそれぞれ 0・0・1 にしても問題ないことと、全てのフォントでサイズと高さが一対一に対応することを利用して、次のようにしてもよいでしょう。先の関数 my-set-font を書いた後ろに、以下を加えてください。 .======================================== ;;; ;;; my-set-font を使いやすくした my-set-font-2 ;;; (defun my-set-font-2 (font size)

(let (h) (cond ((= size 8) (setq h -11)) ((= size 9) (setq h -12)) ((= size 10) (setq h -13)) ((= size 11) (setq h -15)) ((= size 12) (setq h -16)) ((= size 14) (setq h -19)) ((= size 16) (setq h -21)) ((= size 17) (setq h -23)) ((= size 18) (setq h -24)) ) (my-set-font font h 0 0 1)))

;;; ;;; フォントの選択。 ;;; どれか一つのコメントをはずして選択する。 ;;; ;(my-set-font-2 "Terminal" 10) ; Terminal 10pt (my-set-font-2 "Terminal" 14) ; 14pt ;(my-set-font-2 "Terminal" 17) ; 17pt ;(my-set-font-2 "MS ゴシック" 8) ; MSゴシック 8pt ;(my-set-font-2 "MS ゴシック" 9) ; 9pt ;(my-set-font-2 "MS ゴシック" 10) ; 10pt ;(my-set-font-2 "MS ゴシック" 11) ; 11pt ;(my-set-font-2 "MS ゴシック" 12) ; 12pt ;(my-set-font-2 "MS ゴシック" 14) ; 14pt ;(my-set-font-2 "MS ゴシック" 16) ; 16pt ;(my-set-font-2 "MS ゴシック" 18) ; 18pt ;(my-set-font-2 "MS 明朝" 8) ; MS 明朝 8pt ;(my-set-font-2 "MS 明朝" 9) ; 9pt ;(my-set-font-2 "MS 明朝" 10) ; 10pt ;(my-set-font-2 "MS 明朝" 11) ; 11pt ;(my-set-font-2 "MS 明朝" 12) ; 12pt ;(my-set-font-2 "MS 明朝" 14) ; 14pt ;(my-set-font-2 "MS 明朝" 16) ; 16pt ;(my-set-font-2 "MS 明朝" 18) ; 18pt .========================================

◎もっともっと簡単にフォントを変更するwinfont3

今までに紹介した方法は、.emacs を編集して再起動することでフォントを変更しました。しかし、いちいち再起動するのは面倒です。これから紹介する方法は、再起動することなしにフォントを変更する方法です。

以下のEmacs Lispを自分の .emacs に書いて Mule for Win32 を起動し直してください。そして、Controlキーを押しながらマウスの右ボタンをクリックして下さい。フォントを選ぶポップアップウィンドウが出てくるので、好きなフォントを選んでください。

.======================================== ;;; ;;; フォントセットを作り出す関数 ;;; 引数: fontset ... フォントセット名、 ;;; winfont ... Windowsのフォント名 ;;; size ... Windowsのフォントサイズ ;;; (8,9,10,11,12,14,16,17,18) ;;; (defun my-create-fontset (fontset winfont size)

(let* ((h (cond ((= size 8) -11) ((= size 9) -12) ((= size 10) -13) ((= size 11) -15) ((= size 12) -16) ((= size 14) -19) ((= size 16) -21) ((= size 17) -23) ((= size 18) -24))) (logfont0 (list winfont 0 h 400 0 nil nil 128 0 0 1)) ; regular (logfont1 (list winfont 0 h 700 0 nil nil 128 0 0 1)) ; bold (logfont2 (list winfont 0 h 400 0 t nil 128 0 0 1)) ; italic (logfont3 (list winfont 0 h 700 0 t nil 128 0 0 1)) ; bold italic ) ;; フォントセットをつくる (win32-add-fontset fontset 0 0 0 0) ;; 'default'フォントをつくって、フォントセットに加える (win32-add-font "default" 'sjis fontset) ;; 'default'フォントの属性(ログフォント)を設定する (win32-change-font-property "default" 0 logfont0 fontset) (win32-change-font-property "default" 1 logfont1 fontset) (win32-change-font-property "default" 2 logfont2 fontset) (win32-change-font-property "default" 3 logfont3 fontset) ;; 設定を反映させる (apply 'win32-change-fontset-attribute (append (win32-get-font-metric "default" 0 fontset) (list fontset))) ))

;;; ;;; フォントセットの登録 ;;; (my-create-fontset "Terminal10" "Terminal" 10) (my-create-fontset "Terminal14" "Terminal" 14) (my-create-fontset "Terminal17" "Terminal" 17) (my-create-fontset "MS-Gothic8" "MS ゴシック" 8) (my-create-fontset "MS-Gothic9" "MS ゴシック" 9) (my-create-fontset "MS-Gothic10" "MS ゴシック" 10) (my-create-fontset "MS-Gothic11" "MS ゴシック" 11) (my-create-fontset "MS-Gothic12" "MS ゴシック" 12) (my-create-fontset "MS-Gothic14" "MS ゴシック" 14) (my-create-fontset "MS-Gothic16" "MS ゴシック" 16) (my-create-fontset "MS-Gothic18" "MS ゴシック" 18) (my-create-fontset "MS-Mincho8" "MS 明朝" 8) (my-create-fontset "MS-Mincho9" "MS 明朝" 9) (my-create-fontset "MS-Mincho10" "MS 明朝" 10) (my-create-fontset "MS-Mincho11" "MS 明朝" 11) (my-create-fontset "MS-Mincho12" "MS 明朝" 12) (my-create-fontset "MS-Mincho14" "MS 明朝" 14) (my-create-fontset "MS-Mincho16" "MS 明朝" 16) (my-create-fontset "MS-Mincho18" "MS 明朝" 18)

;;; ;;; 起動時のフォントセットを指定する ;;; (defun my-select-fontset (fsetname)

(setq default-frame-alist (append (list (cons 'fontset fsetname)) default-frame-alist))) (my-select-fontset "Terminal14") ; Terminalフォント 14pt .========================================

以上で、Mule for Win32を再起動することなしに、フォントを選ぶことができるようになりました。しかし、なんとまあ面倒くさいことでしょうかね。ここらへんが、 Mule for Win32 の弱いところではあります。

◎インフォでの斜体をやめるwinfont4

Mule for Win32 ではインフォを表示させると、メニューやクロスリファレンスなど、リンクを表示する部分が太字斜体になっています。太字であることはいいのですが、斜体になっているので、文字が一部欠けて表示されます。これを止めるには、自分の .emacs に次のように書いてください。 .======================================== (add-hook 'Info-mode-hook

'(lambda () ;; ;; メニューやクロスリファレンスの face を太字にする (copy-face 'bold 'info-node) (copy-face 'bold 'info-menu-5) (copy-face 'bold 'info-xref) )) .========================================

また、太字で表示する替わりに色を変えたいのなら、次のようにするといいでしょう。 .======================================== (add-hook 'Info-mode-hook

'(lambda () ;; ;; メニューやクロスリファレンスの face を変更する (copy-face 'default 'info-node) (copy-face 'bold 'info-menu-5) (copy-face 'default 'info-xref) (set-face-foreground 'info-node "darkslateblue") (set-face-foreground 'info-menu-5 "dimgray") (set-face-foreground 'info-xref "darkgreen") ;; ;; あるいはこちらのやり方 ;(make-face 'my-info-face) ;(set-face-foreground 'my-info-face "tomato") ;(copy-face 'my-info-face 'info-node) ;(copy-face 'my-info-face 'info-menu-5) ;(copy-face 'my-info-face 'info-xref) )) .========================================

.+#####

◎フォントの説明winfont5

フォントとフォントセットとログフォントについて説明してみます。.^ 何度もいいますが、これらについては私もよく分かっていないので、ウソをいってるかもしれません。間違いがあれば、ご指摘ください。

フォントは、4種類の属性を持ちます。.^ 4種類の属性とは、通常の属性、太字のときの属性、斜体のときの属性、太字斜体のときの属性です。.^ それぞれの属性は、11個の要素からなるリストです。.^ この属性のことを、ログフォント(logfont)といいます。

フォントセットとは、幾つかのフォントが集まったものです。.^ フォントセットに含まれるフォントには名前をつけることができます。.^ このうち、'default'という名前のついたフォントが、そのフォントセットにおけるデフォルトのフォントです。

//フォントセットとは、幾つかのフォントが集まったものです。 //フォントには名前をつけることができます。 //フォントセットに含まれるフォントのうち、 //'default'という名前のついたフォントが、 //そのフォントセットにおけるデフォルトのフォントです。

フォントセットは、複数存在します。.^ フォントセットはそれぞれ名前を持っています。.^ 現在、どのようなフォントセットがあるかは、関数 win32-fontset-list を実行することで表示できます。.^ あるいは、Mule for Win32 の画面上で、Controlキーを押しながらマウスの右ボタンを押すと、フォントセットの一覧がポップアップメニューとして表示されます。.^ 何も設定していなければ、はじめは "default" というフォントセットしか存在しません。 .+note: 関数 win32-fontset-list は M-x win32-fontset-list として実行することができません(インタラクティブではないからです)。実行するには、*scratch*バッファに .---------------------------------------- (win32-fontset-list) .---------------------------------------- と書いて、閉じカッコの後ろにカーソルを持っていき、C-j を押してください。 .-note:

フォントセットは複数存在しますが、アクティブなのは(つまりその時点で選ばれるものは)ひとつだけです。.^ 選ばれたフォントセットに含まれるフォントのなかからひとつが選ばれ(通常は 'default' と名前のついたフォントが選ばれ)、画面が描写されます。.^ フォントセットを選ぶには(あるいは切り替えるには)、Mule for Win32 の画面上で、Controlキーを押しながらマウスの右ボタンを押します。するとフォントセットの一覧がポップアップメニューとして表示されますので、ここで好きなフォントセットを選ぶことができます。

まとめると、

.* フォントは属性として4つのログフォントをもつ .* フォントセットはフォントの集合である .* フォントセットは複数存在する .-#####

●テンプレートを使おう!template

新しいプログラムを作成するときに、テンプレートが利用できると便利です。 例えば、Cプログラムを書くのにいつも #include int main ... と書くのは面倒ですので、これをテンプレートとして必要なときに挿入できると便利です。.^ またJavaプログラムでしたら、Applet用と通常のClass用とでテンプレートを分けて利用できると便利ですし、ファイル名からクラス名を推測してテンプレートを挿入してくれるともっと便利です。.^ ここではそのための方法として insert-template.el を紹介します。

.+table_of_contents: 目次:

.* {{insert-templateの使い方#template1}}
.* {{キーワードの展開#template2}}
.* {{Hookによる拡張#template3}}
.-table_of_contents:

◎insert-templateの使い方template1

例えばCのプログラムを書くときは、いつも次のような形から始めるとします。 .======================================== /*

* * $Id$ */

int main(int argc, char *argv[]) {

} .========================================

しかし、これを毎回手で入力しているのも面倒です。.^ そこで、これをテンプレートとし、新しくプログラムを作るときはこのテンプレートを呼び出すことにしましょう。

まず、先のプログラムをテンプレートとしてファイルに保存します。保存先は $HOME/lib/template/template.c とします(保存するディレクトリはどこでもいいですが、ファイル名は必ずtemplate.cとしてください)。

次に、以下のEmacs Lispを自分の .emacs に加えるか、または{{insert-template.elinsert-template.zip}}をダウンロードしてパスが通っているところに置いてください。
.======================================== ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; insert-template.el -- insert template file ;;; author: kwatch <kwatch@lycos.jp> ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; ;;; insert-template-directory ;;; (defvar insert-template-directory

(expand-file-name "~/lib/template") ;"~/lib/template" ; xyzzy "* Template Directory which contains template files (\"template.xxx\").")

;;; ;;; insert-template ;;; (defun insert-template (&optional arg)

(interactive "P") "* Insert template file and call hook according to file suffix. Example: If you are editing `hogehoge.java', insert-template inserts template file `template.java' and calls 'insert-template-java-hook'. If you would like to insert another template file, call this function with argument, and you'll be prompted in mini-buffer to enter another template file name. Variable `insert-template-directory' indicates the location of template files. When inserting template files, inset-template replaces the default keywords: __FILE__, __CLASS__, __USER__, __EMAIL__ See function `insert-template-replace-default-keywords'. " (let* ((file (file-name-nondirectory buffer-file-name)) ;(file (file-namestring (get-buffer-file-name))) ; xyzzy (index (string-match "\\.\\w+$" file)) (suffix (if index (substring file (1+ index)) file)) template hook ) ;; (setq template (concat insert-template-directory "/template." suffix)) (setq hook (concat "insert-template-" suffix "-hook"))

; read strings from mini-buffer (setq template (read-string "Template File: " template)) (if arg (setq hook (read-string "Hook Name: " hook)))

;; (if (not (file-exists-p template) ;(file-exist-p template) ; xyzzy ) (message "ERROR: File not found: %s" template) (progn (insert-file template) (run-hooks (intern hook)) (insert-template-replace-default-keywords) ; replace keywords (message "Inset Template ... done.") )) ))

;;; ;;; insert-template-replace-default-keywords ;;; (defun insert-template-replace-default-keywords ()

(interactive) "* Replace default keywords: __FILE__, __CLASS___, __USER__, __EMAIL__ __FILE__ -- file name (not include path name) __CLASS__ -- class name (== file name without suffix) __USER__ -- user name (== variable `user-name' or `user-login-name') __EMAIL__ -- user e-mail address (== variable `user-mail-address') " (let* ((file (file-name-nondirectory buffer-file-name)) ;(file (file-namestring (get-buffer-file-name))) ; xyzzy (index (string-match "\\.[A-Za-z0-9]*$" file)) (class (substring file 0 index)) (user (if (boundp 'user-name) user-name (user-login-name))) (email user-mail-address) ) ;; (goto-char (point-min)) (replace-string "__FILE__" file) ;(replace-string "__FILE__" file t) ; xyzzy (goto-char (point-min)) (replace-string "__CLASS__" class) ;(replace-string "__CLASS__" class t) ; xyzzy (goto-char (point-min)) (replace-string "__USER__" user) ;(replace-string "__USER__" user t) ; xyzzy (goto-char (point-min)) (replace-string "__EMAIL__" email) ;(replace-string "__EMAIL__" email t) ; xyzzy ;; (goto-char (point-min)) ))

;;; ;;; keybind ;;; (global-set-key "\C-xt" 'insert-template) ;(global-set-key '(#\C-x #\t) 'insert-template) ; xyzzy .========================================

これで準備完了です。

使い方を説明します。

.1) まず新しいCプログラムを作成します。 .2) そして C-x t を押します。 .3) ミニバッファに ._____ Template File: /home/kwatch/lib/template/template.c ._____ と聞かれますので、Enterキーを押します。 .4) すると、template.c が挿入されます。ワォ、これは便利。

テンプレート名を聞かれるところで、他のテンプレート名を入力することができます。例えば同じJavaプログラムでも、AppletとServletとでは異なるテンプレートを使いたいと思うでしょう。このとき、それぞれのテンプレートApplet.javaとServlet.javaを用意しておき、テンプレート名を聞かれたときにそれらの名前を答えれば、テンプレートを使いわけることができます。

どのテンプレートがデフォルトとなるかは、拡張子によって決まります。例えばCプログラムの拡張子は .c なので、template.cがデフォルトで表示されます。Javaならtemplate.javaが表示されます。

ただし、拡張子がないときはそのファイル名が拡張子として使われます。どういうことかというと、例えばファイル名が "Makefile" のときは template.Makefile がデフォルトのテンプレート名として表示されます。

◎キーワードの展開template2

insert-template では、次のようなキーワードを自動的に展開してくれます。 .[__FILE__] ファイル名に展開されます。パスは含みません。 .[__CLASS__] ファイル名から拡張子を取り除いた名前に展開されます。 .[__USER__] 変数user-nameが設定してあればその値に、なければ関数user-login-nameの値に展開されます。 .[__EMAIL__] 変数user-mail-addressの値に展開されます。

例えば、Java用のテンプレート template.java を次のような内容で作ったとします。 .======================================== import java.lang.*; import java.util.*;

/**

* * @author __USER__ <__EMAIL__> * @version $Revision$, $Date$ / public class __CLASS__ { /* / public __CLASS__() { super(); } .========================================

そしてC-x t と入力して、ミニバッファに「template.java」とでてからEnterキーを押せば、キーワードが例えば次のように展開されて挿入されます。 .======================================== import java.lang.; import java.util.*;

/**

* * @author kwatch <kwatch@lycos.jp> * @version $Revision$, $Date$ / public class Sample { /* / public Sample() { super(); } .========================================

ワォ、なんて便利。

◎Hookによる拡張template3
insert-templateでは、「insert-template-拡張子-hook」というHook関数が定義されてあれば、それを実行するようになっています。これを利用して、insert-templateの機能を拡張することができます。

例えば、HTML用のテンプレートtemplate.htmlを次のような内容で作ります。「__TITLE__」という独自のキーワードを指定しているのがポイントです。 .======================================== __TITLE__

__TITLE__

.========================================

そして、この独自キーワードを展開するために、.emacsに次のように記述します。 .======================================== ;; hook for template.html (add-hook

'insert-template-html-hook '(lambda () (let (title) (setq title (read-string "Enter Title: ")) (goto-char (point-min)) (replace-string "__TITLE__" title) ;(replace-string "__TITLE__" title t) ; xyzzy ))) .========================================

こうして、HTMLファイルを作成するときに C-x t を押してEnterキーを押すと、template.cが挿入されたあとに、ミニバッファにタイトルを聞かれます。 .---------------------------------------- Enter Title: プログラマーのためのMule .----------------------------------------

タイトルを適当に入力すると、それが「__TITLE__」の部分に展開されます。 .======================================== プログラマーのためのMule

プログラマーのためのMule

.========================================

ワォ、すげー便利。

●headerline.elを使おう!headerline
.?notice: Update!

headerline.elは、見出し(章や節のタイトル)を一覧で表示してくれる、自作EmacsLispです。 一覧から見出しを選んでEnterキーを押すと、該当するタイトルにジャンプする機能もあります。

見出しのパターンは正規表現で指定するようになっています。 この正規表現はメジャーモードごとに変更できますので、例えばc-modeであれば関数の一覧を、またJavaであればメソッド名やインスタンス変数の一覧を表示することができます。 ジャンプ機能と組み合わせれば、好きな関数やメソッドに簡単にジャンプできて、とても便利です。

タグジャンプなどの類似機能との違いについては「{{類似機能との比較#headerline-compare}}」をご覧ください。

.+table_of_contents: 目次:

. {{headerline.elのインストール#headerline-inst}}
.* {{headerline.elの使い方:Java編#headerline-java}}
.* {{headerline.elの使い方:テキスト編#headerline-text}}
.* {{次/前の見出しに移動する#headerline-goto}}
.* {{カスタマイズ:見出しのパターン#headerline-pattern}}
.* {{カスタマイズ:画面分割の方向と幅#headerline-separate}}
.* {{類似機能との比較#headerline-compare}}
.-table_of_contents:

◎headerline.elのインストールheaderline-inst
.1) {{headerline_1.7.zip}}をダウンロードして解凍します。
.2) headerline.elを、パスの通ったディレクトリに置きます。 .3) .emacsに、次のように書きます。

.==================== ;; headerline.elのロード (load-library "headerline") ;; キー割り当て(例:F10やControl+F10に割り当てる) (global-set-key [f10] 'headerline) ; F10 ;(global-set-key [C-F10] 'headerline) ; Control+ F10 .==================== .4) Muleを再起動します。

以上でインストールは完了です。

注意:headerline 1.7から、デフォルトではキー割り当てをしなくなりました。ユーザーのほうで、明示的にキー割り当てを行うようにしてください。なお以降の説明では、F10に割り当てたものとして説明しています。

◎headerline.elの使い方:Java編headerline-java

Javaプログラムを例にして、headerline.elの使い方を説明します。

まず、次のようなサンプルプログラム「Sample.java」をMuleで作成します。

.==================== /* Sample.java / import java.util.;

public class Point {

private int x; private int y;

public Point(int x, int y) { this.x = x; this.y = y; } public Point() { this(0, 0); }

public int getX() { return x; } public int getY() { return y; } } .====================

そして、モードがjava-modeであることを確認したうえで、F10キーを押します。 すると、画面が上下に分かれ、画面下に ・クラス ・インスタンス変数 ・メソッド の一覧が表示され、カーソルがそこに移動します。

ここで画面下の一覧において、適当な行にカーソルを移動しEnterキーを押します。 すると、メソッドやインスタンス変数にジャンプします。

またEnterキーのかわりにC-jを押すと、ジャンプしたあとに一覧画面を消してくれます。

画面イメージ{{-(イメージといっても画像じゃなくてホンマにイメージね。)-}}: .____________________ +--------------------------------------+

/* Sample.java / import java.util.; public class Point { private int x; private int y; public Point(int x, int y) {←(2) ここにジャンプ
this.x = x;してくれる。
this.y = y;またC-jのときは
}ジャンプしたあとに
public Point() {下の一覧画面が消える。
this(0, 0); } ====================================== public class Point { private int x; private int y; public Point(int x, int y) {←(1) 例えばこの行に
public Point() {カーソルを置いて
public int getX() {Enterキーを押すと…
public int getY() { ====================================== +--------------------------------------+
.____________________

headerline.elでは、他に以下のメジャーモード用のパターンを用意しています。 .* text-mode .* ruby-mode .* java-mode .* c-mode .* c++-mode .* emacs-lisp-mode .* html-helper-mode .* yahtml-mode .* latex-mode .* yatex-mode

◎headerline.elの使い方:テキスト編headerline-text

headerline.elはもともと、テキスト文章で見出しを一覧するために作成しました。 ここでは、テキスト文章での使い方を説明します。

テキスト文章でも使い方はJavaのときと同じですが、以下の点が異なります。 .* 「●」や「◎」や「■」や「=」や「.$」で始まる行が見出しと見なされる .* 画面は左右に分割される

例えば、次のようなサンプル「sample.txt」があるとします。

.==================== {{}}●headerline.elを使おう headerline.elは、見出し(章や節のタイトル)を 一覧で表示してくれる、自作EmacsLispです。

‥‥‥‥

{{}}◎headerline.elのインストール headerline_1.2.zipをダウンロードして解凍し、 headerline.elをパスの通ったディレクトリに 置きます。

‥‥‥‥

{{}}◎headerline.elの使い方:Java編 Javaプログラムを例にして、headerline.elの 使い方を説明します。

‥‥‥‥ .====================

これをMuleで開きます。メジャーモードがtext-modeまたはfundamental-modeであることを確認してください。

そして、F10キーを押します。すると画面が左右に分割され、右の画面に見出しの一覧が表示されます。

また見出しにカーソルを合わせてEnterキーを押すと、対応する見出しにジャンプするのも同じです。

画面イメージ: .____________________ +-----------------------------------------------------------------------+ | ●headerline.elを使おう            |●headerline.elを使お→| | headerline.elは、見出し(章や節のタイトル)を |◎headerline.elのイン→| | 一覧で表示してくれる、自作EmacsLispです。   |◎headerline.elの使い→| |    ‥‥‥‥                |      | |                        |      | | ◎headerline.elのインストール         |      | | headerline_1.2.zipをダウンロードして解凍し、 |      | | headerline.elをパスの通ったディレクトリに   |      | | 置きます。                  |      | |    ‥‥‥‥                |      | |                        |      | | ◎headerline.elの使い方:Java編        |      | | Javaプログラムを例にして、headerline.elの   |      | | 使い方を説明します。             |      | |    ‥‥‥‥                |      | |=======================================================================| +-----------------------------------------------------------------------+ .____________________

◎次/前の見出しに移動するheaderline-goto

headerline.elをロードすると、次のような関数が使えるようになります。

.[ headerline-goto-next ]

カーソルの現在位置から、次の見出しに移動します。 .[ headerline-goto-previous ] カーソルの現在位置から、前の見出しに移動します。

画面イメージ: .____________________ +------------------------------------+ | ●headerline.elを使おう      | | headerline.elは、見出し(章や節の |←(1)ここにカーソルを置いて | タイトル)を一覧で表示してくれる、 | headerline-goto-nextを |    ‥‥‥‥           | 実行すると… |                   | | ◎headerline.elのインストール   |←(2)ここに移動する。 | headerline_1.2.zipをダウンロード  | もう一度実行すると… | して解凍し、headerline.elをパスの | |    ‥‥‥‥           | |                   | | ◎headerline.elの使い方:Java編  |←(3)ここに移動する。 | Javaプログラムを例にして、     | headerline-goto-previous | headerline.elの使い方を説明します。| を実行すると、前に戻る。 |    ‥‥‥‥           | |====================================| +------------------------------------+ .____________________

デフォルトでは、両方ともキー割り当てがされていませんので、使用する場合は.emacsに例えば次のように書いてください。

.==================== ;; headerline.elのロード (load-library "headerline") ;; キー割り当て(デフォルトではF10に割り当てられている) ;(global-set-key [C-F10] 'headerline) ; Controll + F10

{{*;; 次/前の見出しにジャンプする*}} {{*(global-set-key "\M-n" 'headerline-goto-next)*}} {{*(global-set-key "\M-p" 'headerline-goto-previous)*}} .====================

この例ではM-pとM-nに割り当てました。 理由は、Muleのデフォルトではこの2つにはキー割り当てがされていないからです。 M-pとM-pにすでに他の関数を割り当てている場合は、別のキーに割り当ててください。

ちなみに筆者の場合は、M->とM-<に割り当てています。 そして、もともとのM->とM-<に割り当てられていた関数(end-of-bufferとbeginning-of-buffer)はそれぞれC-q C-eとC-q C-aに割り当てています。

.==================== (global-set-key "\M->" 'headerline-goto-next) (global-set-key "\M-<" 'headerline-goto-previous) .====================

◎カスタマイズ:見出しのパターンheaderline-pattern

見出しのパターンは正規表現で指定します。 またその正規表現は、メジャーモードごとに設定します。

見出しのパターンは、連想配列 headerline-pattern-alist に格納されています。デフォルトでは、次のような設定になっています。

.==================== (defvar headerline-pattern-alist

'(

(text-mode . "^[=●◎○■□◆◇▼▽▲△★☆].*$\^\.\$.*$")
[FIXME: invalid characters] [FIXME: invalid characters] (c-mode . "^[a-zA-Z].*$") (c++-mode . "^\\[a-zA-Z].*") (html-helper-mode . "<[hH][1-4].*") (yahtml-mode . "<[hH][1-4].*")
(emacs-lisp-mode . "^(defun .*$\^(defvar .*$")
(latex-mode . "^\\\(sub\)*section.*\\\chapter.*")
(yatex-mode . "^\\\(sub\)*section.*\\\chapter.*")

)) .====================

この設定に追加したり上書きしたりするには、次のようにしてください。 .==================== (setq headerline-pattern-alist

(append '( (java-mode . "^\\( \\)?[a-zA-Z].*") (text-mode . "^[=●◎○].*") ) *headerline-pattern-alist*)) .====================

また現在のメジャーモードで見出しパターンが設定去れていない場合は、デフォルトの見出しパターンが使用されます。これは変数 headerline-default-pattern に格納されており、デフォルトでは次のようになっています{{(「.$」で始まる行がパターンに入っているのは、{{kwaterhttp://kwatch.tripod.co.jp/kwater/}}のためです。)}}。
.==================== (defvar headerline-default-pattern
"^[=●◎○■□◆◇▼▽▲△★☆].*$\^\.\$.*$")
.====================

これを変更するには、例えば次のような記述を.emacsに追加してください。

.==================== (setq headerline-default-pattern "^=.*") .====================

◎カスタマイズ:画面分割の方向と幅headerline-separate

画面の分割を、上下に分割するか左右に分割するかをメジャーモードごとに設定できます。また分割したときの幅も設定できます。

これは、連想配列 headerline-split-window-params-alist で行います。デフォルトでは次のようになっています。 「25」や「10」が幅を、「t」や「nil」が分割の方向を表しています(tなら左右、nilなら上下)。

.==================== (defvar headerline-split-window-params-alist

'( (text-mode 25 t) (ruby-mode 25 t) (java-mode 10 nil) (c-mode 10 nil) (c++-mode 10 nil) (html-helper-mode 25 t) (yahtml-mode 25 t) (emacs-lisp-mode 10 nil) (latex-mode 10 nil) (yatex-mode 10 nil) )) .====================

例えばJavaではメソッド名やパラメータ名が長くなるので、デフォルトでは上下に分割し、画面の幅を広く使えるようにしています。またRubyならメソッド名もパラメータ名も短く、表示幅が狭くても問題ないので、左右に分割しています。

この設定に変更や追加をするには、例えば次のようにします。

.==================== (setq headerline-split-window-params-alist

(append '( (java-mode 35 t) ; t は縦に分割 (text-mode 12 nil) ; nil は横に分割 ) headerline-split-window-params-alist)) .====================

また現在のメジャーモードでの設定がない場合は、デフォルトの設定が使用されます。これは変数 headerline-split-window-default-params で設定されており、デフォルトでは次のようになっています。

.==================== (defvar headerline-split-window-default-params '(25 t)) .====================

この設定を変更するには、次のような記述を.emacsに追加します。

.==================== (setq headerline-split-window-default-params '(30 nil)) .====================

◎類似機能との比較headerline-compare

headerline.elと似た機能を提供するものとして、次のようなものがあります。

.: tags-search

いわゆるタグジャンプ機能です。etagsというコマンドを使って関数名とファイル名と行番号のリストを作っておき、任意の関数にジャンプする機能です。Emacs標準機能です。headerline.elと違って、異なるファイルへのジャンプもできます。

ただしetagsというコマンドが対応している言語(C言語など)でしか使用できませんので、テキスト文章の見出しなどでは使用できません。もっというと、etagsが作成するタグファイルの形式であれば他の言語でも対応可能ですが、headerline.elほど簡単には対応できません。

.: navi.el

{{http://www.ne.jp/asahi/love/suna/pub/soft/navi.el/}}で公開されているEmacsLispスクリプトです。headerline.elとかなり似ています。

ただし、こちらも対応している言語は限られているようで、headerline.elほど柔軟には設定できないようです。また関数へのジャンプは文字列で検索しているため、例えばC言語のプロトタイプ宣言がある場合では正しくジャンプできません。

そのほか、headerline.elでは次/前の見出しや関数に移動するコマンドが用意されていますが、上の2つにはありません。

どちらにしても、これらを置き換える目的でheaderline.elを作ったわけではありませんので、気に入ったものを使えばいいと思います。

●コンパイルを楽にしよう!compile

.+table_of_contents: 目次:

.* {{コンパイルコマンドを変更する#compile1}}
.* {{コンパイルウィンドウを小さくする#compile2}}
.* {{そのほか#compile3}}
.-table_of_contents:

◎コンパイルコマンドを変更するcompile1

Muleでは M-x compile を実行することで、Muleからコンパイルを実行することができます。しかしコンパイルコマンドはいつも "make -k" となっていて不便です。これを変更してもっと便利にしましょう。

コンパイルを行うときのコマンドは、変数 compile-command に格納されています。そこで、これを次のような方針で変更します。

.* java-mode のときは、'javac {{/ファイル名/}}' に設定する .* c-mode のときは、.^ .* もし同じディレクトリにMakefileがあれば 'make -k' に、 .* ヘッダファイルがあれば 'gcc -g -Wall -ansi -c {{/ファイル名/}}' に、 .* それ以外では 'gcc -g -Wall -ansi -o {{/コマンド名/}} .[]{{/ファイル名/}}' に 設定する。 以下を自分の .emacs に加えてください。 .======================================== (add-hook 'java-mode-hook '(lambda () ;; コンパイルコマンドの設定 (make-local-variable 'compile-command) (setq compile-command (concat "javac " (file-name-nondirectory buffer-file-name))) ))

(add-hook

'c-mode-hook '(lambda () ;; コンパイルコマンドの設定 (make-local-variable 'compile-command) (set-compile-command-for-c) ))

(defun set-compile-command-for-c ()

(interactive) (let* ((filename (file-name-nondirectory buffer-file-name)) (index (string-match "\\.c$" filename)) (filename-no-suffix (substring filename 0 index))) (cond ;; make用のファイルがあれば "make -k" ((or (file-exists-p "Makefile") (file-exists-p "makefile")) (setq compile-command "make -k")) ;; ヘッダファイルがあれば、オブジェクトファイルをつくる ((file-exists-p (concat filename-no-suffix ".h")) (setq compile-command (concat "gcc -ansi -Wall -g -c " filename))) ;; それ以外 (t (setq compile-command (concat "gcc -ansi -Wall -g -o " filename-no-suffix " " filename)))))) .========================================

◎コンパイルウィンドウを小さくするcompile2

M-x compile でコンパイルを行うと、画面が2つに分割され、上にプログラムコードが、下にコンパイルウィンドウが表示されます。しかし、コンパイルウィンドウは画面の半分を占めなくても、もっと小さい大きさのウィンドウで十分なことも多いです。そんなときは、次のEmacs Lispを自分の .emacs に書いて下さい。

.======================================== ;; コンパイルウインドウの大きさを制限する (setq compilation-window-height 8) ;; 高さ8行 .========================================

これで、コンパイルするたびに C-x 1 を実行しなくてすみます。

もしコンパイルエラーがたくさん出て、コンパイルウィンドウを大きくしたい場合は、モード行(白黒反転している行のことです)をマウスでドラッグし、上下に動かしてみてください。コンパイルウィンドウの大きさを大きくすることができます。

◎そのほかcompile3
コンパイルを行う関数 compile は、標準ではキーに割り当てられていません。しょっちゅう使う関数ですので、{{「キー割り当てを変更しよう!」keybind.html}}を参考にしてどこかのキーに割り当てておきましょう。例えば M-p に割り当てるのでしたら、以下のようにでもしてください。
.======================================== ;; M-p でコンパイル (global-set-key "\M-p" 'compile) .========================================

また、関数compileでコンパイルしたら、C-x ` .[] でエラー箇所にジャンプしましょう。いちいち行番号を探す必要がなくなります。.^ この、エラー箇所へのジャンプ機能は非常に便利です。 作業効率がグンと上がりますので、ぜひ使ってみてください。

.+##### .#Emacsでは慣習として C-c C-c に関数 compile を割り当てることが多いのですが、 .#cc-mode.el では C-c C-c に関数 comment-region を割り当てています。.^ .#そこで、これを変更してみましょう。以下を自分の .emacs に加えてください。 .#.======================================== .#(add-hook 'c-mode-common-hook .# '(lambda () .# ;; C-c C-c でコンパイルを行う .# (local-set-key "\C-c\C-c" 'compile) .# ;; C-c c でリージョンをコメントアウトする .# (local-set-key "\C-cc" 'comment-region))) .#.======================================== .-#####

●Rectangle機能を使おう!rectangle

Muleでは、矩形編集ができます(矩形「くけい」とは、長方形のこと)。

例えば、次のようなファイルがあったとします。 .----------------------------------------

abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz .---------------------------------------- ここで、一行目の f にカーソルを持っていき、 C-SPC(Ctrlキーを押しながらSpaceキー)を押します。 次に最後の行の q にカーソルを持っていき、 C-x r k (Ctrlキーを押しながら x を押し、Ctrlキーを離して r k )と押します。 すると、以下のように f から p までが切り取られます。 C-x r k は、矩形領域を切り取る機能なのです。 .---------------------------------------- abcdeqrstuvwxyz abcdeqrstuvwxyz abcdeqrstuvwxyz abcdeqrstuvwxyz .----------------------------------------

次に、