arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |

index.sh (4927B)


      1 #! page
      2 title: Un emoji \"picker\" en shell
      3 author: Arthur Pons
      4 description: Construisons un outil pour sélectionner un emoji et les mettre dans le presse-papier
      5 publication: 2024-05-02
      6 
      7 sectionmd: main
      8 
      9 Les emojis c'est mignon et on voudrait en mettre partout. Créons
     10 donc un "emoji picker" aussi simple que possible et qui nous permettra
     11 d'en insérer un peu partout où on veut 😄 (<- comme celui-ci !).
     12 
     13 ## Récupérer la liste des emojis
     14 
     15 Le consortium unicode fourni une liste des emojis dans un document
     16 disponible sur le web :
     17 
     18 	curl -Ls https://unicode.org/Public/emoji/latest/emoji-test.txt > emoji-test.txt
     19 
     20 Il contient un emoji par ligne ainsi que tout plein d'informations à son propos :
     21 
     22 	1F498                                                  ; fully-qualified     # 💘 E0.6 heart with arrow
     23 	1F49D                                                  ; fully-qualified     # 💝 E0.6 heart with ribbon
     24 	1F496                                                  ; fully-qualified     # 💖 E0.6 sparkling heart
     25 	1F497                                                  ; fully-qualified     # 💗 E0.6 growing heart
     26 	1F493                                                  ; fully-qualified     # 💓 E0.6 beating heart
     27 	1F49E                                                  ; fully-qualified     # 💞 E0.6 revolving hearts
     28 	1F495                                                  ; fully-qualified     # 💕 E0.6 two hearts
     29 	1F49F                                                  ; fully-qualified     # 💟 E0.6 heart decoration
     30 	2763 FE0F                                              ; fully-qualified     # ❣️ E1.0 heart exclamation
     31 	2763                                                   ; unqualified         # ❣ E1.0 heart exclamation
     32 	1F494                                                  ; fully-qualified     # 💔 E0.6 broken heart
     33 	2764 FE0F 200D 1F525                                   ; fully-qualified     # ❤️‍🔥 E13.1 heart on fire
     34 	2764 200D 1F525                                        ; unqualified         # ❤‍🔥 E13.1 heart on fire
     35 
     36 ## Créer un format propice au choix
     37 
     38 Qui dit des données tabulaires dit notre arsenal habituel d'outils. On veut un emoji
     39 et sa description par ligne ce qui devrait faire une interface décente de choix :
     40 
     41 	💘	heart with arrow
     42 	💝	heart with ribbon
     43 	💖	sparkling heart
     44 	💗	growing heart
     45 
     46 Pour cela on peut utiliser le script suivant :
     47 
     48 	t=$(mktemp -d);trap "rm -rf $t" EXIT
     49 	< emoji-test.txt grep -Ev '^(#.*)?$' | tr -s ' ' | cut -d';' -f2 > $t/c
     50 	< $t/c cut -d' ' -f4 > $t/l
     51 	< $t/c cut -d' ' -f6- > $t/r
     52 	paste $t/l $t/r
     53 
     54 Première ligne on créé un répertoire temporaire de travail. Seconde on retire
     55 les lignes vides et les commentaires, on écrase les suites d'espaces en un seul
     56 espace puis on retire tout ce qu'il y a à gauche du point virgule. Troisième et
     57 quatrième on récupère les emojis et leurs descriptions. Ce script pourrait
     58 être plus simple sous la forme d'un programme awk mais peu importe.
     59 
     60 ## Créer une interface pour en choisir un
     61 
     62 Quand il s'agit de choisir parmi une liste arbitraire d'éléments sur la base du
     63 contenu des lignes il est propice d'utiliser fzy. J'en parle dans l'[article
     64 sur les extensions de catium](/extension-catium/index.html) et [celui sur
     65 la musique](/musique/index.html). Pour notre besoin cela pourrait ressembler à
     66 ça, avec `dbemoji` le fichier que l'on a créé avec le précédent script :
     67 
     68 	< dbemoji fzy -l 100 | cut -f1 | xclip -selection clipboard -f -rmlastnl
     69 
     70 On met les emoji dans fzy, on filtre interactivement dessus en tapant du texte
     71 susceptible d'apparaître dans la description, on ne récupère que l'emoji de
     72 la ligne sélectionnée et on met ça dans le presse papier. L'option `-f` d'xclip
     73 permet de tout de même récupérer l'emoji en sortie de façon à pouvoir continuer
     74 le pipe si jamais. On peut donc soit `ctrl+v` l'emoji quelque part soit, si
     75 l'outil où l'on veut l'insérer le permet, le récupérer directement depuis
     76 la stdout.
     77 
     78 ## L'utiliser dans vim
     79 
     80 Evidemment j'ai envie d'insérer facilement des emoji dans vim. Pour cela
     81 j'utilise cette macro :
     82 
     83 	inoremap <buffer> (-e <ESC>:r!pickemoji<CR>kgJe
     84 
     85 avec `pickemoji` étant la ligne de shell écrite juste au dessus. Je peux
     86 donc taper taper taper du texte, entrer rapidement `(-e`, déclencher
     87 l'interface fzy, choisir mon emoji et continuer à taper[^1] ! 🙂
     88 
     89 ## Et si on en veut plusieurs ?
     90 
     91 Il existe un [fork de fzy](https://github.com/leo-arch/fzy) permettant de
     92 choisir plusieurs lignes dans l'interface. Il faut utiliser l'option `-m` puis
     93 faire une tabulation sur chaque choix que l'on veut. Cela permet d'insérer
     94 plusieurs emoji d'un coup !
     95 Tous les emojis avec computer dans leurs descriptions : 🖥️💽🖱
     96 
     97 [^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 🕵🔎