Un emoji "picker" en shell

Retour accueil


Les emojis c’est mignon et on voudrait en mettre partout. Créons donc un “emoji picker” aussi simple que possible et qui nous permettra d’en insérer un peu partout où on veut 😄 (<- comme celui-ci !).

Récupérer la liste des emojis

Le consortium unicode fourni une liste des emojis dans un document disponible sur le web :

curl -Ls https://unicode.org/Public/emoji/latest/emoji-test.txt > emoji-test.txt

Il contient un emoji par ligne ainsi que tout plein d’informations à son propos :

1F498                                                  ; fully-qualified     # 💘 E0.6 heart with arrow
1F49D                                                  ; fully-qualified     # 💝 E0.6 heart with ribbon
1F496                                                  ; fully-qualified     # 💖 E0.6 sparkling heart
1F497                                                  ; fully-qualified     # 💗 E0.6 growing heart
1F493                                                  ; fully-qualified     # 💓 E0.6 beating heart
1F49E                                                  ; fully-qualified     # 💞 E0.6 revolving hearts
1F495                                                  ; fully-qualified     # 💕 E0.6 two hearts
1F49F                                                  ; fully-qualified     # 💟 E0.6 heart decoration
2763 FE0F                                              ; fully-qualified     # ❣️ E1.0 heart exclamation
2763                                                   ; unqualified         # ❣ E1.0 heart exclamation
1F494                                                  ; fully-qualified     # 💔 E0.6 broken heart
2764 FE0F 200D 1F525                                   ; fully-qualified     # ❤️‍🔥 E13.1 heart on fire
2764 200D 1F525                                        ; unqualified         # ❤‍🔥 E13.1 heart on fire

Créer un format propice au choix

Qui dit des données tabulaires dit notre arsenal habituel d’outils. On veut un emoji et sa description par ligne ce qui devrait faire une interface décente de choix :

💘   heart with arrow
💝   heart with ribbon
💖   sparkling heart
💗   growing heart

Pour cela on peut utiliser le script suivant :

t=$(mktemp -d);trap "rm -rf $t" EXIT
< emoji-test.txt grep -Ev '^(#.*)?$' | tr -s ' ' | cut -d';' -f2 > $t/c
< $t/c cut -d' ' -f4 > $t/l
< $t/c cut -d' ' -f6- > $t/r
paste $t/l $t/r

Première ligne on créé un répertoire temporaire de travail. Seconde on retire les lignes vides et les commentaires, on écrase les suites d’espaces en un seul espace puis on retire tout ce qu’il y a à gauche du point virgule. Troisième et quatrième on récupère les emojis et leurs descriptions. Ce script pourrait être plus simple sous la forme d’un programme awk mais peu importe.

Créer une interface pour en choisir un

Quand il s’agit de choisir parmi une liste arbitraire d’éléments sur la base du contenu des lignes il est propice d’utiliser fzy. J’en parle dans l’article sur les extensions de catium et celui sur la musique. Pour notre besoin cela pourrait ressembler à ça, avec dbemoji le fichier que l’on a créé avec le précédent script :

< dbemoji fzy -l 100 | cut -f1 | xclip -selection clipboard -f -rmlastnl

On met les emoji dans fzy, on filtre interactivement dessus en tapant du texte susceptible d’apparaître dans la description, on ne récupère que l’emoji de la ligne sélectionnée et on met ça dans le presse papier. L’option -f d’xclip permet de tout de même récupérer l’emoji en sortie de façon à pouvoir continuer le pipe si jamais. On peut donc soit ctrl+v l’emoji quelque part soit, si l’outil où l’on veut l’insérer le permet, le récupérer directement depuis la stdout.

L’utiliser dans vim

Evidemment j’ai envie d’insérer facilement des emoji dans vim. Pour cela j’utilise cette macro :

inoremap <buffer> (-e <ESC>:r!pickemoji<CR>kgJe

avec pickemoji étant la ligne de shell écrite juste au dessus. Je peux donc taper taper taper du texte, entrer rapidement (-e, déclencher l’interface fzy, choisir mon emoji et continuer à taper1 ! 🙂

Et si on en veut plusieurs ?

Il existe un fork de fzy permettant de choisir plusieurs lignes dans l’interface. Il faut utiliser l’option -m puis faire une tabulation sur chaque choix que l’on veut. Cela permet d’insérer plusieurs emoji d’un coup ! Tous les emojis avec computer dans leurs descriptions : 🖥️💽🖱


  1. du moins c’est mon espoir mais la macro ne me remet pas en mode insertion à la fin. Je ne sais pas bien pourquoi, je vais investiguer 🕵🔎