Zenn Cli extension for vim

公開:2020/10/11
更新:2020/10/11
3 min読了の目安(約2700字IDEAアイデア記事

Zenn Cli extension for vim

初投稿です.

はじめに

皆さんは @monaqa さんの こちらの記事を読まれたでしょうか?
簡単に言いますと,
"github管理の際の zenn 記事の slug を分かりやすくしつつ記事を生成しよう"
という話になります.

これを読み、Pluginとして Zenn Cli のwrapperを作成しましたが、
「deolや:termで雑に一個動かした方が早い説も無きにしもあらず、ましてやUserおらん・・・?」
となりましたので、ここに供養及び(他の方の二度手間を防ぐ意味で)紹介、という事で記事を書きます。

repository

motivation

  • vim からzenn-cliのプレビューを呼び出したい.
  • 記事作成のコマンドを雑に呼び出したい.

機能

  • zenn-cli 及び npmの初期設定の自動化
  • 非同期処理
  • 関数のみの提供
  • slugの接頭辞の日付によるテンプレート提供

各機能の簡単な説明

npm及びzenn-cliの初回起動時処理

それぞれ node_modules, node_modules 内のzenn-cli, articles等の各フォルダ の有無を関数の呼び出し時に確認し、無い場合に必要な処理を行います。

非同期処理

vim-jp の偉大な功績の一つである、 vital-vim, Alisue さんのvital-whiskyを利用することで、非同期処理に対応しました。 他にもslug接頭辞のformatにもvitalDateTime を利用しています。
蛇足になりますが、非同期処理処理の為に始めpynvimを使いsubprocess等からnpmコマンドを叩いていましたが、この際何も考えずに呼び出すとPythonがCPUのシングルコアしか使ってくれないことからこの方法を回避する事にしました.ここら辺もきちんとマルチスレッド処理等をすればよいのでしょうが、python, npm(zennのpreview server)それぞれのプロセスの包括的な管理、という話になってくると厳しいものがあると思うので、適切な実装はその辺りに詳しい方に譲りたいと思います。

関数のみの提供

各個人流儀があり、コマンドから呼ぶ人やキーバインドで呼ぶ人等、様々いると思いましたので関数の提供のみになっています。
僕のお世話になっているvimのpluginではこういった形のものが多いので合わせた形になります。
現状、zenn-cliに合わせ, update new_article new_book preview stop_preview の提供となります.

記事作成テンプレート

zennでは記事に固有のSlugというものが付与されています。
こちらは基本的に自動生成のuuidのようなものになっていますが、一方でzenn-cliとgithubでの管理に限り、現状自由な名前をつける事が出来るようになっています。
これを受けて はじめに でみた記事のような事が要望として出るわけです.
今回、そちらの記事内の接頭辞の処理を拡張し、 vitalDateTimeformat関数のフォーマット形式に合わせて指定が出来るようにしました.
g:zenn#article#slug, g:zenn#book#slugを以下のような形で用意する事でフォーマットが有効になります.(どちらも同じ形式での指定になります)
この際、代わりにzenn-cliのslug自動生成を切っていますので、 12~50字の指定に引っかからない様に適切な引数を渡してください。

formatではなくstrfttime の指定も可能になっています.

  " same prefix from command in monaqa's article
  const g:zenn#article#slug = {
    \ "use_template": v:true,
    \ "format": "%F"
    \}

ライセンス

今の所取り敢えずGPLv3を付けています。今後公式が「これやめろ」だったり「これの権利うちにくれない」だったり、何かしらの事があった場合ライセンスの変更や公開の停止があるかもしれません(一億円が降ってくるよりも可能性が低いと思っていますが).
その際は既に公開されているバージョンについてはGPLv3、その後のバージョンについては新しいライセンスになります。万に一度もないとは思いますが悪しからず。よろしくお願いします。

おわりに

筆者はこれが初めてのpluginでしたので高速化や最適化等も不十分なものになっているかと思います.
完全に余談ですが, 私はコミュニティに入るのに半年ROMらないとビビって何も言えない, 自分の作ったものを公開するのも苦手な貧弱な人種です。故にこの記事のslugは"20200923-test1"になっていますし, vim-jpの公開ログをみてこっそりpluginの名前をzennに変えました.
(@monaqaさんが#plugin チャンネルにこのプラグインを紹介してくださりました。大変感謝です。)

ですが、今回公開をしたわけですから、学びを得次第、適宜変更・修正をしたいと思いますので、「これダメじゃん」「こんなんどう」等々ありましたら、
githubのissueかコメント欄までお願いします.