はじめに
こんにちは、鈴木商店のDidyです。
社内業務改善の一環として、Esaに記事をCLIから投稿するツールを作りました。
議事録や日報、メモ書きなどを書き記す場所として情報共有ツールのesaを業務で活用しています。
見やすい! 書きやすい! 使いやすい! の3つが揃った文句なしのサービスです。
しかし、基本的にはVimとターミナルで作業しているので、実際にはローカルで編集を行い、内容をesaにコピー&ペーストして、プレビューを表示することを繰り返しながら記事を書いています。
何度もvimとesaを行き来するのは手間がかかります。そこで、記事を投稿できるCLIツールの作成し、マークダウンプレビューを用意することで、ローカルで編集作業ができる環境を整えました。
本記事で、作成したツールを軽く紹介しようと思います。
esaに記事を投稿するCLIツール – esa-cli-rs
esaに不満はありません!が、Vimのキーバインドはとても便利です。
テキストを編集するとき、Vimのように操作できたらいいなと思うことがよくあります。
そこで!どうにかしてターミナルで記事を編集できないか調べてみました。
すると、同じような理由で実際にCLIツールを作っている方がいました。
このツールを確認したところ、いくつか気になる点はあるものの、必要だと思う機能は備えていることがわかりました。
ただし、記事番号でディレクトリを管理し、パラメータごとにファイルを作成するのは直感的でないため気になりました。
管理方法はesaのような階層構造が良いと思うので、以下のような方法でローカルで記事を管理しつつ投稿できるCLIツール(esa-cli-rs)を作りました。
- フォルダをカテゴリとして扱う。
- ファイル名は記事名として扱う。
- 記事番号、WIP、タグの情報は、記事のフロントフッターに記入する。
以下は、esa-cli-rsでローカルに記事を作成と投稿する例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ esa-cli create Users/didy_suzukishouten/blog/2022-07-01-自己紹介 $ echo "Here is Body" >> Users/didy_suzukishouten/blog/2022-07-01-自己紹介.md $ cat Users/didy_suzukishouten/blog/2022-07-01-自己紹介.md +++ tags = [] wip = true +++ Here is Body $ esa-cli push Users/didy_suzukishouten/blog/2022-07-01-自己紹介.md ok: Users/didy_suzukishouten/blog/2022-07-01-自己紹介 to https://team.esa.io/posts/1 |
カテゴリは、ディレクトリの Users/didy_suzukishouten/blog
です。
記事名は、ファイル名から拡張子を除いた 2022-08-10-自己紹介
になります。
tags, wip はファイルのフロントフッターにYAML形式で記入します。
この記事をesaに投稿した際に、記事番号であるnumberがフロントフッターに追加されます。
設計思想は違いますが、使い勝手に差が出ないように作りました。
コマンド
esa-cli create [CATEGORY/]NAME
- ローカルに新しい記事ファイルを作成します。
esa-cli push FILE_PATH
- 指定したローカルの記事ファイルをesaに反映します。
esa-cli fetch [--name [CATEGORY/]NAME | --number POST_NUMBER]
- esaの記事をローカルに取得します。
- –nameと–number は指定した記事を取得する。無指定の場合は、ユーザーに関する記事を全て取得する。
esa-cli attach IMAGE_PATH
- 添付ファイルをアップロードし、アップロード先のURLを取得します。
環境変数
ESA_API_KEY
- APIアクセストークン
ESA_TEAM
- チーム名
ESA_USER
- ユーザー名
glow.nvim
さて、記事を作成し投稿するためのツールを作成したので、次のステップはマークダウンプレビューを用意することです。
プレビューを表示するためのプラグインはVimでも存在します。
今回は以下のライブラリを使用します。
こちらのプラグインを入れた事で、esaの記事を作成、投稿する環境が整いました。
開発言語とライブラリの紹介
最後に開発言語とライブラリを軽く紹介して終わります。
esa-cli-rsはRustで開発しました。
今回は開発する上で以下のツールを利用しました。
メインツール
- rust-analyzer
- cargoパッケージマネージャー。プロジェクトの作成、ビルド、実行などなど。今回の開発で初めて使ったのですが、以下のコマンドは便利でした。
- addコマンド: Cargo.toml マニフェスト ファイルに依存関係を追加します。実行するだけでCargo.tomlに追加してくれます。
sh
$ cargo add clap -F derive - clippyコマンド: 間違いなどを警告してくれるlintです。
coc-settings.json
に以下の行を追加する事で対応。 - clippyコマンド: 間違いや最適な書き方を通知してくれるツールです。Vim+coc.nvimを使っているので、
coc-settings.json
に以下の行を追加すれば、作業中に教えてくれます。
sh
"rust-analyzer.checkOnSave.command": "clippy"
- addコマンド: Cargo.toml マニフェスト ファイルに依存関係を追加します。実行するだけでCargo.tomlに追加してくれます。
主なな使用ライブラリ
- reqwest: HTTPリクエスト
- clap: コマンドラインパーサー。
- toml: TOMLのシリアライズ/デシリアライズ。TOML記事のフロントフォーマッターの読み込みに使用
- serde_json: JSONのシリアライズ/デシリアライズ。HTTPクライアントのレスポンス結果の読み込みに使用
- thiserror: 独自エラーのためのライブラリ
-
anyhow: エラー変換とエラーマクロ
- 参考文献
- igagurimk2の日記 – clap v3 のdriveベースのパースのサンプル
- 電気ひつじ牧場 – Rust エラー処理2020
- Zenn – thiserrorでカスタムエラーを実装する
- Zenn – Rust/AnyhowのTips