この記事は絵文字 / Emoji Advent Calendar 2016の20日目だ。


emspect ロゴ

概要

emojiに関する詳細情報(コードポイント、名前[1]、キーワード、GitHubのショートコードなど)を表示するコマンド、emspectをリリースした。Node.jsで書いてnpm に公開した。GitHubで開発を進めている。

$ npm install -g emspect

でインストールできる。

使い方は

$ emspect --help

参照のこと。

作った理由

絵文字に関するコマンドは色々あるが、だいたいは検索とか入力支援 [2] [3]という感じで、ある絵文字の名前とか、文字コードを調べたりとか、ということがサクッとできるものが意外となかった。これを行おうとするときはいつもその絵文字でググってWebサービスで調べており、少しめんどくさかったので自分で作った。基本的に、Unicodeが提供するFull Emoji Data にある情報をCLIで提供できることを目的としている。

人間欲が出るもので、作っているうちに、絵文字→情報だけでなく、情報の一部→該当する絵文字も出せるようにしたくなるわけで、これもできるようにした。結果として、絵文字を検索するためのツールとしても使えるようになった。

実は、今年の4月に作ってリリースしていたのだけど(そしてそれからアップデートできてないのだけど)、リリース記事書く書く詐欺をした[4]にもかかわらず結局リリース記事を書いておらず、書かないとな~と思ってたところで、ちょうどEmoji Advent Calendarがあったので良い機会だと思い書くことにした。

emspect は EMoji inSPECTor の意味だ。

  • 📛 が一体何なのか調べる。
$ emspect 📛
📛 NAME BADGE (U+1F4DB) - badge, name, object, office :name_badge:
  • emojify [2:1] みたいなことをする。
$ emspect 📛 -f "%G"
:name_badge:
  • ショートコード検索をする。
$ emspect monkey -f "%C %G"
🙈 :see_no_evil:
🙉 :hear_no_evil:
🙊 :speak_no_evil:
🐵 :monkey_face:
🐒 :monkey:
  • 邪悪な猿(みざる、いわざる、きかざる)の直積を出す。
$ emspect evil -f "%C" | xargs | tr ' ' ',' | xargs -I@ sh -c "echo {@}{@}{@}"
🙈🙈🙈 🙈🙈🙉 🙈🙈🙊 🙈🙉🙈 🙈🙉🙉 🙈🙉🙊 🙈🙊🙈 🙈🙊🙉 🙈🙊🙊 🙉🙈🙈 🙉🙈🙉 🙉🙈🙊 🙉🙉🙈 🙉🙉🙉 🙉🙉🙊 🙉🙊🙈 🙉🙊🙉 🙉🙊🙊 🙊🙈🙈 🙊🙈🙉 🙊🙈🙊 🙊🙉🙈 🙊🙉🙉 🙊🙉🙊 🙊🙊🙈 🙊🙊🙉 🙊🙊🙊
  • 車っぽい絵文字でレースをする。
$ emspect place,car -f "%C" | xargs -I@ echo @ `emspect :dash: -f "%C"三三` | xargs
🚃 💨三三 🚞 💨三三 🚋 💨三三 🚓 💨三三 🚔 💨三三 🚗 💨三三 🚘 💨三三 🚨 💨三三 🚡 💨三三 🏎 💨三三

インストールと動作環境

Node.jsで実装したので、Node.js >= 4が必要となる。インストールはnpmで行うことができる。

$ npm install -g emspect

を実行することで、emspectコマンドが使えるようになる。

できること

  1. 絵文字の情報を取得することができる。

$ emspect 📛
📛 NAME BADGE (U+1F4DB) - badge, name, object, office :name_badge:

引数として絵文字を与えると、単一の絵文字の情報が表示される。
左から絵文字、名前、コードポイント、キーワード、(利用可能な場合は)GitHubのショートコードの順で並んで表示される。

  1. コードポイントから絵文字を検索できる。

$ emspect U+1F648
🙈 SEE-NO-EVIL MONKEY ≊ see-no-evil (U+1F648) - animal, evil, face, forbidden, gesture, monkey, nature, no, not, prohibited, see :see_no_evil:

U+で始まる引数を渡すと、コードポイントから検索される。該当するものが複数ある場合全部出る。

$ emspect U+1F48B
👩‍❤️‍💋‍👨 Kiss: WOMAN, MAN (U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468) - kiss, man, woman
👨‍❤️‍💋‍👨 Kiss: MAN, MAN (U+1F468 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468) - kiss, man
👩‍❤️‍💋‍👩 Kiss: WOMAN, WOMAN (U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F469) - kiss, woman
💋 KISS MARK (U+1F48B) - emotion, heart, kiss, lips, mark, person, romance :kiss:

 

  1. 名前から絵文字を検索できる

$ emspect MEDIUM
⭐️ WHITE MEDIUM STAR (U+2B50) - nature, place, star
◻️ WHITE MEDIUM SQUARE (U+25FB) - geometric, sign, square, symbol :white_medium_square:
◼️ BLACK MEDIUM SQUARE (U+25FC) - geometric, sign, square, symbol :black_medium_square:
◽️ WHITE MEDIUM SMALL SQUARE ≊ white medium-small square (U+25FD) - geometric, sign, square, symbol
◾️ BLACK MEDIUM SMALL SQUARE ≊ black medium-small square (U+25FE) - geometric, sign, square, symbol
⚪️ MEDIUM WHITE CIRCLE ≊ white circle (U+26AA) - circle, geometric, sign, symbol
⚫️ MEDIUM BLACK CIRCLE ≊ black circle (U+26AB) - circle, geometric, sign, symbol

すべて大文字で引数を渡すと、名前を検索する。(この挙動は廃止されるかもしれない。後述。)

  1. キーワードから絵文字を検索できる

$ emspect pet
🐶 DOG FACE (U+1F436) - animal, dog, face, nature, pet :dog:
🐕 DOG (U+1F415) - animal, dog, nature, pet :dog2:
🐱 CAT FACE (U+1F431) - animal, cat, face, nature, pet :cat:
🐈 CAT (U+1F408) - animal, cat, nature, pet :cat2:
🐹 HAMSTER FACE (U+1F439) - animal, face, hamster, nature, pet :hamster:
🐰 RABBIT FACE (U+1F430) - animal, bunny, face, nature, pet, rabbit :rabbit:
🐇 RABBIT (U+1F407) - animal, bunny, nature, pet, rabbit :rabbit2:

すべて小文字で引数を渡すと、キーワードを検索する。

  1. GitHubのショートコードから絵文字を検索できる

$ emspect :smile:
😄 SMILING FACE WITH OPEN MOUTH AND SMILING EYES (U+1F604) - eye, face, mouth, open, person, smile :smile:

最後のコロンを付けないと、前方一致で検索できる。

$ emspect :smile
😃 SMILING FACE WITH OPEN MOUTH (U+1F603) - face, mouth, open, person, smile :smiley:
😄 SMILING FACE WITH OPEN MOUTH AND SMILING EYES (U+1F604) - eye, face, mouth, open, person, smile :smile:
😺 SMILING CAT FACE WITH OPEN MOUTH (U+1F63A) - animal, cat, face, mouth, nature, open, smile :smiley_cat:
😸 GRINNING CAT FACE WITH SMILING EYES (U+1F638) - animal, cat, eye, face, grin, nature, smile :smile_cat:
  1. 出力形式を指定できる

-f FORMAT (--format FORMAT) オプションで出力形式を指定できる。

JSON

-f json で、JSON 形式で出力される。以下は jq コマンド [5] で整形してみた例。

$ emspect :smile: -f json | jq
  {
    "code": "U+1F604",
    "chars": "😄",
    "name": "SMILING FACE WITH OPEN MOUTH AND SMILING EYES",
    "synonym": null,
    "age": "2010ʲ",
    "default": "emoji",
    "annotations": [
      "eye",
      "face",
      "mouth",
      "open",
      "person",
      "smile"
    ],
    "aliases": [
      "smile"
    ]
  }
]

全部出す

-f all で持っているすべての情報をタブ区切りで出力する。

$ emspect :smile: -f all
U+1F604 😄       SMILING FACE WITH OPEN MOUTH AND SMILING EYES           2010ʲ   emoji   eye, face, mouth, open, person, smile   :smile:

カスタム

-f に続き、書式を与えることで、任意の形式による表示ができる。

$ emspect monkey  -f "%C %G"
🙈 :see_no_evil:
🙉 :hear_no_evil:
🙊 :speak_no_evil:
🐵 :monkey_face:
🐒 :monkey:

すべての書式指定子は --help で見ることができる。

Tips

  • 上で述べたように、クエリとして、どのような文字列を与えられたか(絵文字自体、コードポイント表記、大文字、小文字、etc...)によって、雰囲気で検索する対象が変わるようになっている。が、人によっては逆に面倒に感じられるかもしれない。この場合、-c (--code)、-C (--char)、-n (--name) -a (--annotations)などを与えることで、検索対象を明示的に指定できる。
    : 小文字で medium と与えているが、名前を対象に検索が行われていることに注意されたい。
$ emspect -n medium
⭐️ WHITE MEDIUM STAR (U+2B50) - nature, place, star
◻️ WHITE MEDIUM SQUARE (U+25FB) - geometric, sign, square, symbol :white_medium_square:
◼️ BLACK MEDIUM SQUARE (U+25FC) - geometric, sign, square, symbol :black_medium_square:
◽️ WHITE MEDIUM SMALL SQUARE ≊ white medium-small square (U+25FD) - geometric, sign, square, symbol
◾️ BLACK MEDIUM SMALL SQUARE ≊ black medium-small square (U+25FE) - geometric, sign, square, symbol
⚪️ MEDIUM WHITE CIRCLE ≊ white circle (U+26AA) - circle, geometric, sign, symbol
⚫️ MEDIUM BLACK CIRCLE ≊ black circle (U+26AB) - circle, geometric, sign, symbol
  • 検索対象を指定して区切ると、And検索ができる。
    : 白くてネイチャーなやつら
$emspect -n WHITE -a nature
⭐️ WHITE MEDIUM STAR (U+2B50) - nature, place, star
🌤 WHITE SUN WITH SMALL CLOUD ≊ sun behind small cloud (U+1F324) - cloud, nature, sun, weather
🌥 WHITE SUN BEHIND CLOUD ≊ sun behind large cloud (U+1F325) - cloud, nature, sun, weather
🌦 WHITE SUN BEHIND CLOUD WITH RAIN ≊ sun behind cloud with rain (U+1F326) - cloud, nature, rain, sun, weather
  • -a、すなわちキーワードのみは、実はコンマで連結してand検索ができる。
$ emspect monkey,gesture # emspect -a monkey,gesture も emspect -a monkey -a gesture も同じ
🙈 SEE-NO-EVIL MONKEY ≊ see-no-evil (U+1F648) - animal, evil, face, forbidden, gesture, monkey, nature, no, not, prohibited, see :see_no_evil:
🙉 HEAR-NO-EVIL MONKEY ≊ hear-no-evil (U+1F649) - animal, evil, face, forbidden, gesture, hear, monkey, nature, no, not, prohibited :hear_no_evil:
🙊 SPEAK-NO-EVIL MONKEY ≊ speak-no-evil (U+1F64A) - animal, evil, face, forbidden, gesture, monkey, nature, no, not, prohibited, speak :speak_no_evil:
  • emspect だけだと(クエリを与えないと)全部出力するので、もっと激しい検索がしたい人は grep なりなんなりでどうぞ。

困っていること

--update で最新の絵文字情報をFull Emoji Datagithub:github/gemoji内のemoji.jsonから取得して内部データを更新できるのだが、久々に更新してみようと思ったらFull Emoji Dataのフォーマットが変わってしまったのでつらい。。。

修正する分にはいいのだけど、ひとつ問題があって、名前が小文字表記が基本になってしまったことだ。名前はこれまでほとんどすべて大文字で書かれていて、このためクエリが大文字で与えられた場合は名前から検索しようというデザインにしていたので悩んでいる。ユースケースを考えると、大文字小文字問わず、名前とキーワードの両方から検索したほうが良い気がしているが、どうしよう。

さいごに

emspect 使ってください!あと、面白い例があれば GitHub の Wiki で教えてもらえるとうれしいです。


  1. CLDR で定義されている名前。 ↩︎

  2. emojify ↩︎ ↩︎

  3. emoji-cli ↩︎

  4. Emoji: 🍣 SUSHI (U+1F363) のブロンズスポンサーになった: 最後の段落で書く書く詐欺をしている。 ↩︎

  5. jq ↩︎