- Rust 94.8%
- Nix 5.1%
- Shell 0.1%
| .github/workflows | ||
| assets | ||
| data | ||
| nix | ||
| scripts | ||
| src | ||
| .gitignore | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| README.md | ||
| THIRD_PARTY_LICENSES.md | ||
A terminal UI icon picker for emoji, kaomoji, Unicode characters, and Nerd Font glyphs. Press Enter to print the selected icon to stdout; press Esc to exit without output.
Tip
Want to use
latuiconin Neovim? Check out thelatuicon.nvimwrapper plugin!
Table of Contents
Install
Nix
Run without installing:
nix run github:coko7/latuicon
Or install it into your Nix profile:
nix profile add github:coko7/latuicon
Cargo
Install the latuicon bin crate:
cargo install latuicon
Arch Linux (AUR)
Install the latuicon AUR package:
$ yay -S latuicon
# or
$ paru -S latuicon
Build from source
./scripts/deploy.sh
Builds a release binary and installs it to ~/.local/bin/latuicon.
Nix development environment
The flake also provides the Rust toolchain, Clippy, rustfmt, and rust-analyzer for contributors:
nix develop
nix flake check
Usage
latuicon # default theme, opens on emoji tab
latuicon --theme mocha # specific theme
LATUICON_THEME=dracula latuicon
latuicon --default-tab unicode # sets default tab (all, emoji, kaomoji, unicode, nerd font)
LATUICON_DEFAULT_TAB=nerd latuicon
latuicon --search-mode simple # substring-only search (default: fuzzy)
LATUICON_SEARCH=fuzzy latuicon
latuicon --tabs "nerd-font,emoji,all,kaomoji,unicode" # reorder tab strip / Tab cycling
LATUICON_TABS="nerd-font,emoji,all,kaomoji,unicode" latuicon
latuicon --tabs "emoji,kaomoji" # only enable emoji and kaomoji tabs
Prints the chosen icon to stdout.
Keybindings
| Key | Action |
|---|---|
↑ / ↓ |
Navigate list |
Ctrl+K / Ctrl+J |
Navigate list (vi-style) |
PgUp / PgDn |
Page up / down |
Ctrl+U / Ctrl+D |
Half-page up / down |
Tab / Shift+Tab |
Switch tab |
Enter |
Select and exit |
Esc / Ctrl+C |
Exit without selecting |
| Type anything | Filter by name |
Ctrl+Z |
Undo search edit |
| Mouse click | Select tab or item |
| Double-click | Select and exit |
| Scroll wheel | Scroll list |
Search supports full emacs cursor movement (Ctrl+A, Ctrl+E, Ctrl+F, Ctrl+B, Ctrl+W, Ctrl+Y, etc.).
Tabs
- All — every icon from every other tab, combined into one searchable set
- Emoji — common emoji + full emoji set
- Kaomoji — curated kaomoji collection
- Unicode — common symbols + Box Drawing, Geometric Shapes, Arrows, Math Operators, Dingbats; search supports
U+XXXX/0xXXXXhex lookup and full Unicode name scan - Nerd Font — common glyphs + full Nerd Font glyph set
Desktop integration example (Hyprland)
In my setup, I use floatty.sh to open latuicon in a floating terminal window and pipe the result to the clipboard. Here is my custom Hyprland binding for it:
bindd = $mainMod, comma, laTUIcon icon picker, exec, FLOATTY_CAPTURE_OUTPUT=1 bash floatty.sh latuicon latuicon | wl-copy
And these are the Hyprland window rules for it:
# Special rules for floating/prompt terminals
windowrule {
name = floater-kitty
match:class = ^(floater-kitty-.*)$
no_anim = on
float = on
center = on
size = 1000 800
}
windowrule {
name = floater-kitty-latuicon
match:class = floater-kitty-latuicon
size = 700 700
}
Pressing $mainMod + , opens a floating terminal with the picker; confirming an icon copies it straight to the Wayland clipboard.
Configuration
You can configure latuicon in config.toml:
- Linux:
~/.config/latuicon/config.toml - macOS:
~/Library/Application Support/latuicon/config.toml - Windows:
%APPDATA%\latuicon\config.toml
Example:
# Set the color theme
theme = "mocha"
# Set the default tab (selected tab on launch)
default_tab = "all"
# Set the search mode:
# - simple: case-insensitive substring match only
# - fuzzy: substring match, using word-level Levenshtein distance for ignoring small typos
search_mode = "fuzzy" # or 'simple'
# Configure the enabled tabs and their display order.
# Missing tabs will not have their icons available through "All".
tabs = ["all", "emoji", "kaomoji", "unicode", "nerd-font"]
Override the path with --config <path> / -c <path> / LATUICON_CONFIG.
Precedence: CLI flag > env var > config file > built-in default.
Themes
contrast (default), late, purple, mocha, gruvbox, dracula
Set with --theme <name> / -t <name> / LATUICON_THEME / theme in the config file.
Default tab
Configures which tab is active when latuicon opens: all, emoji, kaomoji, unicode, or nerd-font (default: emoji).
Must be one of the tabs enabled via Tabs.
Set with --default-tab <tab> / -d <tab> / LATUICON_DEFAULT_TAB / default_tab in the config file.
Search mode
fuzzy(default) — substring match, falling back to word-level Levenshtein distance so small typos still find the right iconsimple— case-insensitive substring match only
Set with --search-mode <mode> / -s <mode> / LATUICON_SEARCH / search_mode in the config file.
Tabs
You can configure which tabs are enabled, and in what order. To do so, provide a list which corresponds to a subset of the 5 tabs. A tab missing from this subset will be disabled: hidden from UI and excluded from the "All" icon set.
Set with --tabs <list> / -T <list> / LATUICON_TABS / tabs in the config file.
What's the relationship with late.sh?
The project was seeded from the icon-picker component of late.sh at commit 6c670683. Code written after the initial commit is not derived from that project.
The original icon picker was written by @mevanlc; the late.sh project is maintained by @mpiorowski.
A big thanks to the both of them! ✨
Note
For more details, you can read the full story of how
latuiconstarted: blog.lazyfreax.dev/blog/latuicon-icon-picker
See THIRD_PARTY_LICENSES.md for the license covering the derived code from the initial commit.