Light Table のプラグインを作成してみる

Light Table しばらく触っていない間に0.6.0(最新は0.6.2)になり、オープンソースプラグイン対応となりました。

自分でも試しにプラグインを作成してみたので、簡単に手順を説明しておきます。

作ったもの: Shishio-sayings プラグイン

ユーザーの入力を勝手に志々雄真実(るろうに剣心)の名言に変換するお遊びプラグインです。

ソースコード

仕様

  • ユーザー入力を登録してある志々雄の名言に変換する。
  • 新しい行に移動したら、ランダムで使用する名言を変更する。
  • プラグインはコマンドでON,OFFする。

作成手順

プラグインのひな形を作成

plugins ディレクトリで下記のコマンドを実行しプラグインのひな形を作成します。 (Leiningenのインストールが必要)

lein new lt-plugin shishio-sayings
  • plugins のディレクトリ場所
    • Mac: ~/Library/Application Support/LightTable/plugins
    • Linux: ~/.config/LightTable/plugins/
    • Windows: %APPDATALOCAL%/LightTable/plugins/

作成されるディレクトリ構成は以下のようになります。

shishio-sayings
├── plugin.edn
├── project.clj
├── shishio_sayings.behaviors
└── src
    └── lt
        └── plugins
            └── shishio_sayings.cljs

shishi_sayings.cljs へ記述

shishio-sayings/src/lt/plugins/shishio_sayings.cljsプラグインで使用するコードを記述します。ひな型作成時に出力されたコードは利用しないので一旦全て削除してからコードを書きます。

(ns lt.plugins.shishio-sayings
  (:require [lt.objs.editor :as editor]
            [lt.objs.editor.pool :as pool]
            [lt.objs.command :as cmd]
            [lt.objs.notifos :as notifos]))

lt.plugins.shishio-sayingsで使用するライブラリを定義。

(def sayings ["所詮この世は弱肉強食。強ければ生き弱ければ死ぬ"
              "油断?何のことだ?これは「余裕」というもんだ"
              "まだ夜も更けてねぇのに寝言ほざいてんじゃねーよ"
              "てめえのものさしで語るんじゃねェよ"
              "「君」ぐらいつけろよ。無礼な先輩だな"
              "かかってくるなら、この如何ともしがたい実力の差を、ちったぁ埋めてからかかってこい"
              "おい!なんだ?ホントに死んじまったのか?物足りねぇ!"
              "弱者は強者の糧(かて)となるべき。糧にすらならない弱者は存在する価値すらねえ"
              "生まれがどーのこーのじゃねェ、お前が弱いから悪いんだ"
              "この俺が直々にブッ殺してやる"])

置き換えに使用する志々雄さんの名言を配列(Vector) として用意。 名言は志々雄真実_botからピックアップ。

(def current-saying (atom (rand-nth sayings)))

現在の変換先対象となる名言を保持する変数。

(defn change-to-another-saying []
  (reset! current-saying (rand-nth sayings)))

変換先対象となる名言を変更する関数。

(defn to-shishio-saying [user-say]
  (subs (deref current-saying) 0 (count user-say)))

現在の名言からユーザ入力の文字数と同等の長さの名言を切り出す関数。

(def say (atom false))
(defn on-sayings? [] (deref say))
(defn on-sayings [] (reset! say true))
(defn off-sayings [] (reset! say false))

(cmd/command {:command :toggle-shishio-sayings
              :desc "Shishio sayings: Toggle shishio sayings"
              :exec (fn []
                      (if (on-sayings?)
                        (do
                          (off-sayings)
                          (notifos/set-msg! "Shishio sayings: OFF"))
                        (do
                          (on-sayings)
                          (notifos/set-msg! "Shishio sayings: ON"))))})

名言への変換機能のON,OFFを切り替えるtoggle-shishio-sayingsコマンドを定義。定義したコマンドは、View->Commandsで開くコマンドバーから実行することができます。

(defn shishio-sayings-behind-cursor []
  (when (on-sayings?)
    (let [cm (editor/->cm-ed (pool/last-active))
          cursor (.getCursor cm)
          from #js {:line (.-line cursor) :ch 0}
          user-say (.getRange cm from cursor)
          shishio-say (to-shishio-saying user-say)]
      (if (= (count user-say) 0)
        (change-to-another-saying))
      (when (not= user-say shishio-say)
        (.replaceRange cm shishio-say from cursor)))))

(cmd/command {:command :shishio-sayings-behind-cursor
              :hidden true
              :desc "Shishio sayings: replace user input to shishio sayings"
              :exec shishio-sayings-behind-cursor})

変換機能がONであれば、変換処理を行うshishio-sayings-behind-cursorコマンドを定義。このコマンドは、キー入力があった際に呼び出したいのでコマンドバーから実行するのではなくbehaviorsファイルに設定を記述します。:hidden trueを設定するとコマンドバーにコマンドが表示されなくなります。

shishio_sayings.behaviors へ記述

{:+ {:app [(:lt.objs.plugins/load-js "shishio_sayings_compiled.js" true)]
     :editor [(:lt.objs.editor/on-change :shishio-sayings-behind-cursor)]}}

on-chnageに対応するコマンドとしてshisio-sayings-behaidn-cursorを登録。

コンパイル

shishio_sayings.cljsを保存したタイミングで自動的shishio_sayings.compiled.jsが作成されると思います。

動作確認

一旦、LightTableを終了し、起動し直します。shishio_sayings.compiled.jsがあれば、起動時に勝手にプラグインがロードされ、コマンドバーにshishioと入力すると定義したコマンドが表示されると思います。コマンドバーでShishio sayings: Toggle shishio sayingsを実行するとLightTable下部にshishio sayings: ONと表示されます。この状態で何かファイルを開きキー入力すると志々雄の名言に勝手に変化されます。もう一度、Shishio sayings: Toggle shishio sayingsを実行するとOFFにすることができます。

終わりに

公式ドキュメントも含め、まだプラグイン作成に関する情報はあまり出回ってないみたいです。現状は他の方が作成したプラグインのソースを眺めて学習するのが良いと思います。

LightTableのコマンドバーでPlugins: Show plugin managerを実行するとインストール済み利用できるプラグインの情報が表示されるのでそこから github へ行きソースを眺めるのが良さそうです。

Clojure でのお仕事募集中。

参考資料