経緯
DashのSnippetですが、Dash Guideやネットにある情報を見る限り
DashのGUIから登録する方法しか提供されていないようだ。
が、大量のデータをSnippetとして利用したい場合にこれはあまりに不便である。
そこでTwitterでSnippetについてつぶやいてみたところ
@tbpgr よく使うもの以外は都度検索してますね.. https://t.co/tzWEek29TL こちらの記事にあるようにprefixをつけて絞り込みやすくしてます。GUI以外の管理手段はわからないですね。。SQLiteで管理してるようなので頑張ればできるのかもしれません。
— Retu Fukui (@fukuiretu) 2015, 12月 10
このような情報をいただいた。
ありがとうございます!!
ちょうどこの時こちらでもDashのDocsetsはSQLiteで管理されてるようなので、
SnippetsもおそらくSQLiteだろうという予想のもと
%Dash%library.dash
を sqlite3
コマンドで開き、中にあるテーブル一覧から snippets
を見つけて確認したところでした。
調査
SQLiteのCLIツールを調べる
SQLiteはほぼ使ったことがないので、その部分も調べながら進めていく。
Command Line Shell For SQLite - SQLite
sqlite3
コマンドがあるようだ。
確認してみよう。
$ cd %Dash $ sqlite3 library.dash sqlite> .tables smartTags snippets tags tagsIndex
ふむ、4テーブルあるようだ。
SQLiteのスキーマ構造を確認する
登録データの確認
事前に登録しておいた情報を頼りにテーブル構造を把握してみる。
登録済み情報は以下のようにしておきました。
Abbreviation | Body | Tag |
---|---|---|
test;; | test test test test |
test |
test2 | test2 test2 |
test |
rubyif;; | if(__condition__) { __logic__ } | ruby |
SQLiteの各テーブルを確認
- snippets
sqlite> .schema snippets CREATE TABLE snippets(sid INTEGER PRIMARY KEY, title TEXT, body TEXT, syntax VARCHAR(20), usageCount INTEGER, FOREIGN KEY(sid) REFERENCES tagsIndex(sid) ON DELETE CASCADE ON UPDATE CASCADE); sqlite> select * from snippets; 1|test;;|test test test test |None|0 2|test2|test2 test2|None|0 3|rubyif;;|if(__condition__) { __logic__ }|Ruby|0
- tags
sqlite> .schema tags CREATE TABLE tags(tid INTEGER PRIMARY KEY, tag TEXT UNIQUE, FOREIGN KEY(tid) REFERENCES tagsIndex(tid) ON DELETE CASCADE ON UPDATE CASCADE); sqlite> select * from tags; 1|test 2|ruby
- tagsIndex
sqlite> .schema tagsIndex CREATE TABLE tagsIndex(tid INTEGER, sid INTEGER); sqlite> select * from tagsIndex; 1|1 1|2 2|3
これはtagのidとsnippetのidを紐付けるテーブルですね。
以下の様な構造になっているようですね。
※括弧なしが画面の項目名。括弧ありがDBのtable + column名です。
sid | title | body | syntax | tid | tag | usageCount |
---|---|---|---|---|---|---|
1 | test;; | test test test test |
None | 1 | test | 0 |
2 | test2 | test2 test2 |
None | 1 | test | 0 |
3 | rubyif;; | if(__condition__) { __logic__ } | Ruby | 2 | ruby | 0 |
usageCountは名前の通りだと使用回数になりそうだけど、Snippetを使ってみても変化はなかった。
データを追加
テーブル構造も分かったし想定されるデータを追加したらGUIのSnippetに反映されるか確認してみましょう。
追加するデータは
sid | title | body | syntax | tid | tag | usageCount |
---|---|---|---|---|---|---|
4 | sqlite_title;; | sqlite_body | Ruby | 2 | ruby | 0 |
にします。
- SQLで追加
sqlite> insert into tagsIndex values((select tid from tags where tag = "ruby"), (select max(sid) from tagsIndex) + 1); sqlite> select * from tagsIndex; 1|1 1|2 2|3 2|4 sqlite> insert into snippets values((select max(sid) from tagsIndex),"sqlite_title","sqlite_body","Ruby",0); sqlite> select * from snippets; 1|test;;|test test test test |None|0 2|test2|test2 test2|None|0 3|rubyif;;|if(__condition__) { __logic__ }|Ruby|0 4|sqlite_title|sqlite_body|Ruby|0
Tagが新規登録の場合は先にタグを追加するフェーズを足せばいいでしょう。
画面から登録データを確認
SQLiteから登録したデータが表示されているか確認します。
無事表示されています!
まとめ
SQLiteからデータを登録できることを確認できました。
さて、この手順はひどく面倒なものなのでSnippetの情報を管理する設定ファイル(yamlなど)と スクリプト一発でSnippetを最新化できると嬉しいです。
そう、ここからが本番だったのです・・・
to be continued...