UmaUmaCruise の育成ウマ娘一覧をウマ娘名でソートするための Vim スクリプトを書いた

# やりたいこと

これ↓を

![UmaUmaCruise_育成ウマ娘一覧_01_勝負服でソート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73432/97fa0a67-5868-3d4b-626c-7589479cab27.png)

こう↓したい。

![UmaUmaCruise_育成ウマ娘一覧_02_名前でソート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73432/f6899f1a-3a2d-f6b0-61c9-d477114b4bfd.png)


# やったこと

下記の Vim スクリプトと起動ファイルを書いた。

```vim:_swap_name.vim
e UmaLibrary\UmaMusumeLibrary.json
%s/"\(【[^】]\+】\)\([ァ-ヴー]\+\)"/"\2\1"/
wq!
```

```bat:_swap_name.bat
@echo off

vim -S _swap_name.vim
```

`vim` は [KaoriYa 版](https://www.kaoriya.net/software/vim/) のもの。



# 経緯

DMM版ウマ娘のイベント選択肢の効果を表示するツールに [UmaUmaCruise](https://github.com/amate/UmaUmaCruise) があります。
便利なツールですが、育成ウマ娘の一覧の並びがウマ娘の名前ではなく勝負服名 [^1] でソートされているため、育成ウマ娘を選択する時に不便です。
この件についての要望も何度か挙がりましたが、現状での対応予定はないようです。

[^1]: ツール上で「【レッドストライフ】ゴールドシップ」のように表示されてる【】内の文字列。多分勝負服を指してるはず。

- [[要望]育成ウマ娘の順番の変更 #89](https://github.com/amate/UmaUmaCruise/issues/89) 

> 育成ウマ娘の自動選択機能で充分なので実装しません
> どうしてもというなら、自身で UmaMusumeLibrary.json を編集して、二つ名とウマ娘名の場所を置換してください

育成ウマ娘の自動選択は育成シナリオ開始後に画面キャプチャを開始するとうまく機能しないので、正直なところ充分とは言い難いです。
とはいえそんなことを言っても改善されるわけではないのでユーザ側でできることをやります。
JSONファイルを修正すれば期待する動きになるようなので、その方向でやることにします。

**2022.01.10 追記**

コメントで UmaUmaCruise 製作者の @amate さんから指摘いただきました。

> 育成ウマ娘の能力詳細画面でスタートを押せば自動選択されます

とのことです。
実際に育成開始後に能力詳細画面を表示してスタートボタンを押したところ、自動選択されました。
UmaUmaCruise のトップページにも [使い方](https://github.com/amate/UmaUmaCruise#%E4%BD%BF%E3%81%84%E6%96%B9) の後半に記載があります。
目を通していたはずですが記載の操作で再選択できるということに意識が向いていませんでした。
先述の「充分とは言い難い」は撤回します。失礼しました :bow_tone1:



# `UmaMusumeLibrary.json` の仕様

`UmaMusumeLibrary.json` の内容は下記のようになっています。

```json:UmaMusumeLibrary.json
{
  "Charactor": {
    "☆3": {
      "【Creeping Black】マンハッタンカフェ": {
        "Event": [
          {
            "カフェはカフェでも": [
              {
                "Option": "『ミラクル☆ミルクカフェ』で",
                "Effect": "賢さ+10"
              },
              {
                "Option": "『モコモコ♪うさぴょんパフェ』で",
                "Effect": "スタミナ+10"
              }
            ]
          },
          :
          :
````

大まかに `Charactor` [^2] - レアリティ - 育成ウマ娘 - イベント情報という構成になっています (ファイル後半にはサポカの情報もありますが割愛)。
この内手を入れたいのは育成ウマ娘の名前＋勝負服の部分です。上記の場合は `"【Creeping Black】マンハッタンカフェ"` の文字列が該当します。
ここの育成ウマ娘の名前と勝負服の文字列を入れ替えれば OK です。

手動でやってもいいのですが、育成ウマ娘が追加されると `UmaMusumeLibrary.json` が更新されて、その度に文字列の入れ替え作業が必要になるので大変です。
スクリプトを実行したら全部入れ替えできるようになってると便利なので、そんな感じのスクリプトを用意します。

[^2]: 正：Charact **e** r 。


# sed は駄目だった

この手の処理は sed が得意なので使おうとしたのですが、[Windows 版の sed](https://sourceforge.net/projects/gnuwin32/files/sed/4.2.1/?sort=filename&sortdir=asc) は扱う文字コードが SJIS 固定のようで UTF-8 の `UmaMusumeLibrary.json` をそのまま加工するのは不向きです。

それなら事前に nkf で UTF-8 に変換すれば、と思って実際にやってみたのですが、今度は全角文字混じりの文字クラスが対象の文字列にマッチしませんでした。
具体的には、勝負服名の部分の文字列 `【...】` をマッチさせたくて `【[^】]\+】` というパターンを書くもマッチせず、という状況でした。
sed では文字クラスに全角文字列を含められないのかもしれません。
解決方法はあるかもしれませんが気力がなかったので未調査です。

Vim で試した時はマッチしたのでいけると思ったのですが残念です。
sed が駄目ならどうすれば… Vim ならいけるのに…。

Vim でいいのでは？🤔


# やはり Vim …！！　Vim は全てを解決する…！！

というわけで Vim スクリプトを書きました。

```vim:_swap_name.vim(再掲)
e UmaLibrary\UmaMusumeLibrary.json
%s/"\(【[^】]\+】\)\([ァ-ヴー]\+\)"/"\2\1"/
wq!
```

この Vim スクリプトは UmaUmaCruise のインストールディレクトリに配置する想定で、他のファイルと区別しやすいようにファイル名を `_` 始まりにしています。

1行目は `UmaMusumeLibrary.json` を開く処理です。

2行目がメインの処理で `UmaMusumeLibrary.json` 内の全文を対象に文字列の入れ替えを実行しています。
ウマ娘の名前の部分にマッチさせるためのパターンは「カタカナ＋長音記号」ということで `[ァ-ヴー]\+` にしています。
本当はカタカナを全て列挙するのが望ましいと思いましたが、面倒だった(＋これで動いた) のでサボっています。

3行目でファイルを保存して Vim を終了しています。


# Vim スクリプトの起動ファイル

先の Vim スクリプトを起動するためのファイルです。

```bat:_swap_name.bat(再掲)
@echo off

vim -S _swap_name.vim
```

**おしまり**