読者です 読者をやめる 読者になる 読者になる

技術のメモ帳

気が向いたときに書いてます

Dashの独自CheatSheetをYAMLから生成するgemを作った

cheatset-yamlという、Dashの独自CheatSheetをYAMLから生成するgemを作りました。

github.com

動機に至るまで

  • 今更ながらSpotlightを使うのをやめて、Alfredを導入した。
  • Alfred導入に併せて、Dashを使うようになった。
  • 独自CheatSheetを作りたくなった。
  • DSLrubyファイル作る必要があることを知る。
  • YAMLで書けたらいいのになー。

DashでCheatSheetを作るには?

詳しくは下記が詳しいですが、Kapeli/cheatset というgemのDSLでツラツラと書いていく必要があります。

qiita.com

github.com

DSLは次の通り(READMEより)

cheatsheet do
  title 'Sample'               # Will be displayed by Dash in the docset list
  docset_file_name 'Sample'    # Used for the filename of the docset
  keyword 'sample'             # Used as the initial search keyword (listed in Preferences > Docsets)
  # resources 'resources_dir'  # An optional resources folder which can contain images or anything else

  introduction 'My *awesome* cheat sheet'  # Optional, can contain Markdown or HTML

  # A cheat sheet must consist of categories
  category do
    id 'Windows'  # Must be unique and is used as title of the category

    entry do
      command 'CMD+N'         # Optional
      command 'CMD+SHIFT+N'   # Multiple commands are supported
      name 'Create window'    # A short name, can contain Markdown or HTML
      notes 'Some notes'      # Optional longer explanation, can contain Markdown or HTML
    end
    entry do
      command 'CMD+W'
      name 'Close window'
    end
  end

  category do
    id 'Code'
    entry do
      name 'Code sample'
      notes <<-'END'
        ```ruby
        sample = "You can include code snippets as well"
        ```
        Or anything else **Markdown** or HTML.
      END
    end
  end

  notes 'Some notes at the end of the cheat sheet'
end

YAMLで書くには?

YAMLだと次のような感じになります。

cheatsheet:
  title: Sample             # Will be displayed by Dash in the docset list
  docset_file_name: Sample  # Used for the filename of the docset
  keyword: sample           # Used as the initial search keyword (listed in Preferences > Docsets)
  resources: resources_dir  # An optional resources folder which can contain images or anything else

  introduction: 'My *awesome* cheat sheet'  # Optional, can contain Markdown or HTML

  # A cheat sheet must consist of categories
  categories:
    - id: Windows # Must be unique and is used as title of the category
      entries:
        - name: Create Window # A short name, can contain Markdown or HTML
          notes: Some notes   # Optional longer explanation, can contain Markdown or HTML
          command:
          - CMD+N       # Optional
          - CMD+SHIFT+N # Multiple commands are supported
        - name: Close Window
          command: CMD+W
    - id: Code
      entries:
        - name: Code sample
          notes: >
            You can include code `snippets` as well
            Or anything else **Markdown** or HTML.

  notes: 'Some notes at the end of the cheat sheet'

それぞれの定義内容を知らないといけない時点で、そこまで変わらん気もしますが、YAMLの定義を見るだけで大体察しがつく内容かと思います。

使い方

YAMLを用意して、コマンド叩くだけ。

$ gem install cheatset-yaml
$ cheatset-yaml generate ${filename}.yml

コードの話

特に難しいことはしていませんが、一応説明。

  1. cheatsetのgem(以下本家)をラップする方向で。
  2. YAMLをパースした後、ERBでRubyファイルを作成(Tempfile)。
  3. 本家のコンテクスト評価クラスに、そのファイルを渡す。
  4. generateメソッドで、CheatSheetを生成。
  5. CLIは本家同様、thorを使った。
  6. (最初はテスト書こうと思ったが)書くまでの内容ではないので割愛した。

ということで、Dashで独自CheatSheetを作ってみたい方は、ぜひ使ってみてください!

github.com

なお、docsetは生成した後、 open コマンドで展開するか、finderからダブルクリックで展開してくださいねー:)