もうLinux版Stationがアップデートされても.desktopを書き直したくない人へ


概要

Stationというウェブサービスの統合管理アプリをlinuxで使おうとしたところ,AppImageファイルで,メニューの登録がうまくいかず,Stationが更新されるたびに.desktopファイルを書き換えなければメニューやドックのStationをクリックしても反応しない(アプデによりAppImageの名前が変更されパスが通らないため).そこで正規表現を使って,StationがアプデされてAppImageの名前が変わっても,.desktopをいじらなくて済むようにするために頑張ったという話です.
長くて文章下手ですみません.需要もないと思うけどよろしくお願いします.

Stationを使おう!

はwebサービスを統合管理できるアプリで,これさえあればslackもgmailもgithubもqiitaも一つのアプリのタブで管理できます.
管理できるアプリはすでに用意されている約100個の他に,自分で登録することもできます.基本的に,ウェブサイトがあるwebサービスは登録可能です.(Lineみたいにchromeの拡張機能などは不可).
ぼくのStationはこんな感じです!

Stationの何よりの魅力はwindows,macのみならずlinuxも対応しているところ!
AppImage方式を使っているので,ダウンロードすればすぐに使えます.

AppImageって?

AppImageの説明をわかりやすくされているサイトがありましたのでこれにおまかせします.簡単に言えばaptとか使わなくてもアクセス権限さえチェックボックスにチェックを入れればダブルクリックでアプリケーションが起動できます.めっちゃ簡単!!

AppImageの問題

Stationの場合ですが,手動でメニューを登録するのが非常に面倒だということです.先ほど紹介したサイトのとおり,Stationの初回起動時にメニューに登録するか聞かれますが,ここでスルーしてしまうと最悪な自体になります.このメッセージは金輪際出現せず,Stationを開くときに毎回毎回AppImageを保存したフォルダまで行く必要があります.
手動でメニュー登録するには.desktopという拡張子を持つファイルを作成する必要があります.

.desktopでメニュー登録

まず.desktopのディレクトリは/home/.local/share/applicationsです.初回起動時にうまくメニューが作成できた人は,browserXなんちゃら.desktopみたいなファイルがあると思います.ない人は,Station.desktopなど好きな名前で.desktopという拡張子を持つファイルをこんな感じで作成してください.

station.desktop
[Desktop Entry]
Name=Station
Comment=Station
Exec="/{path_to_station}/Station-1.61.0-x86_64.AppImage" %U
Terminal=false
Type=Application
Icon=appimagekit-browserx
StartupWMClass=Station
MimeType=x-scheme-handler/station;

ここで,Execに記述されるものが実行コマンドになります.ダウンロードしたAppImageのファイルを実行させてあげます.
このファイルを.local/share/applications内においておくと,メニューが登録され,ドックに登録することも可能となります.

Stationが自動でアップデートされるとメニューが機能しない

Stationはアップデートされると,AppImageの名前の中にあるバージョン情報が書き換わります.先程の記述ではAppImageはStation-1.61.0-x86_64.AppImageでしたので,バージョンは1.61.0です.これがアップデートによってAppImageの名前が変わるということは,.desktopファイルで実行しようとしても該当するファイルがなくなってしまうため,メニューが機能しなくなります.そのため,Stationのアップデートが行われるたびに.desktopのExecの参照ファイル名を変更しなきゃいけないという非常に面倒な状況に陥ります.
そこで,正規表現でもつかって,いちいち.desktopを書き直さなくてもいいようにしようというのがここからの話です.

対策

.desktopの実行コマンド内でワイルドカードをきる!

試行錯誤の結果たどり着いた結果,Execで直接正規表現を使った記述を行うことは無理だという結論に達しました.(違ったら教えてください)
そこで,Execでshellを実行する体にして,実行するshell内に正規表現を用いた記述にすればいいんじゃね?って感じで試したらうまく行きました.正規表現を使うところはStation-x.xx.xのxの部分です.本当は\dとか使えるはずだろうけど,shellの中だとワイルドカードの方が確実に動いたので,Station-*.*.*っていう感じで記述しました.
全体のソースはこんな感じです.
無事うまく動きました!

station.desktop
[Desktop Entry]
Name=Station
Comment=Station
Exec=sh -c "/{path_to_station}/Station-*.*.*-x86_64.AppImage"
Terminal=false
Type=Application
Icon=appimagekit-browserx
StartupWMClass=Station
MimeType=x-scheme-handler/station;