🎃

VS CodeでPlantUMLのフォーマットを行うとインデントが崩れる場合の回避方法

2 min read

TL;DR

複数行のノート(注釈)を含むコードをフォーマットする時は、ofを使って位置指定しろ。

イントロ

Visual Studio CodeのPlantUML拡張でシーケンス図をフォーマットすると、インデントがおかしくなることがありました。

気づいた後しばらく放置していたのですが、先日再現する(ほぼ)最小コードを用意できたので、Issueを立てました。

https://github.com/qjebbs/vscode-plantuml/issues/386

ところが残念なことに「フォーマットは非推奨である」とのことでクローズされてしまいました。

Formatting PlantUML code is Deprecated, for the same reason why I gave up on syntax highlighting: regexp won't work on such flexible language.

修正される見込みは無く、私自身も直せそうにないので、何とか回避策を探っていきたいと思います。

バージョン

  • Visual Studio Code: 1.54.3
  • PlantUML拡張: 2.14.4

問題となるコード

下記のような noteを含んだ コードは、フォーマットするとインデントが崩れます。

現時点ではちゃんとPlantUMLでレンダリング可能です。

@startuml
group SomeGroup
    Alice->Bob : hello
    note left Alice
        this is a first note
    end note
    Bob->Alice : ok
end

Bob->Bob : I am thinking
note left
    a note
    can also be defined
    on several lines
end note
@enduml

フォーマット後のコード

途中からインデントがおかしくなってます。

@startuml
group SomeGroup
    Alice->Bob : hello
    note left Alice
    this is a first note
end note
Bob->Alice : ok
end

Bob->Bob : I am thinking
note left
a note
can also be defined
on several lines
end note
@enduml

回避方法1

よく見ると、note left Aliceとなっています。
PlantUMLのサイトの記述では、note <align>の後にofがあります。

レンダリングされていたので気づかなかったのですが、 ofをつけ忘れていたようです。

ofを付けましょう

誤り

    note left Alice
        ...
    end note

変更後

    note left of Alice
        ...
    end note

回避方法2

回避方法1を行った後でフォーマットしても、今度はまた別の壊れ方をします。

@startuml
group SomeGroup
    Alice->Bob : hello
    note left of Alice
        this is a first note
    end note
    Bob->Alice : ok
    end

    Bob->Bob : I am thinking
    note left
        a note
        can also be defined
        on several lines
    end note
    @enduml

2個目の複数行ノートでは、そもそも位置指定がありません。

    note left
    ...

これはPlantUMLのサイトではこれは正しいコードなのですが、どうやらこれが悪さをしているようです。

位置指定をするとレンダリング結果が微妙に変わるのですが、ほぼ影響はないので位置指定しちゃいましょう。

無事にフォーマットが動くようになりました。

@startuml
group SomeGroup
    Alice->Bob : hello
    note left of Alice
        this is a first note
    end note
    Bob->Alice : ok
end

Bob->Bob : I am thinking
note left of Bob
    a note
    can also be defined
    on several lines
end note
@enduml