My ~/.XCompose
I would hate to be without my Compose key.
Started circa 2014, last updated • Tagged /practices
As is customary, this file is messy, having accumulated over a more than a decade.
On my present keyboard, I have RAlt mapped to Compose.
I use these mappings extensively.
There are a few sets of characters where I’ve never used half of them—
Greek letters, Control Pictures, Apple’s Keyboard characters.
But other than those, there aren’t many that I won’t use in a given year,
and you might be surprised how many of them I use in the average week.
A handful I use many times per day: curly quotes and dashes especially.
(I’ll draw a diagram at some point to show the genius of the curly quote mappings.)
I have seriously considered throwing the includes away and only including what I want.
In a few places, it might help because of avoiding collisions.
Since some time in 2025, I’ve used fcitx5 as my Input Method (mostly so I could type Telugu),
and it takes care of all Compose behaviour, so it is at least consistent, if not always as I prefer.
Before that, each app had to handle Compose itself,
and there were clearly at least two different libraries being used for it—
conflicts were handled a bit differently, especially across imports.
include "/usr/share/X11/locale/en_US.UTF-8/Compose"
include "/home/chris/.XCompose-kragen" # Downloaded from https://raw.githubusercontent.com/kragen/xcompose/master/dotXCompose on 2021-06-02
<Multi_key> <asciitilde> <equal> : "≈" U2248 # ALMOST EQUAL TO
<Multi_key> <slash> <asciitilde> <equal> : "≉" U2249 # NOT ALMOST EQUAL TO
<Multi_key> <asciitilde> <slash> <equal> : "≉" U2249 # NOT ALMOST EQUAL TO
<Multi_key> <minus> <minus> <w> : "⸺" U2E3A # TWO-EM DASH
<Multi_key> <minus> <minus> <W> : "⸻" U2E3B # THREE-EM DASH
<Multi_key> <at> <slash> : "✓" U2713 # CHECK MARK
<Multi_key> <at> <x> : "✗" U2717 # BALLOT X
<Multi_key> <at> <X> : "✗" U2717 # BALLOT X
<Multi_key> <at> <at> <slash> : "✔" U2714 # HEAVY CHECK MARK
<Multi_key> <at> <at> <x> : "✘" U2718 # HEAVY BALLOT X
<Multi_key> <at> <at> <X> : "✘" U2718 # HEAVY BALLOT X
<Multi_key> <space> <period> : " " U2009 # THIN SPACE
<Multi_key> <z> <space> : "" U200B # ZERO WIDTH SPACE
<Multi_key> <space> <z> : "" U200B # ZERO WIDTH SPACE
<Multi_key> <z> <period> : "" U200C # ZERO WIDTH NON-JOINER
<Multi_key> <period> <z> : "" U200C # ZERO WIDTH NON-JOINER
<Multi_key> <space> <apostrophe> : " " U202F # NARROW NO-BREAK SPACE
<Multi_key> <bar> <minus> : "†" U2020 # DAGGER
<Multi_key> <minus> <bar> : "†" U2020 # DAGGER
<Multi_key> <bar> <equal> : "‡" U2021 # DOUBLE DAGGER
<Multi_key> <equal> <bar> : "‡" U2021 # DOUBLE DAGGER
<Multi_key> <slash> <slash> : "⁄" U2044 # FRACTION SLASH
<Multi_key> <minus> <period> : "‐" U2010 # HYPHEN
<Multi_key> <minus> <space> : "" U00ad # SOFT HYPHEN
<Multi_key> <semicolon> <semicolon> : "‘" U2018 # LEFT SINGLE QUOTATION MARK
<Multi_key> <apostrophe> <apostrophe> : "’" U2019 # RIGHT SINGLE QUOTATION MARK
<Multi_key> <colon> <colon> : "“" U201c # LEFT DOUBLE QUOTATION MARK
<Multi_key> <quotedbl> <quotedbl> : "”" U201d # RIGHT DOUBLE QUOTATION MARK
<Multi_key> <c> <o> : "℅" U2105 # CARE OF
<Multi_key> <colon> <R> : "∶" U2236 # RATIO
<Multi_key> <P> <O> : "℗" U2117 # SOUND RECORDING COPYRIGHT
<Multi_key> <T> <1> : "𝍷" U1D377 # TALLY MARK ONE
<Multi_key> <T> <2> : "𝍷𝍷"
<Multi_key> <T> <3> : "𝍷𝍷𝍷"
<Multi_key> <T> <4> : "𝍷𝍷𝍷𝍷"
<Multi_key> <T> <5> : "𝍸" U1D378 # TALLY MARK FIVE
# #b is ♭, so #B can be 𝄫
<Multi_key> <numbersign> <B> : "𝄫" U1d12b # MUSICAL SYMBOL DOUBLE FLAT
<Multi_key> <numbersign> <asterisk> : "𝄪" U1d12a # MUSICAL SYMBOL DOUBLE SHARP
# `Compose - - -, Compose 3 *, Compose - - -` gets tedious… let’s just do `Compose h r` instead!
<Multi_key> <h> <r> : "—⁂—"
# Temporary, as I’m using this a lot in my website for now.
# Once I’m writing Lammle instead of HTML, I’ll ditch this again.
<Multi_key> <b> <r> : "<br class=w>"
# Stock WinCompose has v.. make a vertical ellipsis, so I guess I don’t need this after all.
#<Multi_key> <period> <bar> : "⋮" U22EE # VERTICAL ELLIPSIS
<Multi_key> <backslash> <slash> : "×" multiply # MULTIPLICATION SIGN
<Multi_key> <slash> <backslash> : "×" multiply # MULTIPLICATION SIGN
<Multi_key> <grave> <grave> : "´" acute # ACUTE ACCENT
# Unsure quite why grave grave isn’t working in Alacritty, but with this, grave grave grave works…
<Multi_key> <grave> <grave> <grave> : "´" acute # ACUTE ACCENT
<Multi_key> <apostrophe> <grave> : "′" U2032 # PRIME
<Multi_key> <quotedbl> <grave> : "″" U2033 # DOUBLE PRIME
# TODO: adding this line breaks previously-defined two-character <less> <*> bindings in Alacritty, report that bug and see if I can figure out what’s going on where. Something in Glutin or deeper, I’m guessing. (So try it in Glutin examples rather than in Alacritty.)
#<Multi_key> <less> <slash> <3> : "💔" U1F494 # BROKEN HEART
# Let’s try this for a bit.
<Multi_key> <t> <a> <g> : "🏷"
# I’m not content with the out-of-the-box techniques for :) and :(.
#<Multi_key> <colon> <parenright> : "☺" U263A # WHITE SMILING FACE (default for this Multi_key, but probably comes through as text, and is in monospace only one column wide despite the fact that fallback glyphs are going to be closer to two units wide)
#<Multi_key> <colon> <parenright> : "☺️" U263A UFE0F # WHITE SMILING FACE with VARIATION SELECTOR-16 (i.e. make it emoji rather than probably text, but the Vim/terminal handling is still sad-making)
<Multi_key> <colon> <parenright> : "🙂" U1F642 # SLIGHTLY SMILING FACE (a proper emoji and two columns wide; has a smaller smile which isn’t as good, but avoids painful ugliness at the corners of the smile in most emoji sets: so all up, prettier)
#<Multi_key> <colon> <parenleft> : "☹" U2639 # WHITE FROWNING FACE (default for this Multi_key, but probably comes through as text, and is in monospace only one column wide despite the fact that fallback glyphs are going to be closer to two units wide)
#<Multi_key> <colon> <parenleft> : "☹️" U2639 UFE0F # WHITE FROWNING FACE with VARIATION SELECTOR-16 (i.e. make it emoji rather than probably text, but the Vim/terminal handling is still sad-making)
<Multi_key> <colon> <parenleft> : "🙁" U1F641 # SLIGHTLY FROWNING FACE (a proper emoji and two columns wide; has a smaller frown which isn’t as good; I went for this rather than WHITE FROWNING FACE with VARIATION SELECTOR-16 because I don’t want to prevent text mode rendition in some places where I might *want* that.)
#<Multi_key> <colon> <D> : "😀" U1F600 # GRINNING FACE (typically rendered with a very disappointing mouth, with upper teeth, tongue, and no lower teeth)
<Multi_key> <colon> <D> : "😁" U1F601 # GRINNING FACE WITH SMILING EYES (typically rendered with a much better mouth, containing only all teeth)
<Multi_key> <X> <D> : "😆" U1F606 # SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES
<Multi_key> <semicolon> <parenright> : "😉" U1F609 # WINKING FACE
<Multi_key> <colon> <bar> : "😒" U1F612 # UNAMUSED FACE
#<Multi_key> <colon> <slash> : "😕" U1F615 # CONFUSED FACE
<Multi_key> <colon> <slash> : "🫤" U1FAE4 # FACE WITH DIAGONAL MOUTH
<Multi_key> <colon> <S> : "😖" U1F616 # CONFOUNDED FACE
<Multi_key> <colon> <P> : "😛" U1F61B # FACE WITH STUCK-OUT TONGUE
<Multi_key> <semicolon> <P> : "😜" U1F61C # FACE WITH STUCK-OUT TONGUE AND WINKING EYE
<Multi_key> <X> <P> : "😝" U1F61D # FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES
<Multi_key> <colon> <apostrophe> <parenleft> : "😢" U1F622 # CRYING FACE
<Multi_key> <colon> <O> : "😮" U1F62E # FACE WITH OPEN MOUTH
<Multi_key> <slash> <colon> <question> : "🤨" U1F928 # FACE WITH ONE EYEBROW RAISED
<Multi_key> <O> <K> : "👌" U1F44C # OK HAND SIGN
<Multi_key> <plus> <1> : "👍" U1F44D # THUMBS UP SIGN
<Multi_key> <minus> <1> : "👎" U1F44E # THUMBS DOWN SIGN
<Multi_key> <r> <o> <f> <l> : "🤣" U1F923 # ROLLING ON THE FLOOR LAUGHING
<Multi_key> <z> <z> : "💤" U1F4A4 # SLEEPING SYMBOL
<Multi_key> <i> <o> : "🛈" U1F6C8 # CIRCLED INFORMATION SOURCE
<Multi_key> <A> <asterisk> : "Α" U0391 # GREEK CAPITAL LETTER ALPHA
<Multi_key> <a> <asterisk> : "α" U03B1 # GREEK SMALL LETTER ALPHA
<Multi_key> <B> <asterisk> : "Β" U0392 # GREEK CAPITAL LETTER BETA
<Multi_key> <b> <asterisk> : "β" U03B2 # GREEK SMALL LETTER BETA
<Multi_key> <D> <asterisk> : "Δ" U0394 # GREEK CAPITAL LETTER DELTA
<Multi_key> <d> <asterisk> : "δ" U03B4 # GREEK SMALL LETTER DELTA
<Multi_key> <E> <asterisk> : "Ε" U0395 # GREEK CAPITAL LETTER EPSILON
<Multi_key> <e> <asterisk> : "ε" U03B5 # GREEK SMALL LETTER EPSILON
<Multi_key> <F> <asterisk> : "Φ" U03A6 # GREEK CAPITAL LETTER PHI
<Multi_key> <f> <asterisk> : "φ" U03C6 # GREEK SMALL LETTER PHI
<Multi_key> <G> <asterisk> : "Γ" U0393 # GREEK CAPITAL LETTER GAMMA
<Multi_key> <g> <asterisk> : "γ" U03B3 # GREEK SMALL LETTER GAMMA
<Multi_key> <H> <asterisk> : "Η" U0397 # GREEK CAPITAL LETTER ETA
<Multi_key> <h> <asterisk> : "η" U03B7 # GREEK SMALL LETTER ETA
<Multi_key> <I> <asterisk> : "Ι" U0399 # GREEK CAPITAL LETTER IOTA
<Multi_key> <i> <asterisk> : "ι" U03B9 # GREEK SMALL LETTER IOTA
<Multi_key> <J> <asterisk> : "Θ" U0398 # GREEK CAPITAL LETTER THETA
<Multi_key> <j> <asterisk> : "θ" U03B8 # GREEK SMALL LETTER THETA
<Multi_key> <K> <asterisk> : "Κ" U039A # GREEK CAPITAL LETTER KAPPA
<Multi_key> <k> <asterisk> : "κ" U03BA # GREEK SMALL LETTER KAPPA
<Multi_key> <L> <asterisk> : "Λ" U039B # GREEK CAPITAL LETTER LAMDA
<Multi_key> <l> <asterisk> : "λ" U03BB # GREEK SMALL LETTER LAMDA
<Multi_key> <M> <asterisk> : "Μ" U039C # GREEK CAPITAL LETTER MU
<Multi_key> <m> <asterisk> : "μ" U03BC # GREEK SMALL LETTER MU
<Multi_key> <N> <asterisk> : "Ν" U039D # GREEK CAPITAL LETTER NU
<Multi_key> <n> <asterisk> : "ν" U03BD # GREEK SMALL LETTER NU
<Multi_key> <O> <asterisk> : "Ο" U039F # GREEK CAPITAL LETTER OMICRON
<Multi_key> <o> <asterisk> : "ο" U03BF # GREEK SMALL LETTER OMICRON
<Multi_key> <P> <asterisk> : "Π" U03A0 # GREEK CAPITAL LETTER PI
<Multi_key> <p> <asterisk> : "π" U03C0 # GREEK SMALL LETTER PI
<Multi_key> <Q> <asterisk> : "Χ" U03A7 # GREEK CAPITAL LETTER CHI
<Multi_key> <q> <asterisk> : "χ" U03C7 # GREEK SMALL LETTER CHI
<Multi_key> <R> <asterisk> : "Ρ" U03A1 # GREEK CAPITAL LETTER RHO
<Multi_key> <r> <asterisk> : "ρ" U03C1 # GREEK SMALL LETTER RHO
<Multi_key> <S> <asterisk> : "Σ" U03A3 # GREEK CAPITAL LETTER SIGMA
<Multi_key> <s> <asterisk> : "σ" U03C3 # GREEK SMALL LETTER SIGMA
<Multi_key> <T> <asterisk> : "Τ" U03A4 # GREEK CAPITAL LETTER TAU
<Multi_key> <t> <asterisk> : "τ" U03C4 # GREEK SMALL LETTER TAU
<Multi_key> <U> <asterisk> : "Υ" U03A5 # GREEK CAPITAL LETTER UPSILON
<Multi_key> <u> <asterisk> : "υ" U03C5 # GREEK SMALL LETTER UPSILON
<Multi_key> <W> <asterisk> : "Ω" U03A9 # GREEK CAPITAL LETTER OMEGA
<Multi_key> <w> <asterisk> : "ω" U03C9 # GREEK SMALL LETTER OMEGA
<Multi_key> <X> <asterisk> : "Ξ" U039E # GREEK CAPITAL LETTER XI
<Multi_key> <x> <asterisk> : "ξ" U03BE # GREEK SMALL LETTER XI
<Multi_key> <Y> <asterisk> : "Ψ" U03A8 # GREEK CAPITAL LETTER PSI
<Multi_key> <y> <asterisk> : "ψ" U03C8 # GREEK SMALL LETTER PSI
<Multi_key> <Z> <asterisk> : "Ζ" U0396 # GREEK CAPITAL LETTER ZETA
<Multi_key> <z> <asterisk> : "ζ" U03B6 # GREEK SMALL LETTER ZETA
<Multi_key> <A> <A> : "∀" U2200 # FOR ALL
<Multi_key> <E> <E> : "∃" U2203 # THERE EXISTS
<Multi_key> <E> <slash> : "∄" U2204 # THERE DOES NOT EXIST
<Multi_key> <bar> <asciicircum> : "↑" U2191 # UPWARDS ARROW
<Multi_key> <bar> <v> : "↓" U2193 # DOWNWARDS ARROW
<Multi_key> <R> <s> : "₹" U20B9 # INDIAN RUPEE SIGN
# Go back to stock behaviour, not kragen’s ₿ BITCOIN SIGN.
<Multi_key> <B> <bar> : "฿" U0e3f # THAI CURRENCY SYMBOL BAHT
<Multi_key> <f> <slash> : "ƒ" function # LATIN SMALL LETTER F WITH HOOK
# Control pictures, whee!
<Multi_key> <N> <U> <L> : "␀" U2400 # SYMBOL FOR NULL
<Multi_key> <S> <O> <H> : "␁" U2401 # SYMBOL FOR START OF HEADING
<Multi_key> <S> <T> <X> : "␂" U2402 # SYMBOL FOR START OF TEXT
<Multi_key> <E> <T> <X> : "␃" U2403 # SYMBOL FOR END OF TEXT
<Multi_key> <E> <O> <T> : "␄" U2404 # SYMBOL FOR END OF TRANSMISSION
<Multi_key> <E> <N> <Q> : "␅" U2405 # SYMBOL FOR ENQUIRY
<Multi_key> <A> <C> <K> : "␆" U2406 # SYMBOL FOR ACKNOWLEDGE
<Multi_key> <B> <E> <L> : "␇" U2407 # SYMBOL FOR BELL
<Multi_key> <B> <S> : "␈" U2408 # SYMBOL FOR BACKSPACE
<Multi_key> <H> <T> : "␉" U2409 # SYMBOL FOR HORIZONTAL TABULATION
<Multi_key> <L> <F> : "␊" U240A # SYMBOL FOR LINE FEED
<Multi_key> <V> <T> : "␋" U240B # SYMBOL FOR VERTICAL TABULATION
<Multi_key> <F> <F> : "␌" U240C # SYMBOL FOR FORM FEED
<Multi_key> <C> <R> : "␍" U240D # SYMBOL FOR CARRIAGE RETURN
<Multi_key> <S> <O> : "␎" U240E # SYMBOL FOR SHIFT OUT
<Multi_key> <S> <I> : "␏" U240F # SYMBOL FOR SHIFT IN
<Multi_key> <D> <L> <E> : "␐" U2410 # SYMBOL FOR DATA LINK ESCAPE
<Multi_key> <D> <C> <1> : "␑" U2411 # SYMBOL FOR DEVICE CONTROL 1
<Multi_key> <D> <C> <2> : "␒" U2412 # SYMBOL FOR DEVICE CONTROL 2
<Multi_key> <D> <C> <3> : "␓" U2413 # SYMBOL FOR DEVICE CONTROL 3
<Multi_key> <D> <C> <4> : "␔" U2414 # SYMBOL FOR DEVICE CONTROL 4
<Multi_key> <N> <A> <K> : "␕" U2415 # SYMBOL FOR NEGATIVE ACKNOWLEDGE
<Multi_key> <S> <Y> <N> : "␖" U2416 # SYMBOL FOR SYNCHRONOUS IDLE
<Multi_key> <E> <T> <B> : "␗" U2417 # SYMBOL FOR END OF TRANSMISSION BLOCK
<Multi_key> <C> <A> <N> : "␘" U2418 # SYMBOL FOR CANCEL
<Multi_key> <E> <M> : "␙" U2419 # SYMBOL FOR END OF MEDIUM
<Multi_key> <S> <U> <B> : "␚" U241A # SYMBOL FOR SUBSTITUTE
<Multi_key> <E> <S> <C> : "␛" U241B # SYMBOL FOR ESCAPE
<Multi_key> <F> <S> : "␜" U241C # SYMBOL FOR FILE SEPARATOR
<Multi_key> <G> <S> : "␝" U241D # SYMBOL FOR GROUP SEPARATOR
<Multi_key> <R> <S> : "␞" U241E # SYMBOL FOR RECORD SEPARATOR
<Multi_key> <U> <S> : "␟" U241F # SYMBOL FOR UNIT SEPARATOR
<Multi_key> <S> <P> : "␠" U2420 # SYMBOL FOR SPACE
<Multi_key> <D> <E> <L> : "␡" U2421 # SYMBOL FOR DELETE
<Multi_key> <N> <L> : "" U2424 # SYMBOL FOR NEWLINE
# Deliberately missing (because they have other forms): U2422, U2423, U2425 and U2426.
# Ordinals
<Multi_key> <asciicircum> <s> <t> : "ˢᵗ"
<Multi_key> <asciicircum> <n> <d> : "ⁿᵈ"
<Multi_key> <asciicircum> <r> <d> : "ʳᵈ"
<Multi_key> <asciicircum> <t> <h> : "ᵗʰ"
<Multi_key> <L> <c> : "Lᶜ"
# Shapes. So many types to choose from, and so inconsistently ordered and styled!
<Multi_key> <U> <T> : "▲" U25B2 # BLACK UP-POINTING TRIANGLE
<Multi_key> <D> <T> : "▼" U25BC # BLACK DOWN-POINTING TRIANGLE
<Multi_key> <R> <T> : "▶" U25B6 # BLACK RIGHT-POINTING TRIANGLE
<Multi_key> <L> <T> : "◀" U25C0 # BLACK LEFT-POINTING TRIANGLE
#<Multi_key> <L> <t> : "⏴" U23F4 # BLACK MEDIUM LEFT-POINTING TRIANGLE
#<Multi_key> <R> <t> : "⏵" U23F5 # BLACK MEDIUM RIGHT-POINTING TRIANGLE
#<Multi_key> <U> <t> : "⏶" U23F6 # BLACK MEDIUM UP-POINTING TRIANGLE
#<Multi_key> <D> <t> : "⏷" U23F7 # BLACK MEDIUM DOWN-POINTING TRIANGLE
<Multi_key> <U> <t> : "⯅" U2BC5 # BLACK MEDIUM UP-POINTING TRIANGLE CENTRED
<Multi_key> <D> <t> : "⯆" U2BC6 # BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED
<Multi_key> <L> <t> : "⯇" U2BC7 # BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED
<Multi_key> <R> <t> : "⯈" U2BC8 # BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
<Multi_key> <less> <greater> : "◊" U25CA # LOZENGE
<Multi_key> <asciicircum> <underscore> : "̅" U0305 # COMBINING OVERLINE
# Glyphs macOS uses in presenting keyboard shortcuts:
<Multi_key> <at> <C> : "⌘" U8984 # Command
<Multi_key> <at> <c> : "⌃" U8963 # Control
<Multi_key> <at> <asciicircum> : "⌃" U8963 # Control
<Multi_key> <at> <o> : "⌥" U8997 # Option
<Multi_key> <at> <s> : "⇧" U8679 # Shift
<Multi_key> <at> <b> : "⌫" U9003 # Delete (Backspace)
<Multi_key> <at> <d> : "⌦" U8998 # Forward Delete (Delete)
<Multi_key> <at> <e> : "⎋" U9099 # Escape
<Multi_key> <at> <Right> : "→" U8594 # Right
<Multi_key> <at> <Left> : "←" U8592 # Left
<Multi_key> <at> <Up> : "↑" U8593 # Up
<Multi_key> <at> <Down> : "↓" U8595 # Down
<Multi_key> <at> <U> : "⇞" U8670 # Page Up
<Multi_key> <at> <D> : "⇟" U8671 # Page Down
<Multi_key> <at> <H> : "↖" U8598 # Home
<Multi_key> <at> <E> : "↘" U8600 # End
<Multi_key> <at> <t> : "⇥" U8677 # Tab
<Multi_key> <at> <T> : "⇤" U8676 # Shift Tab
<Multi_key> <at> <space> : "␣" U9251 # Space
# Other glyphs that macOS might use:
# U8999 "⌧" # Clear
# U8682 "⇪" # Caps Lock
# U9167 "⏏" # Eject
# U8617 "↩" # Return
# U8629 "↵" # Return
# U9166 "⏎" # Return
# U8996 "⌤" # Enter
# U9250 "␢" # Blank
# Ones from WinCompose {{{1
# DefaultUserSequences.txt {{{2
<Multi_key> <s> <f> : "¯\\_(ツ)_/¯" # Shrug face
# WinCompose.txt {{{2
<Multi_key> <minus> <minus> <equal> : "−" U2212 # MINUS SIGN
# Unknown (can’t find them in a file, but I had ’em; TODO investigate to find the rest!) {{{2
<Multi_key> <asterisk> <asterisk> : "★" U2605 # BLACK STAR
# }}}1