BetterTouchToolに選択中のテキストの文字数を数えさせてUHDオーバーレイ表示させる

## はじめに
先日はBTTを使ってPDFの無駄な改行を消してコピーする方法に関する記事を書きました。

https://qiita.com/kompeki/items/977f33c1244da0b2762c

この記事の最後で、「選択範囲の文字数をカウントしてコピーすることもできるね」ということを書いたのですが、BTTの機能をフル活用すればもっと便利に実装できることに思い当たりました。

本記事では、文章の文字数を数えたいときに、選択してショートカットキーを押すだけで画面にUHDオーバーレイで文字数が表示される機能を実装してみようと思います。
プレゼン原稿の文字数確認や、就活のES作成などに役立つのではないでしょうか。

## BTTの変数の操作
前回の機能の実装時に、「Text Actions」の中に「選択したテキストを変数selected_textに保存します」というアクションがあり、気になっていました。
変数に保存できるということは、変数から取り出して何かできるということだと思ったのです。
公式ドキュメントを覗いてみると、BTT内の変数にアクセスする方法について記述がありました。

https://docs.folivora.ai/

Scripting BetterTouchToolの欄を覗いてみると、各言語でのBTTでの操作の仕方について記載があります。今回はJavaScriptで操作を行います。

また、Available BetterTouchTool Scripting Interfacesに、利用可能な関数が列挙してあります。今回は変数を操作してみたいわけですが、覗いてみると......
```get_string_variable```
```set_string_variable```
という、いかにも使えそうなものがありました。下の方に使用例があるので、それを参考にコードを作成してみます。

使用例：
 ```JavaScript
 // get_string_variable
 (async ()=> {

let result = await get_string_variable({variable_name:'BTTActiveAppBundleIdentifier'})
returnToBTT(result);

})();
 ```
```JavaScript
 // set_string_variable
 (async ()=> {

let result = await set_string_variable({variable_name: 'test', to: "this is a test value"});
returnToBTT(result);

})();
 ```

 ## 選択したテキストの文字数をカウントして表示してみる
 ここからが実装です。
 今回は
 1. 選択中のテキストを```selected_text```に保存する
 1. JavaScriptを実行し、```selected_text```の値から、文字数を計算して```selected_text_length```と```selected_text_length_no_space```に保存する
 1. UHDオーバーレイから変数の値を参照して、画面に表示する

 という3つの操作をまとめたショートカットを作成して、ワンタッチで文字数を表示するショートカットを作成してみます。
 ### ショートカットとアクションを設定する
 まずはじめに、お好きなショートカットを選択して、アクションには
 * 選択したテキストを変数selected_textに保存します
 * Run Real JavaScript
 * HUDオーバーレイを表示

 の3つを順に設定してください。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661623/fa9065cf-3c93-0d5d-cd16-4d4f9891d03a.png)

### 各アクションの設定をする
それぞれのアクションの設定をしていきます。
#### 選択したテキストを変数selected_textに保存します
特に設定項目はない（そもそもない）のでそのままで大丈夫です。
#### Run Real JavaScript
このアクションで、```selected_text```の文字数をカウントしていきます。
特に設定は変更せず、Scriptを記入する部分に下記のコードを記入してください。
```JavaScript
(async ()=> {
let str = await get_string_variable({variable_name:'selected_text'});
let result = await set_string_variable({variable_name: 'selected_text_length', to: String(str.length)});
result = await set_string_variable({variable_name: 'selected_text_length_no_space', to: String(str.replaceAll('\n','').replaceAll(' ','').length)});
returnToBTT(result);
})();
```
スクリプト内では、```selected_text```を取得し、その文字数を数えて```selected_text_length```に格納するとともに、せっかくなので改行スペースを除いた文字数を```selected_text_length_no_space```に格納しています。
（今回は簡単に```length```で文字数を数えていますが、正確に数えたい場合はある程度工夫が必要になります。）
参考：

https://qiita.com/suin/items/3da4fb016728c024eaca



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661623/910c593b-a2bf-bc8a-5034-ce99ef679076.png)

#### HUDオーバーレイを表示
HUDオーバーレイでは、```{}```で囲むことによって変数を含むことができます。
今回は
```
{selected_text_length}
({selected_text_length_no_space})
```
とでも入力してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661623/d7e04903-7728-0e01-b228-05a13f3bc958.png)

## 結果
選択した文字数をワンタッチでカウントして表示させることができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661623/c8b01774-ba38-73e3-3214-53d3209a5eb7.png)

## おわりに
今回はBTTで選択中の文字列の文字数をカウントして表示する機能を実装してみました。
BTTはトラックパッドやマウスのカスタマイズのみならず、色々なことができるのだなと再確認しました。
この変数の機能は他にも多くの応用が効きそうですので、みなさんぜひ自分のニーズに合った機能を実装してみてください！