Clipyで保存されたスニペットをどこでも使えるように

@econa77さんが2015年リリースしたクリップボード拡張Macアプリ「Clipy」はこの２年間世界中の人気を集まりました。私は去年から**[Clipy Mateプロジェクト](https://github.com/jerrywdlee/clipy-mate-core)**を開発始めたが、多忙でずっとリリースできませんでした。
今回はかの有名な[Settings Sync](https://github.com/shanalikhan/code-settings-sync)をヒントに、ClipyのスニペットをGistを通してSyncするアプリを作成しました。

# Demo
![clipy-mate_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/498370ad-d304-3fd5-32e2-31f888d5d4a7.gif)


# GitHubレポジトリ
https://github.com/jerrywdlee/clipy-mate-cli


# システム要項
- MacOS 10.10 and over
- Clipy v1.2.0 and over
- Node.js v8.9.0 ~ v10 ([Realm](https://www.npmjs.com/package/realm)はnode v12には対応していません)

# インストール
## Globalインストール
```bash
$ npm i -g clipy-mate-cli
$ clipy-mate
```
こうすれば `clipy-mate` コマンドを使えるようになります。


## `npx`で実行
```bash
$ npx clipy-mate-cli
```

機能は上記 `clipy-mate` コマンドと変わりません。

# 使い方
## GitHubのTokenの発行
1. [GitHub](https://github.com/)のアカウントを作成してログイン
2. **[このページ](https://github.com/settings/tokens/new)**にアクセス
3. **「Note」**欄に適当な名前を記入する、例えば「Clipy-Mate」
4. 下にスクロールして、**「gist」**というチェックボックスをチェック
5. 一番下の**[Generate token]**ボタンをクリック
6. 生成されたTokenをコピーしてメモしておく

<img width="715" alt="fig-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/93c89fc3-afa2-9c84-0a01-e4e5762995ed.png">
<img width="715" alt="fig-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/a74efd79-089a-a219-ff86-e1781d462bf1.png">
<img width="725" alt="fig-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/fc8e7738-12ff-21f8-d569-028cbda3475a.png">
<img width="777" alt="fig-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87438/2d9ff71a-d0e8-059d-3149-185716d7f3e2.png">

## 対話式UIを使う

`npx`を使う場合、下記の `clipy-mate` コマンドを　`npx clipy-mate-cli` コマンドと置き換えば実行できます。

```sh
$ clipy-mate
```

### 初期化
最初の一回はGitHub Tokenを聞かれるので、先ほどメモしたTokenを記入してください。
Gist IDが聞かれた時、空欄で進むと、新しいGistが作成されます。
[![asciicast](https://asciinema.org/a/IOy5n18cEipHVcaye6ocrR1dt.svg)](https://asciinema.org/a/IOy5n18cEipHVcaye6ocrR1dt)

### スニペットのアップロード
新規作成されたGistの場合、まずローカルのClipyのスニペットをアップロードしてから使えます。
[![asciicast](https://asciinema.org/a/iHafYV2T778U2NpWrrFgoMJa4.svg)](https://asciinema.org/a/iHafYV2T778U2NpWrrFgoMJa4)

### スニペットの同期
Gistから、保存されたスニペットを読み込み、ローカルのClipyを更新します。
同じIDのスニペットが更新されます。ローカルに存在しないスニペットが作成されます。
[![asciicast](https://asciinema.org/a/EH7s2Jck0VHgtDbeZKFptFz2H.svg)](https://asciinema.org/a/EH7s2Jck0VHgtDbeZKFptFz2H)

### Clipyの初期化
ローカルに保存されたスニペットを全部削除して、Gistに保存されたスニペットに置き換えます。
[![asciicast](https://asciinema.org/a/ryK1bbxkQgvEsbQfwVq2cWQts.svg)](https://asciinema.org/a/ryK1bbxkQgvEsbQfwVq2cWQts)

## コマンドラインで使う
コマンドラインで使う場合、Cronに登録して、定期実行することも可能です。

`npx`を使う場合、下記の `clipy-mate` コマンドを　`npx clipy-mate-cli` コマンドと置き換えば実行できます。

```sh
# helper
$ clipy-mate --help

# Create or Update GitHub Settings
$ clipy-mate -e -t <YOUR TOKEN> [-g <YOUR GIST ID>]

# Upload Clipy snippets
$ clipy-mate -u
# Or
$ clipy-mate --upload
# Or
$ clipy-mate upload

# Download and merge Clipy snippets
$ clipy-mate -m
# Or
$ clipy-mate --merge
# Or
$ clipy-mate merge

# [Danger!] Download and Reset local snippets
# It will delete all local snippets
$ clipy-mate -f
# Or
$ clipy-mate --force
# Or
$ clipy-mate force
```

# Configファイル
Configファイルは下記の場所に保存されています。

```
$HOME/.clipy-mate-cli/settings.json
```

# Gistの構造
`<YOUR_NAME>/ClipyMateCli` というGistが作られますが、その中身は下記のようです。

- `ClipyMateCli` はスニペットのアップロード時間などの情報を保存しています
- `clipySnippets.json` はClipy Mateが読み取るスニペット情報ファイルです
- `clipySnippets.xml` は上記ファイルのXML版、Clipyの「インポート」機能で導入できます

# 既知のBug等

- Clipy v1.1.2以下を使う場合、Clipyが起動している間、`default.realm`の操作はできないため、必ずClipyを終了してから操作を行います。Clipy v1.2.0以上であれば、そんな問題が存在しません。
- スニペットを更新した場合、Clipyを再起動しないと「スニペットを編集」で反映されない問題があります。
- Clipyのデータを読み取るためのライブラリ[Realm](https://www.npmjs.com/package/realm)は、nodejs v12に対応していないため、node v10系がおすすめです。[参考](https://github.com/realm/realm-js/issues/2418)
- ~~`merge`を使うとき、同じIDのfolderが存在する場合、正しく中身がMergeされない問題が存在します。~~ **[v0.4.0](https://github.com/jerrywdlee/clipy-mate-cli/releases/tag/0.4.0)**で修復しました

# 参考
- [クリップボード拡張Macアプリ「Clipy」を公開しました](https://qiita.com/econa77/items/1848bf3fdfb7127ca9b8)
- [Clipyをnode.jsで触るライブラリを作りました](https://qiita.com/jerrywdlee/items/276959193735fe2bd02e)