https://ikuma-t.work/posts/create-blog-command-3
前回の時点ではただファイルを生成するシェルスクリプトでしたが、今回思い切って一気に色々機能を追加しました。
というわけでできたものがこちら。
https://github.com/IkumaTadokoro/blog-cli
もともとRubyで書いていてThor gemで作ろうと思っていたのですが、インタラクティブなものを作るのが大変そうだったのと、2日前くらいから「Denoってなんかいいな」と思い始めたので、途中からDenoに切り替えて実装しました。
各機能を順番に紹介していきます。
実装
Third PartyにはcliffyというCLI用のフレームワークを使用しているのみです。
https://cliffy.io/
:::alert
追記: 嘘をつきました。[email protected] | Denoも使っていました。
:::
機能一覧
各機能紹介
設定: config
設定用のコマンドです。ブログ記事のあるパスを雑にJSONファイルにして保存しています。
補完:completions
cliffyのビルトインコマンドの1つで、各シェルの補完機能を提供します。
https://cliffy.io/[email protected]/command/build-in-commands#completions-command
私の場合はzshを使っているので、.zshrc
あたりに
と書いてあげることで、自動的に補完が使用できるようになります。
ブログを開く: open
ブラウザでブログを開きます。
一覧: list
デフォルトでは最新の記事5件を取得します。-a
オプション指定時には全て取得します。
表示するのは左から、
- ファイル名
- 記事名(YAMLフロントマターから取得)
- 投稿日(YAMLフロントマターから取得)
です。
出力はcliffyのTableを使用しています。
https://cliffy.io/[email protected]/table
日本語が全体的にダメで、ちょっとずれてしまっているんですが、実害がないので無視しています。
新規作成: new
タイトルとファイル名を指定して記事を作成します。
cliffyのInput promptにはlocal storageもしくは配列を使用して入力値をサジェストできる機能があります。
https://cliffy.io/[email protected]/prompt/types/input#auto-suggestions
シリーズものの記事を書く際に、以前の回の記事名などを参照することがあるので、過去記事を配列につっこんでカーソルキーで候補が出るようになっています。
編集: edit
ファイルを指定して編集します。エディタはオプションで指定できるのですが、デフォルトはvimです(たまにmi
で登録しているRubyMineで編集することがあります)。
cliffyのSelect promptにファイル名を投げて選択しているのですが、便利なのがenable-search-input
です。search: true
を指定することで、インクリメンタル検索ができるようになります。これはとても嬉しい…!
https://cliffy.io/[email protected]/prompt/types/select#enable-search-input
感想
とりあえず作ってみたんですが、候補から選択できるのがかなり便利ですね。
これを作成する前は、似たような記事を一度別で開いてコピーして…みたいなことをやっていたので、生産性めちゃくちゃ上がりました。
Denoはこれの前に練習として、deno-jpsumという、ダミー文作成メーカーLorem JpsumをCLI化したものを作っていましたが。
https://github.com/IkumaTadokoro/deno-jpsum
が、まだ仕様があまり頭に入っていないのと、そもそもTypeScript自体を最近始めたので、全体的にコードがお粗末です…。
とはいえ、Denoは標準でFormatterやLinterを提供しているし、TypeScriptも設定なしで使えるし、cliffyは多機能だし、CLIツールの開発体験としては非常によかったです。
今後もDenoやっていくぞ!