VS CodeでPlantUMLのフォーマットを行うとインデントが崩れる場合の回避方法
TL;DR
複数行のノート(注釈)を含むコードをフォーマットする時は、of
を使って位置指定しろ。
イントロ
Visual Studio CodeのPlantUML拡張でシーケンス図をフォーマットすると、インデントがおかしくなることがありました。
気づいた後しばらく放置していたのですが、先日再現する(ほぼ)最小コードを用意できたので、Issueを立てました。
ところが残念なことに「フォーマットは非推奨である」とのことでクローズされてしまいました。
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
Discussion