psgml によるXMLファイルの編集

2012.4.9更新

[1] psgml とは

psgml はSGMLファイルやXMLファイルを編集するためのEmacs メジャーモードです。

Meadow でも使用できます。

SGML の使用機会は今ではほとんどない(少なくとも筆者には)ので、ここではXMLだけを扱うことにします。

[2] Emacs 23 で psgml を使用するには (2012.4.9追記)

GNU Emacs23 では psgml をインストールしただけでは、 psgml は使えません。 xml-mode は nxml-mode のエイリアス(別名)になっているから、 M-x xml-mode とやっても nxml-mode が立ちあがるだけです。 psgml モードを立ちあげるためには、 以下の設定を ~/.emacs など(~/.emacs.d/init.el のほうがいい)にかいておく必要があります。 (Yahoo知恵袋である人に教えていただきました。)

;; 以下は nxml-mode を無効にし psgml の xml-mode を有効にするための設定
(require 'nxml-mode)
(require 'psgml)

;; *.xml 文書は xml-mode で
(setq auto-mode-alist (cons (cons "\\.xml" 'xml-mode) auto-mode-alist))
(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)

以下は昔かいた記事です。

[3] 前提事項

以下では Meadow と Cygwin での使用を前提に話を進めます。

Linux でも同様にうまく行くはずです。

e:\Meadow に Meadow がインストールされていると仮定します。

[4] ダウンロード

Information about PSGML

上のサイトからダウンロードできます。

ここでは psgml-1.2.5.tar.gz をダウンロードすることにします。

psgml-1.2.5.tar.gz をダウンロードしたら、これを e:\Meadow\site-lisp に置きます。

[5] インストール

$ cd e:\Meadow\site-lisp
$ tar -zxvf psgml-1.2.5.tar.gz

とやって psgml-1.2.5.tar.gz を解凍展開します。 psgml-1.2.5 ディレクトリができるので

$ cd psgml-1.2.5

します。 ここで *.el をコンパイルします。

$ meadow -batch -q -l ./psgml-maint.el -f psgml-compile-files

コンパイルが成功すれば下のように表示されるはずです。

Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml.elc
Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml-parse.elc
Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml-edit.elc
Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml-dtd.elc
Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml-info.elc
Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml-charent.elc
Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml-api.elc
Wrote e:/Meadow/site-lisp/psgml-1.2.5/psgml-other.elc
Done compiling

インストール作業はこれで完了です。

[6] 設定

次を .emacs または .emacs.el 等に付け加えておきます。

(setq auto-mode-alist (cons (cons "\\.xml" 'xml-mode) auto-mode-alist))
(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)
(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)

あるいは *.xhtml も扱いたいなら、下のようにするとよいでしょう。

(setq auto-mode-alist
      (append
       (list
        '("\\.xml" . xml-mode)
        '("\\.xhtml" . xml-mode))
       auto-mode-alist))
(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)
(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)

必要なら

(setq load-path 
(cons "e:/Meadow/site-lisp" load-path))

も付けます。

[7] 使用例 (PSGMLでXHTML文書を編集する)

XHTML とは簡単に言うと、XML規格に準拠したHTMLです。XHTMLのDTDを読み込みさえすれば、PSGMLでXHTML文書を自由に編集することができます。

XHTMLにはいくつかのバージョンがありますが XHTML 1.0 Strict で十分でしょう。 以下ではXHTML 1.0 Strictを扱います。

まず下の4つのファイルをダウンロードします(ここにあるリンクを使えばよい)。

xhtml1-strict.dtd がXHTML 1.0 Strict のDTD で、残りの三つは xhtml1-strict.dtd でインポートされるエンティティ宣言をあつめたファイルです。

ダウンロードしたファイルはローカルの適当なディレクトリに置きます。

以下では /home/hiro/work/dtd に置いたものと仮定します。

また編集するXML文書は /home/hiro/work/xml にあるものとします(下図参照)。

home
 |
 +--hiro
     |
     +--work
         |
         +--dtd <--- ここに *.dtd *.ent を置く
         |
         +--xml <--- ここに *.xml *.xhtml を置く

Emacs(Meadow) を起動して、バッファに次の文を書き込みます。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html SYSTEM "/home/hiro/work/dtd/xhtml1-strict.dtd">

または

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html SYSTEM "file:///home/hiro/work/dtd/xhtml1-strict.dtd">

このようにDTDへの絶対パスを入れておけば、システムのどの場所からもDTDを読み取ることができます。

ただし Windows で Cygwin を使っている場合は上の書き方ではうまく行かないようです。 そこで下のように書きます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html SYSTEM "/cygwin/home/hiro/work/dtd/xhtml1-strict.dtd">

書いたら、C-x C-s で保存しておきましょう。 ここでは /home/hiro/work/xml に hello.xml という名前をつけて保存したものと仮定します。

バッファで C-c C-e と打つと、ミニバッファに Element: html というメッセージが現れます。 ここではそのままリターンを押します。するとバッファには自動で

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html SYSTEM "/cygwin/home/hiro/work/dtd/xhtml1-strict.dtd">
<html>
  <head>
    <!-- one of (title base) -->■
  </head>
  <body>
  </body>
</html>

という文字が入力されます。■はカーソルの位置を示します。

カーソルの位置をそのままに、続けてまた C-c C-e と打つと、ミニバッファに Element: というメッセージが現れます。これはユーザに要素名の入力を促すプロンプトです。 スペースキーを打つと、下のように次に入力すべき要素名の候補を示してくれます。

Click <mouse-2> on a completion to select it.
In this buffer, type RET to select the completion near point.

Possible completions are:
base                               link
meta                               object
script                             style
title

まず title 要素を入力することにします。 ミニバッファの Element: の後に title と入れてリターンします。するとバッファは

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html SYSTEM "/cygwin/home/hiro/work/dtd/xhtml1-strict.dtd">
<html>
  <head>
    <!-- one of (title base) -->
    <title>■</title>
  </head>
  <body>
  </body>
</html>

というように title 要素を自動で入力してくれます。

あとは■の場所に適当なタイトル名を入力するだけです。

以下、こんな感じでXHTMLを編集していきます。PSGMLのより詳しい使い方は下記のリンクを参考にしてください。

[8] 参考

PSGML で XML 文書を書く