#!/usr/bin/env nix #! nix --experimental-features ``nix-command flakes`` shell --impure --expr `` #! nix let nixpkgs = builtins.getFlake "nixpkgs"; in #! nix let pkgs = import nixpkgs {}; in #! nix [ (pkgs.haskellPackages.ghcWithPackages (haskellPkgs: with haskellPkgs; [ #! nix turtle #! nix unicode-transforms #! nix ])) ] #! nix `` #! nix --command runhaskell {-# LANGUAGE GHC2024 #-} {-# LANGUAGE BlockArguments #-} {-# LANGUAGE OverloadedStrings #-} import Control.Monad (forM_) import Data.Char (chr, ord) import Data.Function ((&)) import Data.List qualified as List import Data.Text (Text) import Data.Text qualified as Text import Data.Text.Normalize import System.Environment (lookupEnv) import Text.Printf qualified as Printf import Turtle main :: IO () main = do term <- lookupEnv "TERM" forM_ combs \comb -> do forM_ baseChars \baseChar -> do let txt = baseChar <> comb putStrLn $ analyse txt when (term == Just "xterm-ghostty") $ shells ("ghostty +show-face --string=" <> txt) empty putStrLn "" baseChars = ["ɑ", "ɛ", "y"] combs = [ combiningDiacriticalMarks , combiningDiacriticalMarksExtended , combiningDiacriticalMarksForSymbols , combiningHalfMarks ] & mconcat combiningDiacriticalMarks = [ chr c & Text.singleton | c <- [0x0300 .. 0x036F] ] combiningDiacriticalMarksExtended = [ chr c & Text.singleton | c <- [0x1AB0 .. 0x1AEB] ] combiningDiacriticalMarksForSymbols = [ chr c & Text.singleton | c <- [0x20D0 .. 0x20F0] ] combiningHalfMarks = [ chr c & Text.singleton | c <- [0xFE20 .. 0xFE2F] ] analyse :: Text -> String analyse text = do List.intercalate " " $ [ Printf.printf "%20s: %-5s" (text & normalize NFKD & escape) (text & normalize NFKD) ] escape :: Text -> Text escape txt = txt & Text.unpack & foldMap (\c -> Printf.printf "\\x%X" (ord c)) & Text.pack