Dash.appのスニペットをよく使うという話をこないだ書きました。

Dash.appへのスニペット登録例を紹介 - PIYO - Tech & Life -
ドキュメントツールのDashですが、スニペット機能もありますよね。Dashが出た当初はむしろスニペット機能のために使っていました。 普段からス

この中で紹介している、クリップボード文字列を含めて展開するスニペットの一部がGooglePhotoの画像のURLよっては動かない場合がありストレスに思っていたので調べてみました。

こんな現象がおきました

;asinというスニペットの例で紹介します。

;asinはamazonへのリンクをはるためのスニペットで、このようにHugoのショートコードに展開されます。XXXXXのところはコピー済の文字列です。

{ {< amazon asin="XXXXXXXX" >}}
(↑本来はスペース要らないですが、ショートコードに解釈されちゃうので空けてます。以下同じです。)

(本来ASINとして正しい値ではないですが、)abcdeという文字列をコピーした状態で;asinとタイプします。

すると、次のように展開されます。

{ {< amazon asin="abcde" >}}

これが想定通りの動き。

次に、abcde__fgh__ijkという文字列をコピーして;asinとタイプすると、次のようになります。

こんな感じのウィンドウが出てきて、そのまま決定すると次のようになってしまいます。

{ {< amazon asin="abcdefghijk" >}}

アンダーススコアの部分がなくなってしまいました。

このとき出るウィンドウはDash.appのプレースホルダーを使ったスニペットをトリガーしたときに現れるウィンドウと同じです。

Dash.appのプレースホルダー

名前: __name__
メールアドレス: __email__

もう一回名前: __name__

みたいなスニペットがあったときに、アンダースコア2つで囲んだ部分を変数としておいて、スニペット展開じに入力できる仕組みです。このとき同じ変数には同じ値を入れることができます。

実際に↑のスニペットを展開して名前部分を変更すると二箇所同時にプレビューされていくのがわかります。

さきほどのabcde__fgh__ijkという文字列の場合、アンダースコア2つ囲みの文字列がプレースホルダー変数として解釈されてまったのが原因だったようです。

回避策

今回はアンダースコア2つで囲まれた部分が問題となりました。

幸いDashには設定箇所があるので、自分の用途では発生しにくい文字列をプレースホルダーとして判別するための条件としておけば回避可能です。

Google PhotosのURLには__はあっても、____(アンダースコア4つ)に囲まれている文字列はほぼ含まれないので、そのように変えておきました。