-*- outline -*- ** 時代に逆行する皆さんへ、Emacsヴァージョン20へのダウングレード情報を お届けします。Emacs 21のさまざまな機能が省かれたことによる単純さを お楽しみください。 *** 表示エンジンは、可変サイズの文字やテキスト以外のものを表示する機能 が省略され、著しく単純化されました。これにより、Emacs 21のような複 雑な表示レイアウトを防ぎます。例えば: Emacs 21ではGerd Moellman氏の手によりdisplay engineが全面的に書き直さ れました。 *** 可変サイズ文字表示機能はEmacs 20ではサポートされません。大きな文字 は使うことができず、イタリック体フォントの表示はとても読みにくくな ります。とはいっても、サイズがばらばらなテキストというのは、どうせ 読みにくいものです。フレーム中の全文字が、同じ高さと幅で、きちんと グリッドに沿って表示されていた方が、テキストは読みやすいに決まって います。 display engineの拡張に伴い、faceのpropertyが大幅に追加されています。追 加部分は、customize-faceの結果によると、 ・追加: Font family, Width, Height, Overline,Strike-through, Box around text, Inherit ・多値化: Bold -> Weight, Italic -> Slant といったところのようです。それぞれ後述します。詳しくはM-x customize-face [RET] default [RET]を実行して、いろいろ値を設定してみる とよいかと思います。 *** もはやEmacsは画像を表示しませんし、音を鳴らすこともありません。あ なたが_テキスト_エディタに望むように、ただテキストだけを表示します。 Emacs 21はframe内に画像を表示できるようになりました。ただし、build時に 適切なlibraryを用意しておいてlinkさせる必要があります(xpm -> libXpm, JPEG -> libjpeg, TIFF -> libtiff, GIF -> libungif, PNG -> libpng)。 簡単に画像を表示してみるには、M-x auto-image-file-modeしておいてから、 普通にfind-file (C-x C-f)で画像ファイルを指定します。 auto-image-file-modeしておけば、C-x C-i (insert-file)で画像をcurrent bufferのpoint位置に挿入できます。表示されている画像に対し、通常の copy&yank操作が行えます。 新しいEmacs Lisp productsの中には、Emacs 21であることを認識して自動的 に画像表示を行うものもあります。Wanderlust(icon及びmail添付画像), emacs-w3m(Web pageの画像)などがそうです。 *** 他のXウィンドウのアプリケーションとの互換性のため、フェイスに対す るフォントの指定には、XLFDフォント名を用います。すなわち、フェイス を組み合わせた際に、フォントの属性を混合することはできません。とは いえ、混合は経済的ではないことが実証されています。フェイスの継承も 取り除かれましたので、"多すぎるフェイス"に悩まされることもありませ ん。 Emacs 21では、faceに対するfontの指定をfont family/width/heightで行うこ とができるようになりました。以前はXLFDを使わなければならなかったため、 これらの値を個別に指定することができなかったわけです。 また、faceの継承がsupportされました。これにより、既存のfaceを少しだけ 変えて使いたい、というような場合に、copyではない自然な設定が可能で、 originalの変更への追随も容易になります。 これらの設定は、前出のcustomize-faceで行うことができます。 *** 3D、打ち消し線、上線など、見栄えに関するフェイスの属性が、いくつか 省かれました。 Overline, Strike-through, Box around textのことです。 *** Emacsは、Xツールキットのものではない、"粗末だが使いものにはなる"独 自のスクロールバーを備えています。メニューのトグルボタンとラジオボ タンは、他のメニュー項目と全く同じ見掛けになりました。これによりメ ニューは単純になり、必要以上に目立って他の項目の邪魔にならないよう になりました。 黒くて平たくて異様だったscroll barは、X toolkitベースの格好よいものに できます。build時にlibXaw3dを用意しておけば、3D表示になって視認性があ がります。 またmenuのradio buttonには、先頭にポチが付いてon/off状態を表示するよう になりました。 *** ツールバーもツールチップもなくなりました。特に、GUD(Grand Unified Debugger)モードで、変数名をクリックして変数の値をツールチップ表示 することができなくなりました。代わりに、Emacs 20が提供するデバッガ への直接インタフェースにて、display fooやprint barなど適切なコマン ドをデバッガに送ってください。これら命令の方が、その単語から、それ が何をするのか意味がより自明です。 Emacs 21を起動すると、menu barの下にtool barが出ることに気付くことと思 います。tool barのbuttonの上にmouse cursorを載せていると、tooltipが出 てきてbuttonの機能を表示します。 tool barの表示はM-x tool-bar-modeでtoggleできます。 (tooltip-show "foobar")で遊んでみるのも一興です。 また後半の記述については、M-x customize-group [RET] tooltip [RET] で GUDの項目をonにしてからM-x gdbを使ってみてください。 *** テキスト端末で色を表示することはできません。_どうしても_色を表示し たくて、しかしXを走らせることができない場合には、DOSエミュレータ上 でMS-DOG版のEmacsでも使っててください。 text terminal上でfaceを使う機能が、Mule 2.3以来久々に復活しています。 Linux consoleやterminal emulatorなどで色やboldが出ます。terminalの capability判別にはncurses等のlibraryを使っているようですので、環境変数 TERMによって挙動が決定されます。terminal emulator上では TERM=xterm-color等を与えると綺麗に色が付きます。(TERM=vt100ではboldく らいしかやってくれないようです。) *** モードラインは、情報の表示に徹するため、マウスに反応しなくなりまし た。バッファの移動、書き変え不可や変更済みの状態のトグル、マイナー モードのON/OFFには、キーボードからコマンドを打ってください。 mouse cursorを載せているとtooltipで説明が出ます。 *** X上でのホイール付きマウスはサポートされません。時代をさかのぼるほ ど、スクロールはどんどん遅くなっていきますし、ホイールつきのマウス は見かけないものになっていくからです。代わりにEmacs 20ではC-v、M-v キーを使ってスクロールしてください。(スクロールバーを使うこともで きますが、キーボードを使うことを薦めます。なぜならもっと以前の Emacsではそれすらサポートされなくなっていくだろうからです。) M-x mouse-wheel-modeするとscrollできるようになるらしいのですが、X上で wheelを動かしていないので実験できません。ごめんなさい。 *** ビジー状態を示すカーソルは省かれました。ディスプレイの解像度はどん どん荒くなっていっており、それを表示するのが厳しくなってきたからで す。端末が提供する標準の明滅カーソルを使ってください。 「Wanderlustで< s」など重たい処理をやらせて、しばらく入力が受け付けら れない状態になると、cursorが時計(watch)になります。(sleep-for 2)を評価 すると実験できます。 *** スクロールバーやメニューの色といった、Emacsの見かけのいくらかは、X のリソースだけからしか調節できないようになりました。色表示はX上で しかサポートされないので、Xのやり方以外でそれを調節できる意味はな いからです。Xの奥義に通じていない方々のために、デフォルトで、みん な気に入るいい感じの色が出るようになっています。 scroll-bar,menuという名のfaceをいじることで、Emacs Lispから制御が可能 なようです。 *** Emacs 20では、C-nでバッファの最下端を越えて下の行に進もうとすると、 改行文字が挿入されます。 next-line-add-newlinesのdefault値はnilになりました。 *** 変数show-trailing-whitespaceは特別な意味を持たなくなりました。行末 の空白文字は常に正しく表示されます -- ただの空白として。行がスペー スやTABで終わっていないかどうかは、その行でC-eを打ってみると分かり ます。同様に、バッファの終わりの空行に目印は付きません。バッファの 終わりはM->を押して確認してください。:-) この時使われるfaceはtrailing-whitespaceです。 *** 行間のスペースは常に、フォントのデザインとウィンドウマネージャの設 定に従うことになりました。これによって、テキストの表示は常に予測ど おりになります。:-) 変数line-spacingに、pixel単位で行間の大きさを指定できます。 ** Emacs 20では多国語編集の機能が簡略化されています。Emacs 19ほどラディ カルな簡略化ではないものの、以下のようなうっとうしい機能を省略する ことができました。: *** Emacs参照カードの翻訳版は配布パッケージに含まれなくなりました。か つて私たちは、計算機ユーザには英語を使って欲しいと思っていたからで す。 特に何も考えずにinstallすると、/usr/local/share/emacs/21.1/etcに refcard(参照カード),dired-ref(diredの参照カード)が入っているはずです。 cs, de, fr, pl, skの各言語版があります。 *** 混乱を避けるため、多くの言語のサポートが省略されました。例えばポー ランド語、ケルト語(Latin-8)はサポートされません。Latin-9環境も省か れました、かつてはユーロ記号なんて必要なかったからです。 list-coding-systemsの結果をEmacs 20.7とEmacs 21.1で比べてみたところ、 Emacs 21で追加されたcoding-systemには以下のものがあるようです。 ・iso-latin-8-with-esc, iso-latin-8 (alias: iso-8859-14 latin-8) iso-latin-9-with-esc, iso-latin-9 (alias: iso-8859-15 latin-9 latin-0) それぞれ Latin-8 (ISO-8859-14), Latin-9 (ISO-8859-15) ・mac-roman Mac Roman Encoding (おそらくMachintoshのこと) ・mule-utf-8 (alias: utf-8) Antinewsには記載がありませんが、Emacs 21にはUTF-8のsupportが追加されて います。ただし、Latin-1以外の文字を表示するには、適切なUnicode fontを 用意する必要があるそうです。 *** Emacs 20は、バッファを読むのに使っていたコード系がそのまま使える場 合でも、バッファの保存時には常にコード系を尋ねるようになりました。 普段使っているコード系が適当かどうか確認することもしません。 *** 文字セットとコード系に関する詳細を表示する、list-charset-chars, describe-character-setといったコマンド、C-u C-x =といったキーシー ケンスはもはや存在しません。ASCII以外の文字については、言わぬが花 なのです。 それぞれ「指定したcoding systemで定義された文字の一覧を表示」「指定し たcharacter setに関する説明の表示」「point位置の文字の情報(charset, code point, font など)を表示(what-cursor-positon)」です。 *** 端末のコード系をCCLベースのものにすることはできないため、KOI8や DOS/Windowsコードページのコードを出力するキーボードは直接はサポー トされません。代わりにLeimパッケージの入力メソッドを使ってください。 ** 時代を遡ってみると、いくつかのシステムは重要でないかヴェイパーウェ アの段階になります。よってEmacs 20は以下のものをサポートしません。: *** Emacs 20はIA64アーキテクチャのGNU/Linux上ではビルドできません。ま た、SolarisやIrixなどの64ビットOS上であっても、64ビットEmacsをビル ドすることはできません。 sourceのsrc/m/にia64.hが追加されています。またsparc.h, iris4d.hに、 #define BITS_PER_LONG 64のような行が存在します。 *** LynxOSも、Machintoshもサポートされません。当時それらのOSは、既に存 在していたにもかかわらず。 Classic MacOSで動かすcodeがmergeされたようです。Classic環境用の pre-compiled binary、及びEmacs 21をMacOS Xでbuildするためのpatchが http://mac-emacs.sourceforge.net/で公開されています。 ** メニューバーの項目は、他のGUIのプログラムとずいぶん違ったものになっ ています。統一されたルックアンドフィールというものは退屈だし、Emacs の比類なき機能には比類なきメニューバー項目が必要だと考えるからです。 [File][Edit][Options]... の順になりました。 ** メニューバーの`Options'メニューで設定した内容は保存されず、毎回新し いセッションを開始するたびに全てのオプションを設定しなおさなければ なりません。とはいっても、推奨する使用法に従い、ログアウトするまで1 つのEmacsを使いつづけるようにしたなら、設定のやり直しはそんなに頻繁 でもないはずです。 ただしtoggleしただけでは保存されません。Options menuのSave Optionsをク リックすると、~/.emacsに(custom-set-variablesの形で)書き出されます。 ** ユーザの初期化ファイルをロードしている途中でエラーが発生しても、 Emacs20はバッファをポップアップしてエラーメッセージを表示しません。 代わりに、ただ何かエラーが発生したと報告するのみです。初期化ファイ ルのどこでエラーが起こったのかを特定するには、(message "foo")のよう なコードを慎重に挿入して、`*Messages*'バッファに書いたメッセージが 表れているか確認するしかありません。 debug-on-errorのdefault値はtになりました。dotfileのみならず、以降全て のEmacs Lispの実行時に、errorが起きると同じ挙動になります。 この形でerror報告がなされると、debuggerが起動してrecursive-edit状態に なり、modelineのmodeの部分が角括弧で囲まれます。気になる方は *Backtrace* windowでqを押してdebuggerを抜けるか、 C-](abort-recursive-edit) すると元に戻ります。 ** いくつかのコマンドは、もはやTransient Markモードを特別扱いしません。 例えばispellは、Transient Markモードが有効であっても、マーク中にリー ジョン中だけをスペルチェックしようとせず、バッファ全体をスペルチェッ クします。(Transient MarkモードはEmacsの精神からいささか外れるもの なので、もっと初期のヴァージョンではそれを取り除こうかと考えていま す。) 確かにispellは、transient-mark-mode(とmark-active)を見てispell-region を呼び出しているようです。 ** メニューバーを表示していない状態でのC-Down-Mouse-3は、メニューバー を表示していたときに表示したようなメニューを表示しません。 Emacs 21では、menu barを消している時にC-Mouse-3を押すと、menu barと全 く同じ項目を表示するようになりました。menu barを表示させている時は、 Edit menuの内容を出すようです。 ** Emacs 20では、テキスト端末でもウィンドウシステム上でも、deleteキー はDELキーと全く同じように働き、カーソルのひとつ後ろの文字を削除する よう統一されました。これは、deleteと書かれたキーが、ウィンドウシス テム下ではひとつ前の文字を削除し、テキスト端末上ではひとつ後ろの文 字を削除する、という、Emacs 21の矛盾を取り除いたものです。 ** バックアップファイルを指定したサブディレクトリ(変数 backup-directory-alistで指定)に作成する機能は省略されました。これに よって、バックアップファイルを探す手間が削減されます。いつもオリジ ナルと同じディレクトリにあるのですから。 ちなみにauto saveが働いた時にできる『.saves-PID-HOST』というfileの defaultの置き場所が、home directory直下から~/.emacs.d/auto-save-listへ 変更されました。 ** Emacsはもはや、互換性のないEmacsによってコンパイルされ、実行できな いバイトコードを含むLispファイルのロードを拒否しません。かわって、 そのようなバイトコードに遭遇するとコアダンプします。とはいえ、これ はそうそう起こることではありませんし、遠い過去にEmacsの全てのヴァー ジョンが統一されたら、全く発生しなくなります。 確かにXEmacsでbyte compileした.elcを弾くようになっています。 ** C-x 5 1コマンドは省略されました。現在のフレーム以外の全てのフレーム を消したいときには、ひとつずつ消してください。 関数名delete-other-framesです。 ** CCモードはいまや、統一のため、インデントスタイルといったカスタマイ ズ可能なオプションを、ただひとつだけ保持します。例えば、Java用にス タイルを選択すると、CやC++のバッファにも同じスタイルが使われるよう になります。 ** Isearchは、マッチするほかの部分をハイライトしません。現在のマッチだ けを表示し、あなたの注意をそらしません。インクリメンタルサーチ中の エコーエリアでのMouse-2はエラーを発生し、現在の選択している文字列を 検索文字列に加えることはしません。同じことはM-yでできます。 このfaceの名前はisearch-lazy-highlight-faceです。 ** ange-ftpでリモートのファイルを編集する際に、ポート番号を指定できる 機能は省略されました。代わりにEmacs 20では、ドキュメントに書かれて いないange-ftp-normal-loginという関数でポートを指定することができま す。(ソースをいじれってことさ!) /USER@HOST#PORT:PATHの形で、portを指定できるようになりました。 ** Emacs 20はリモートのファイルのタイムスタンプの変更をチェックしませ ん。かつてあった古いFTPプログラムは、どのみち、タイムスタンプを返し てくれないからです。`^M'文字を行末に付加するWindowsスタイルのFTPク ライアントは、Emacs 20のange-ftpでは特殊な挙動を示します。予期しな い結果を引き起こして、人生を楽しませてくれるでしょう。 ** 多くの複雑な表示機能、例えばマウスに反応してハイライトするリージョ ン、メニュー項目の上でポップアップするヘルプ文字列といったものは、 MS-DOSヴァージョンでは動作しません。MS-DOS上ではスペルチェックも動 作しませんし、Eshellが存在しないので、まともに動くshellモードもあり ません。これは、ダム端末に似せて作られたというMS-DOSの精神にのっとっ ています。 ** womanパッケージは省略されましたので、POSIX標準でないシステム上でマ ニュアルページを読むには、_真の man (コマンド)_ が必要です。(マッチョ でない人はInfoでも読んでてください。) WoMan (M-x woman)ならminibufferで補完も効きます。最初にindexを作ろとす るのがかったるいですが...。 ** recentfも省略されました。なぜなら、頻繁に編集するファイルの名前くら い覚えておけるだろうと思うからです。ディスクの容量もどんどん少なく なっているので、どうせファイルは今より少ない数しかなくなるのです。 この機能がなくなっても、気付く人もいないでしょう。 「最近使ったfile」というやつです。(require 'recentf) (recentf-mode 1) しておくと、開いたfileの履歴を~/.recentfに取り、menuのFile - Open Recentから簡単に開くことができます。M-x recentf-open-filesでkeyboardか ら操作することもできます。 ** fieldプロパティはEmacs 20にはありません。よって、Emacsのバッファの 背後で外部プログラムを動かすさまざまなパッケージは、一般に、ユーザ の入力によるテキストと、サブプログラムの出力とを区別することができ ません。それでもこの区別を行いたい場合は、Emacs 20が提供する変数 comint-prompt-regexpを使って、入力からプロンプト文字列を検出してみ てください。 M-x shellでのC-a (beginning-of-line)が、pointを正しくprompt文字列の直 後に移動することができるようになりました。これまでのC-c C-a (comint-bol-or-process-mark)よりも正確です。 ** Delphiのソース、PostScriptファイル、コンテキストdiff、`TODO'ファイ ルを編集するためのメジャーモードは省略されました。代わりに Fundamentalモードを使ってください。 それぞれprogmodes/delphi.el, progmodes/ps-mode.el, diff-mode.el, calendar/todo-mode.elです。特にdiffとtodoは非常に便利です。それぞれM-x でmodeに移ってからF1 mしてみて下さい。 ** 他にも、Emacs 21であなたの暮らしを必要以上に混乱させてしまった多く のパッケージが、Emacs 20には含まれていません。EbrowseでC++のクラス をブラウズすることも、SQLデータベースに接続することも、LDAPや他のディ レクトリサービスにアクセスすることも、EshellでシェルコマンドとLisp の機能を調和させることもできません。 ebrowseはtagsのようなものですが、C++については継承木を表示したりできる ようです。添付のebrowseコマンドで'BROWSE'というファイルを生成し、それ をEmacs Lispで使うという方式です。詳しくはinfo ebrowseを参照してくださ い。 progmodes/sql.elを使うと、sqlplus, psql, mysqlといったRDBMSの cmmandline interfaceをEmacs上から呼び出すことができます。対応DBMSは DB2, Informix, Ingres, Interbase, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, Solid, Sybaseと多岐に渡っています。 net/ldap.elがLDAPとのinterfaceを提供します。 eshellは100% Emacs Lispで書かれたshellで、高portability・高 customizabilityの特徴を持ちます。と同時に、command lineにEmacs Lispを 混ぜることができ、いろいろ夢が広がります。 ** 減少を続けるメモリ容量とディスク容量に対応して、Emacs 20では、他に も多くの関数やファイルが省略されました。 Emacs 20.7と21.1を比較して、source tarballの展開後の容量は58M→ 79M(+36%)、file数にして2051→2625(+28%)の大改装です。