この記事ではGuixでXBELファイルをいい感じに開くための方法を紹介します。
もう少し込み入った書き方をすれば、XML Bookmark Exchange Language (XBEL)のファイルをEmacsのnXMLモードで閲覧・編集するにあたり、nXMLモードが参照するXBELのためのスキーマの構成をGNU GuixのGuix Home Configuration(以下「Guix Home」)において行う方法です(ややこしい)。
XBELのRELAX NGスキーマ
XBELは公式にDTDスキーマを公開しています。
一方、nXMLではRELAX NG Compact Syntaxのみに対応しています(参照:Infoの「(nxml-mode) Introduction」)。
したがって、XBELのRELAX NG Compact Syntaxの形式のスキーマを得なければなりません。
これにはTrangないしmsvのRELAX NG Converterが使えます。
ここではすでに私が変換したものをGitHubにて配布しているため、それを使うことにします。
Guixパッケージ
XBELのスキーマはじかにどこかしらのファイルパスに置いてnXMLのスキーマ配置の構成ファイルから参照してもいいのですが、ここではGuixパッケージとして仕立てることにしましょう。
次のようなパッケージ定義になります。
(use-modules (guix packages)
(guix git-download)
(guix build-system copy)
(guix gexp)
((guix licenses) #:prefix license:))
(define-public xbel-schema
(package
(name "xbel-schema")
(version "0.0.1")
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/gemmaro/xbel-schema")
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
(base32 "1z6wwqkd2yzh4lqwkq3kvvw2gg3aj5y2s20zyy6d63rwp067mz21"))))
(build-system copy-build-system)
(arguments
(list
#:install-plan
#~'(("xbel.rnc" "xml/xbel.rnc"))))
(home-page "https://github.com/gemmaro/xbel-schema")
(synopsis "RELAX NG schema for XML Bookmark Exchange Language")
(description "This package contains a RELAX NG schema file in RELAX NG Compact
Syntax (RNC) for The XML Bookmark Exchange Language (XBEL), converted
from the official Document Type Definition (DTD).")
(license license:gpl3+)))
XMLのスキーマファイルの場所はここでなければならないといったものはありませんが、Guixの公式パッケージ群の慣習としてはxml/配下が妥当のようです。
Guix Home
作成したパッケージを参照するようGuix HomeにてnXMLを構成します。
ここでは.emacs.d/nxml.xmlファイルを配置先とします。
(simple-service
'my-home-files-service-type
home-files-service-type
(list
(list ".emacs.d/nxml.xml"
(computed-file
"nXML-schemas"
#~(begin
(use-modules (sxml simple))
(call-with-output-file #$output
(lambda (port)
(sxml->xml
'(*TOP*
(*PI* xml "version=\"1.0\"")
(locatingRules
;; SXML [1] では*NAMESPACES*がありますが、sxml simpleに
;; は実装されていないようです。
;;
;; [1] https://okmij.org/ftp/Scheme/SXML.html#Namespaces
(@ (xmlns
"http://thaiopensource.com/ns/locating-rules/1.0"))
(documentElement (@ (uri #$
(file-append
xbel-schema
"/xml/xbel.rnc"))
(localName
"xbel")))))
port))))))
;; [...]
))
XMLの生成にはGNU GuileのSXMLを使っています(参照:Infoの「(guile) SXML」)。
XMLの中身としては、XMLの局所要素名 (localName) がxbelに合致した文書については、XBELのスキーマを適用するものとしています。
このサービス定義をGuix Homeに組み込んで再構成すれば、指定した場所にファイルが生成されます。
Emacsの構成
生成した構成ファイルをnXMLに伝えます。
Emacsの初期化ファイルで次のようにします。
(with-eval-after-load 'rng-loc
(defvar rng-schema-locating-files) ;defined in `rng-lock.el'.
(add-to-list 'rng-schema-locating-files
(locate-user-emacs-file "xml-schemas.xml")))
以上により、XBELのファイルを開いたとき、nXMLによるスキーマ検証が行なわれるようになります。
使用許諾
Copyright (C) 2026 gemmaro
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.