🆚

Zennの記事をほんの少しだけ楽に作成できるVimコマンド

2020/09/18に公開
7

Zennというプログラマーのための情報共有サイトが誕生したそうです.vim-jp SlackでもZennの話題でかなり盛り上がっています.
ローカルの好きなエディタで記事が簡単に書け,プレビューもできるというのは,Vimmerにとってはとても嬉しいことです.この記事もVim(正確にはNeovim)で書いています.楽しい!

記事をほんの少しだけ楽に作成できるVimコマンド

さて,Vim で少しでも快適にZennの記事を書き始められるようにするため,以下の ZennCreateArticle コマンドを作ってみました. Zenn CLI が導入済みであることを前提としています.

function! s:create_zenn_article(article_name) abort
  let date = strftime("%Y-%m-%d")
  let slug = date . "-" . a:article_name
  call system("npx zenn new:article --slug " . slug )
  let article_path = "articles/" . slug . ".md"
  exe "edit " . article_path
endfunction

command! -nargs=1 ZennCreateArticle call <SID>create_zenn_article("<args>")

これで,たとえば2020年9月17日にプロジェクトのルートからVimを開き,コマンドラインモードで ZennCreateArticle vim-zenn-command と打つと,2020-09-17-vim-zenn-command.md という名前のMarkdownファイルがarticles/ディレクトリ下に新規作成されます.
今までは

npx zenn new:article --slug 2020-09-18-vim-zenn-command

と打たなければならなかったものが, ZennCreateArticle vim-zenn-command だけでできるようになります!すごい!

実装はというと,ただ内部で npx zenn new:articleslug 指定付きで呼び出しているだけ.オプション等は何もなし.
呼び出しコマンドでエラーが起きたらどうするの?知りません.うーん,手抜き感がすごいですね.
まだVim scriptに全然慣れてないのに即興で作ったので…と言い訳させてください.後で色々改良するかもしれません.プラグイン化できればベストですが.

なぜこんなスラッグ名にしたのか?

CLIで記事を作成すると,記事のURLの末尾のスラッグと呼ばれる文字列を自由に決められます.スラッグの役割や命名規則については公式の Zennのスラッグ(slug)とは を参照.

  • スラッグはファイル名になる
  • スラッグはユニークでなければならない
  • スラッグは /[-a-z0-9]{12,50}/ のパターンの範囲内でなければならない(半角英数字とハイフンで12〜50字)

従って,スラッグは以下のような工夫をしたほうがよさそうです.

  • 一覧性のため,内容が推測しやすい名前をつける
  • 重複を避ける仕組みがほしい

そこで,私は article については当面 yyyy-mm-dd-(内容) という命名規則を用いることにしました.
12文字以上という制約は yyyy-mm-dd- という接頭辞となかなか相性が良く,また記事作成日の日付を付けることで重複をある程度防ぐこともできます.
このあたりは好みもあると思いますし,今後仕様変更がある可能性も考えられるので,お好みで.

Discussion

kkiyama117kkiyama117

はじめまして、突然すみません。
ただ今個人的にZennのVim Pluginを作成中の者なのですがこちらの関数(及びSlugのデフォルトの命名のアイデア)を拝借させていただいてもよろしいでしょうか?

monaqamonaqa

はじめまして.記事をご覧くださりありがとうございます.
もちろん大歓迎です!
もしそのプラグインをOSSとして公開される予定であれば,ぜひ私も使わせていただきたい/可能ならcontributeさせていただきたいと思います.

kkiyama117kkiyama117

ご返事及び許可を下さりありがとうございます.
https://github.com/kkiyama117/zenn-vim
とりあえずこちらにRepositoryを作ってみました. きちんとしたPluginを作ったことがなく不慣れなこともあり、まだ最低限のCommandのみですが、この記事のようなUtilitiesや非同期での処理の呼び出しを搭載する予定です.

monaqamonaqa

ありがとうございます!使ってみます.
教えていただいたプラグインを(もし差し支えなければ)vim-jp Slack コミュニティで紹介したいのですが,大丈夫でしょうか?

kkiyama117kkiyama117

まだ未完成なベーパーウェアですが、それでも大丈夫でしたら拡散,紹介はご自由にしていただいて大丈夫です.ありがとうございます!

kkiyama117kkiyama117

今更になりますが、上述のPlugin導入後に

  let g:zenn#article#slug = {
    \ "use_template": v:true,
    \ "format": "%F"
    \}
  command! -nargs=* ZennCreateArticle call zenn#new_article(<f-args>)

を設定し :ZennCreateArticle {slug} でこの記事と同様の動作をするようになったかと思います。
取り敢えず普通に需要がなさそうなpluginになってしまった気もするので、保守メインにしていく予定ですが、もしよければお試しください。
(slackでのご紹介ありがとうございます。自分がビビりなので紹介大変ありがたかったです。ROM専で申し訳なく思っていますが、#plugin で頂いた指摘を受け名前をzenn にしました。もしお使いになられる場合は zenn として落としてください。)