RaycastのScript Commandsでちょっとした便利な処理を実行する

Raycastはランチャーに分類されることが多く、さまざまなアプリを簡単に起動できます。
そして、さまざまな便利な機能を追加できます。
今回は「Script Commands」について紹介します。

この記事は[Raycast Advent Calendar 2024](https://qiita.com/advent-calendar/2024/raycast)に参加しています。

昨日は @sheepland さんによる「[Raycastで地味に便利な「単位がついた値」の計算](https://zenn.dev/akira_kuriyama/articles/d03b8f9280063d)」でした。

# Script Commandsとは

RaycastにはbashやApple Script、Python、Ruby、node.jsなどで記述したちょっとしたスクリプトを実行できる「Script Commands」という機能が標準で用意されています。

https://manual.raycast.com/script-commands

さまざまな人が作ったサンプルをGitHubで管理されており、自分が作ったものもプルリクエストを送ることで共有できます。

https://github.com/raycast/script-commands

ここから自分のRaycastの環境にインストールすると、プログラミングについての知識がなくても便利な機能を追加できます。
しかし、探すのも大変だし、欲しい機能が見つかるとは限りません。
そこで、自分で作ることを考えます。

自分で作るときは、Raycastから「Create Script Command」を呼び出すだけです。

![script_command.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309006/12d14bb9-7f47-6325-fa3f-9a43b88cd4e6.png)

ここでテンプレートやモード、タイトルなどを選ぶと、スクリプトが作成されます。

# サンプル1）重複を除外する

Script Commandがどれくらい手軽に実装できるかを知るために、簡単なサンプルを作ってみます。
まずは簡単な例として、コピーしたテキストデータから重複を除外することを考えます。

たとえば、次のようなデータがあったとします。

```text
A型
B型
A型
O型
B型
AB型
A型
O型
B型
A型
```

このようなデータから重複を除外し、次のようなデータを取得したいとします。

```text
AB型
A型
B型
O型
```

Excelなどの表計算ソフトを使う方法もありますが、シェルコマンドで除外することもできます。
たとえば、`blood.txt`というファイルに格納されているものを出力するのは、次のようなコマンドが考えられます。

```sh
$ cat blood.txt | sort | uniq
```

このようにファイルに保存してもいいのですが、コピーしたデータから処理することを考えます。
このとき、先頭の「`cat blood.txt`」という部分を「`pbpaste`」に変えると、コピーしたデータから処理できます。

さらに、ターミナルなどを開かなくてもいいように、Raycastから手軽に実行することを考えます。

## RaycastのScript Commandsで実装する

Raycastから実行するには、Script Commandsを使います。

今回は上記の「Template」の欄で「Bash」、「Mode」の欄で「Silent」、「Title」の欄で「unique」を設定します。
この「Silent」というのは実行結果をRaycastの画面に何も表示しないものです。

その他は適当に設定して「Command + Enter」で作成します。
すると、指定したフォルダ（私はiCloudのRaycastフォルダ）に「unique.sh」というファイルが生成されました。

### 生成された内容を確認する

生成されたファイルを見ると、次のようになっています。

```unique.sh
#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title unique
# @raycast.mode silent

# Optional parameters:
# @raycast.icon 🤖

# Documentation:
# @raycast.author masuipeo
# @raycast.authorURL https://raycast.com/masuipeo

echo "Hello World!"
```

この「`@raycast.icon`」のところではアイコンを指定できます。
また、最終行に記述されているものが実行される内容で、今回は「Hello World!」という文字を出力する処理だけが書かれています。

このScript Commandを実行するには、Raycastを起動して「`unique`」と入力します。
問題なく「Hello World!」という文字が表示されることを確認しておきましょう。

### 編集する

この最終行にある「`echo "Hello World!"`」の部分を次のように編集します。

```sh
pbpaste | sort | uniq | pbcopy
```

この「`pbpaste`」はクリップボードから取得する処理、「`pbcopy`」はクリップボードに出力する処理です。
このため、上記のような血液型のデータをコピーしてから、Raycastで実行すると、重複を除去されたものがコピーされます。

これで、重複を手軽に除去できるようになりました。

# サンプル2）合計を計算する

他にも便利な例として、合計を計算する処理を作ってみます。

たとえば、次のようなデータがあったとします。

```text
734
251
869
530
173
```

このようなデータを合計し、「2557」という値を出力したいとします。

これを実行するとき、AWKというプログラミング言語を使います。
macOSにはAWKが標準で搭載されており、`data.txt`のようなファイルに保存されていると、ターミナルなどで次のように実行することで、合計を計算できます。

```sh
$ cat data.txt | awk '{s += $1} END {print s}'
```

## RaycastのScript Commandsで実装する

これではデータをファイルに保存しておく必要がありますが、コピーしたデータを使って処理することを考えます。
今回はRaycastの「Create Script Command」を実行し、「Template」の欄に「Bash」、「Mode」の欄に「Compact」、「Title」の欄に「sum」を設定します。
この「Compact」はRaycastのウインドウ下部に小さく表示するものです。

その他は適当に設定して「Command + Enter」で作成します。
すると、指定したフォルダ（私はiCloudのRaycastフォルダ）に「sum.sh」というファイルが生成されました。

生成されたファイルを見ると、次のようになっています。

```sum.sh
#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title sum
# @raycast.mode compact

# Optional parameters:
# @raycast.icon 🤖

# Documentation:
# @raycast.author masuipeo
# @raycast.authorURL https://raycast.com/masuipeo

echo "Hello World!"
```

先ほどとの違いは「`@raycast.mode`」が「`compact`」になっているだけです。

### 編集する

この最終行にある「`echo "Hello World!"`」の部分を次のように編集します。

```sh
pbpaste | awk '{s += $1} END {print s}'
```

これで、上記のような数値データをコピーしてから、Raycastで「`sum`」というコマンドを実行すると、合計が画面に表示されます。

![sum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309006/72affadd-5280-9f3c-eec0-21cee7cbeff5.png)

これで、手軽に計算できるようになりました。

# まとめ

このように、ワンライナーのプログラムであれば、とても簡単に作れることがわかります。
普段、よく実行するコマンドがあれば、ぜひ試してみてください。
アイデアが思いつかないときは、冒頭のGitHubのリポジトリを探すと、便利なものが見つかるはずです。