スニペットコードを管理、構築するシェルみたいなコマンド「Cap」

325, 2020-05-19

目次

シェルの I/F を持ったスニペットマネージャー

Cap」というシェルみたいな I/F とテンプレートエンジンを持ったスニペットマネージャーを作っています。
基本的な使い方は環境で cap を実行できるようにして、シェルやエディタから実行します。

$ cap

Cap をエディターから実行する SublimeText3 と VS Code, Vim 用のプラグインも自作しました。

作ってる経緯

私は Window と Linux を行ったり来たりしていて、エディターも気分ですぐに変えるので、スニペットコードなどのコード資産が溜まりにくい状況にいました。
そこで、OS やエディターに依存しないスニペットマネージャーを作って、それを使ってコード資産を蓄積することにしました。
Cap を使えば OS が変わってもエディターが変わっても同じ I/F でスニペットを管理、作成することができます。
Cap はエディターからスニペット管理を切り離すわけですが、もちろん Cap 用のプラグインは各エディターに必要です。

基本的な使い方

一番最初に Cap に管理させるディレクトリを指定します。
これは cap home で指定できます。

$ cap home /path/to/directory

Cap の CRUD は、GNU の基本コマンドを踏襲しています。
たとえば cat, ls, pwd, cd, rm などです。
シェルからは cap に続いてコマンドを打てば、そのコマンドを実行することができます。

$ cap cd path/to/env
$ cap pwd
$ cap ls
$ cap cat hello.txt

VS Code のプラグインを使う場合はエディター上でコマンドラインを @ で始めて、cap を省略し、コマンド名だけを書けば実行することができます。

@cd path/to/env
@pwd
@ls
@cat hello.txt

テンプレート言語

Cap はテンプレート言語を備えています。
詳細については GitHub の Wiki を御覧ください。

テンプレート言語の実行は cap make を使います。

$ cap make

↓はテンプレート言語のサンプルです。
(import しているモジュールは標準ライブラリではなく、私のスニペットの一部です)

{@
    import "utils.cap" as utils
    from "/html/base.cap" import (baseHeader, baseFooter)
    from "/html/list.cap" import arrayToUl

    title = opts.get("t") or opts.get("title") or "The title"

    baseHeader(title)
    for i = 0; i < 2; i += 1:
        a = [i, i+1, i+2, "end"]
        arrayToUl(a)
    end
    baseFooter()
@}

↑のコードを実行すると↓のような出力を得ることができます。

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="description" content="The description" />
    <meta name="keywords" content="Key,wor,ds" />
    <meta name="viewport" content="width=device-width, maximum-scale=1.0, minimum-scale=0.5,user-scalable=yes,initial-scale=1.0" />
    <title>The title</title>
</head>
<body>
<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li>end</li>
</ul>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>end</li>
</ul>
</body>
</html>

このように Cap のテンプレートは「再利用可能なスニペットを組み合わせて、最終的なコードを生成する」ことを目的にしています。
つまり少ない労力でスニペットを生成できるようにして、そのスニペットをエディター上で生成してコピペするというのが主な用途です。
まだ言語は基本的な機能しか持っていませんが、将来的には標準ライブラリを充実させて、楽にスニペットを生成できるようにしたいです。

PHP などで代用できるのでは?

はい。実はテンプレート言語を作りながら、Cap に PHP とかを組み込んだほうがいいんじゃないかと考えたりもしましたが、やはり PHP などはスニペットを生成することが目的の言語ではないので、自作することにしています。
あと個人的に Jinja の影響も受けているので、そっちの実装もできたらなーと思ってます。

Cap の展望

作っていて、Cap のテンプレート言語は既存言語を抽象化出来るので、アセンブラに対する C/C++ のような言語になるのかなーという感じはしました。その場合、アセンブラは PHP や Python や Ruby などの既存言語ですね。
しかし、その抽象化によって何が得られるのかというと、微妙なところはあります。そういった抽象化はすでに PHP などでも可能だと思うので、PHP でそういった抽象化が目立って行われていないということは、そもそもの需要が無い可能性があります。

テンプレート言語は汎用的に特化するかテンプレート的に特化するか、今がちょうど開発の分岐点になっていますが、Cap からフォークして汎用的な Cap として開発も進めて、Cap 側の言語はテンプレート用に特化させようかなとも考えています。

Webアプリケーションの制作ならNARUPORT

Webアプリケーションの制作ならNARUPORTにお任せください。
Webアプリの他にもGUIアプリやChromeExtension, スクリプトの制作など可能です。
以下のお問い合わせフォームからご依頼ください!

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク