PlantUMLはUMLを記述するためのツールだ。 このPlantUMLをテキストエディターのEmacsから扱う方法はいくつかある。 そのうち、plantuml-mode、ob-plantuml, PlantUML ServerとXwidget Webkitについてまとめた。

目次

UML、PlantUML、そしてEmacs

この記事に登場するツールの内、前提となっているものを簡単に説明する。

UML

主にオブジェクト指向で実装されるソフトウェアの開発において、 それぞれの構成要素の構成/関係/仕様を図によって記述するための表記法のこと。

https://ja.wikipedia.org/wiki/%E7%B5%B1%E4%B8%80%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E

PlantUML

UMLの図を作図するツールはいくつかあるが、その代表的なものがPlantUMLだろう。 PlantUMLでは独自の構文を用いて作図する。 図の定義はテキスト形式であり、Gitなどリビジョン管理ツールとの親和性が高い。

https://plantuml.com/

Emacs

Emacsは長い期間に渡り愛され使用され続けているテキストエディターだ。 何をもってEmacsが最初に開発されたかについては議論の余地があるが、 現在最も使用されているGNU Emacsをリチャード・ストールマンが実装を開始しリリースしたのが1984年や1985年である1。 更に別の実装のEMACSはもっと昔とされ、その登場は1976年とされる2。 現在は2022年であるからGNU Emacsは38年、EMACSのアイディア自体は46年間もの間、生き続けていることになる。 その上でまだまだ現役で使用されている。

https://www.gnu.org/software/emacs/

plantuml-mode - Emacs上でPlantUMLのファイルを編集するメジャーモード

https://github.com/skuro/plantuml-mode

(use-package plantuml-mode :ensure t)
MELPAからインストールする

実行する方法は次の3つがある。

  • jarを指定する方法

  • サーバーを利用する方法

  • 実行可能な状態のスクリプトから呼び出す方法(ただしhomebrewでインストールした場合)

今回はjarを直接指定する。

plantuml-jar-pathplantuml-exec-mode を設定する。

(custom-set-variables
  '(plantuml-jar-path "/usr/local/Cellar/plantuml/1.2020.19/libexec/plantuml.jar")
  '(plantuml-exec-mode 'jar))
設定

PlantUMLのファイルの拡張子には通常.pluが用いられる。

例としてtest.pluを作成し M-x plantuml-mode でplantuml-modeを有効にする3

@startuml
Bob -> Alice : hello
@enduml
test.plu

test.pluをカレントバッファにして C-c C-c (plantuml-preview) を実行すると *PlantUML Preview* というバッファが作成されそこに生成された画像が描画される。 そのバッファはEmacsの通常のファイルの保存の機能で保存できる。

ob-plantuml - Org-modeを用いてドキュメント内部にPlantUMLの画像を差し込む

org-modeのbabelでPlantUMLが利用できる4。 org-mode内のPlantUMLを画像にしてドキュメント内に差し込む。

まずlocalにPlantUMLがインストールされている必要があるためインストールする。

brew install plantuml
PlantUMLをインストールする。

ob-plantumlをrequireして読み込む。

(require 'ob-plantuml)

PlantUMLのJarファイルへのパスを org-plantuml-jar-path に設定する5

(custom-set-variables '(org-plantuml-jar-path "/usr/local/Cellar/plantuml/1.2020.19/libexec/plantuml.jar"))

org-modeで書いたPlantUMLを画像にして差し込む。

以下のようにorgを記述し、 :file には出力するファイルのパスを指定する。

#+begin_src plantuml :file ./img/plantuml-example.png
,Bob -> Alice : hello
#+end_src

このブロックにポイントが有る状態で C-c C-c する(org-ctrl-c-ctrl-c)。

すると以下のような記述がorgの中に差し込まれる。

#+RESULTS:
[[file:./img/plantuml-example.png]]

次のコマンドを実行すると画像が表示される。

M-x org-toggle-inline-images RET
./img/plantuml-example.png
出力された画像

PlantUML Server - ローカルでも使えるPlantUMLのレンダリングサーバー

Emacs28ではCocoa版Xwidgetの実装が入った。 そのためバッファ上にWebkitを貼り付けることができる。 つまりEmacsがWebブラウザを取り込んだような状態だ。夢が膨らむ。

PlantUMLにはローカルで動作するPlantUML Serverがある。今回はそれを用いてEmacsからPlantUML Serverにアクセスする。

PlantUML Serverの起動

今回はDockerを使ってサーバーを起動する。

docker run -p 8080:8080 plantuml/plantuml-server:jetty

起動すると http://localhost:8080/ にアクセスできるようになる6

EmacsからPlantUML Serverにアクセスする

次のEmacsのコマンドを実行します。

M-x xwidget-webkit-browse-url RET

すると次のプロンプトが表示される。

xwidget-webkit URL:

アクセスしたいURL(今回は http://localhost:8080/) を入力する。

xwidget-webkit URL: http://localhost:8080/ RET

または以下をevalする。

(xwidget-webkit-browse-url "http://localhost:8080/")

Emacs上のWebkitにPlantUML Serverが表示された。

./img/plantuml-server-with-emacs.png
出力された画像

まとめ

EmacsでPlantUMLを使う方法をまとめた。 PlantUML用のEmacs メジャーモードであるplantuml-mode、 org-babelでorg-modeのドキュメントの中にPlantUMLを含めるob-plantuml、 PlantUML ServerとEmacsのXwidget Webkitを用いてレンダリングしながら編集する方法について説明した。

備考

この記事はEmacs Advent Calendar 202015日目の記事を元にリライトしたものである。 それではメーリークリスマス。

脚注


3

plu拡張子を開くと自動でplantuml-modeになる。

4

Emacs 24.1から。

5

筆者の環境では /usr/local/Cellar/plantuml/1.2019.1/libexec/plantuml.jar であった。このパスは環境によって異なる。

6

既にDockerの環境があればDockerを使う方が楽かと思うが、PlantUMLもPlantUML ServerもJavaで実装されているため、でDockerを使わない方法もそれほど難しくない。