Mule の Matlab mode 用 Lisp ソース
UNIX 上で Matlab ファイルを編集する時、自分はいつも Mule を使うのですが、 Mule 上では Matlab に標準で添付されているエディタである M-Edit の様な カラフルな表示 が出来なくて、いつも使う気が半減していたので、一念発起して Matlab mode というのを作って、 Mule 上でもカラフルなソースの表示が出来る様にしました。
でも実際に作成した環境は、実は Mule for Windows 2.3 ( SUETSUMUHANA ) & Meadow 1.10 ( TSUYU ) 上なんですけどね。
- ・ Matlab mode を適用した mule 画面のサンプルは ここ に有ります
- ・ 動作確認した Mule + Hilit のバージョン
- GNU Emacs 19.28.1 ( Mule 2.3 ) and hilit19 ( Release 2.19 )
GNU Emacs 20.4.1
- ・ 動作確認した OS ( 殆んど意味無し )
- SunOS 5.6 ( Solaris 2.6 ) , SunOS 4.1.4-JL , DIGITAL UNIX V4.0B , Windows95+98 , WindowsNT4.0 ( SP 3, 4, 5, 6a )
- ・ 注意
- 私が作成したソースは .m ファイルをカラフルに表示させるのが主目的ですが、思った通りにカラー化が行われない場合が有ります。例えば引用文には ' ( SingleQuotation ) が使われますが、同時に Matlab では転置行列にも ' ( SingleQuotation ) が使われます。この様な両者の違いを ( 正規表現によるやり方では )完全に区別する事が出来ないので、同じ行に引用文と転置行列が記述されていると、きちんとカラー化されない場合があります。また、 fprintf 関数等の文中に記述される % 記述子 も、コメント開始文字の % と混同される場合があります。
セットアップ手順
なお、ここに用意してあるソースファイルには2種類有ります。
[ A ] 私が perl-mode を参考にして作った、必要最低限の機能のみのソース
- 当初、私は MathWorks 社の FTP Server 上に matlab.el が有るとは知らなかったので、 perl-mode.el ( 私の UNIX 環境では /usr/local/lib/mule/19.28/lisp/ に有ります ) を参考にして matlab-mode を作っていました。それがこのソースです。私はいつもタブ幅は 3 で、 auto-indent 等は全く使わないで編集を行うので、 perl-mode に付いていたインデント等の機能は全て取り除いてしまいました。よってソースは非常にシンプルになっています。 auto-indent 機能が欲しい時は、 perl-mode.el にある、 electric-perl-terminator 関数等を参考にして入れて下さい。
[ B ] matlab.el.1.10.1 の、 hilit19 の部分のみをカスタマイズしたソース
- matlab.el.1.10.1 は、 MathWorks 社の Anonymous FTP Server 上にあります ( ftp.mathworks.com の /pub/contrib/emacs_add_ons ) 。このファイルは既に auto-indent 機能や Emacs20 からの機能である font-lock による色付けをサポートしていますが、 Emacs19 等で必要になる、 hilit19 による色付けがちゃんと行われません。それは色付け範囲を指定する正規表現が余り正確ではないからです。よって、 [ A ] で作成した hilit19 による色付けの為の正規表現を matlab.el.1.10.1 に移植したのがこのソースです。なお、このソースは参考にしたファイルが GNU に準拠したファイルであるので、 LICENSE は GNU GPL ( GNU GENERAL PUBLIC LICENSE ) に依存します ( GNU GPL の日本語訳は こちら ) 。
以下に、 [ A ] , [ B ] それぞれについて設定方法を説明します。
[ A ] の設定方法
-
- まず、 [ A ] の ソースをダウンロード して下さい。拡張子が .el.A.Z となっていますが、別に圧縮はしていませんので、 .A.Z のみファイル名から取り除いておいて下さい。この後の説明では保存先を /home/hoge/lib/matlab.el として説明します。なお、このソースは *euc-japan*unix でエンコードされています。
- ~/.emacs に、以下の記述を加えて下さい。
(autoload 'matlab-mode "matlab" "Enter Matlab mode." t)
(setq auto-mode-alist (cons '("\\.m\\'" . matlab-mode) auto-mode-alist))
(setq load-path (cons "/home/hoge/lib" load-path))
- 上記の autoload 関数により、 matlab-mode が要求された時に自動的にライブラリをロードしてくれます。この時、ライブラリが byte-compile されていた方が高速にロードできます。よって、一度 Mule を立ち上げて、 M-x byte-compile-file を matlab.el ファイルに対して行っておくと良いでしょう。すると同じディレクトリに matlab.elc ファイルが出来る筈です。
- なお、以下の様な hilit19 の設定が .emacs に記載されていない場合は以下の設定も載せておいて下さい。なお、下記の 橙色の部分 の行を付け足す事により、コメント部分が緑色になり、引用符部分が赤褐色になって、 Matlab for Windows に付属の M-Edit の色表現に近づきます。なお、色を変えるつもりで無い時は 橙色の部分 は記入しなくてもいいです。
(cond (window-system
(setq hilit-mode-enable-list 'nil
hilit-background-mode 'light
hilit-inhibit-hooks nil
hilit-inhibit-rebinding nil)
(require 'hilit19)
(hilit-lookup-face-create 'green4)
(hilit-translate comment 'green4)
(hilit-lookup-face-create 'tomato1)
(hilit-translate formula 'tomato1)
))
- これで完了です。 Mule 上で 拡張子が .m のファイルは全て Matlab mode としてカラフルに開かれる筈です。試してみて下さい。なお、 [ A ] のソースは単純なので、タブ幅の設定等はソースを直接いじって行うと良いでしょう。但し変更後はバイトコンパイルを行う事を忘れずに..。
[ B ] の設定方法
-
- まず、 [ B ] の ソースをダウンロード して下さい。拡張子が .el.B.Z となっていますが、別に圧縮はしていませんので、 .A.Z のみファイル名から取り除いておいて下さい。この後の説明では保存先を /home/hoge/lib/matlab.el として説明します。なお、このソースは *euc-japan*unix でエンコードされています。
- ~/.emacs に、以下の記述を加えて下さい。
(autoload 'matlab-mode "matlab" "Enter Matlab mode." t)
(autoload 'matlab-shell "matlab" "Interactive Matlab mode." t)
(setq auto-mode-alist (cons '("\\.m\\'" . matlab-mode) auto-mode-alist))
(setq load-path (cons "/home/hoge/lib" load-path))
(add-hook 'matlab-mode-hook '(lambda ()
(turn-on-auto-fill)
(setq matlab-indent-level 3)
(setq matlab-indent-function t)
(setq fill-column 93)
(setq tab-width 3)
(auto-fill-mode nil)
(setq indent-tabs-mode t)))
(add-hook 'matlab-shell-mode-hook '(lambda () ))
(cond ((and window-system (= emacs-major-version 20)) ; Emacs20, Meadow
(defface font-lock-comment-face ; コメント文
'((((class grayscale) (background light)) (:foreground "DimGray" :bold t :italic t))
(((class grayscale) (background dark)) (:foreground "LightGray" :bold t :italic t))
(((class color) (background light)) (:foreground "green4")) ; FireBrick
(((class color) (background dark)) (:foreground "OrangeRed"))
(t (:bold t :italic t))) "Font Lock mode face used to highlight comments."
:group 'font-lock-highlighting-faces)
(defface font-lock-string-face ; 引用文
'((((class grayscale) (background light)) (:foreground "DimGray" :italic t))
(((class grayscale) (background dark)) (:foreground "LightGray" :italic t))
(((class color) (background light)) (:foreground "tomato3")) ; RosyBrown
(((class color) (background dark)) (:foreground "LightSalmon"))
(t (:italic t))) "Font Lock mode face used to highlight strings."
:group 'font-lock-highlighting-faces)
(defface font-lock-keyword-face ; if や end 等
'((((class grayscale) (background light)) (:foreground "LightGray" :bold t))
(((class grayscale) (background dark)) (:foreground "DimGray" :bold t))
(((class color) (background light)) (:foreground "blue")) ; Purple
(((class color) (background dark)) (:foreground "Cyan"))
(t (:bold t))) "Font Lock mode face used to highlight keywords."
:group 'font-lock-highlighting-faces)
(defface font-lock-type-face ; Figure や Line , Surface 等
'((((class grayscale) (background light)) (:foreground "Gray90" :bold t))
(((class grayscale) (background dark)) (:foreground "DimGray" :bold t))
(((class color) (background light)) (:foreground "ForestGreen"))
(((class color) (background dark)) (:foreground "PaleGreen"))
(t (:bold t :underline t))) "Font Lock mode face used to highlight type and classes."
:group 'font-lock-highlighting-faces)
(defface font-lock-function-name-face ; function name 等
'((((class color) (background light)) (:foreground "Blue"))
(((class color) (background dark)) (:foreground "LightSkyBlue"))
(t (:inverse-video t :bold t)))
"Font Lock mode face used to highlight function names."
:group 'font-lock-highlighting-faces)
(defface font-lock-variable-name-face ; function の括弧内の変数等
'((((class grayscale) (background light))
(:foreground "Gray90" :bold t :italic t))
(((class grayscale) (background dark))
(:foreground "DimGray" :bold t :italic t))
(((class color) (background light)) (:foreground "DarkGoldenrod"))
(((class color) (background dark)) (:foreground "LightGoldenrod"))
(t (:bold t :italic t))) "Font Lock mode face used to highlight variable names."
:group 'font-lock-highlighting-faces)
(global-font-lock-mode t)) ; Font-Lock-Mode の導入
((and window-system (= emacs-major-version 19)) ; Emacs19, Mule for Win
(font-lock-mode 1)
(add-hook 'matlab-mode-hook '(lambda () (matlab-mode-hilit)))))
- 上記の autoload 関数により、 matlab-mode が要求された時に自動的にライブラリをロードしてくれます。この時、ライブラリが byte-compile されていた方が高速にロードできます。よって、一度 Mule を立ち上げて、 M-x byte-compile-file を matlab.el ファイルに対して行っておくと良いでしょう。すると同じディレクトリに matlab.elc ファイルが出来る筈です。
また、上記の 橙色の部分 の行を付け足す事により、 Emacs20 ( or Meadow ) で立ち上げた時に、コメント部分が緑色になり、引用符部分が赤褐色になったりして、 Matlab for Windows に付属の M-Edit の色表現に近づきます ( Emacs19 では関係有りません ) 。なお、色を変えるつもりで無い時は 橙色の部分 は記入しなくてもいいです。
- なお、以下の様な hilit19 の設定が .emacs に記載されていない場合は、 Emacs19 できちんと色が表示される様にする為に、以下の設定も載せておいて下さい。なお、下記の 橙色の部分 の行を付け足す事により、コメント部分が緑色になり、引用符部分が赤褐色になって、 Matlab for Windows に付属の M-Edit の色表現に近づきます ( Emacs20 or Meadow では関係有りません ) 。なお、色を変えるつもりで無い時は 橙色の部分 は記入しなくてもいいです。
(cond (window-system
(setq hilit-mode-enable-list 'nil
hilit-background-mode 'light
hilit-inhibit-hooks nil
hilit-inhibit-rebinding nil)
(require 'hilit19)
(hilit-lookup-face-create 'green4)
(hilit-translate comment 'green4)
(hilit-lookup-face-create 'tomato1)
(hilit-translate formula 'tomato1)
))
- これで完了です。 Mule 上で 拡張子が .m のファイルは全て Matlab mode としてカラフルに開かれる筈です。試してみて下さい。
|