├── doc ├── license.txt ├── TODO └── xorg-compose-extracts ├── examples ├── .gitignore ├── .XCompose.sample └── dead.xcompose ├── .gitignore ├── bin ├── check ├── checklines.py ├── make-dead-compose.rb ├── make-keysymdef.rb ├── scan4dups.py ├── treeprint.py ├── xcompose_parser.rb └── keysymdef.rb ├── README └── xcompose /doc/license.txt: -------------------------------------------------------------------------------- 1 | Public domain. 2 | -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | !dead.xcompose 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .#* 2 | #~ 3 | dead.xcompose 4 | -------------------------------------------------------------------------------- /doc/TODO: -------------------------------------------------------------------------------- 1 | Check automatically for invalid keysyms 2 | 3 | See xcompose for more FIXMEs 4 | 5 | Fix checklines.py warnings and errors 6 | 7 | Evaluate scan4dups and treeprint to see if they can be removed 8 | 9 | Write an overall test script 10 | 11 | Have locale-specific sequences where necessary; check for dupes with 12 | all locales. 13 | 14 | Eliminate spelt-out words, making sequences more language-independent. 15 | -------------------------------------------------------------------------------- /bin/check: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | parser="bin/xcompose_parser.rb" 4 | ignores=" 5 | xcompose:.*Compose:.* -> ⁣ vs. ¸ 6 | xcompose:.*Compose:.* -> ∕ vs. \ 7 | xcompose:.*Compose.* -> ⸘ vs. ‽ 8 | xcompose:.*Compose.* -> ‡ vs. 9 | " 10 | 11 | files="/usr/share/X11/locale/en_US.UTF-8/Compose" 12 | files+=" xcompose" 13 | 14 | 15 | 16 | old_ifs="$IFS" 17 | ifs=" 18 | " 19 | ignore_regexp='\\(' 20 | for line in $ignores; do 21 | ignore_regexp+="${line}\\|" 22 | done 23 | ignore_regexp+='\\)' 24 | ifs="$old_ifs" 25 | 26 | $parser -q $files | grep -v "$ignore_regexp" -------------------------------------------------------------------------------- /examples/.XCompose.sample: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8; mode: conf -*- 2 | # vim: encoding=utf-8 ft=conf 3 | 4 | # Pulls default X configurations from locale; 5 | # e.g. /usr/share/X11/locale/en_US.UTF-8/Compose 6 | include "%L" 7 | 8 | # Brazilian users with an en_US.UTF-8 locale might want this instead 9 | # of "include %L". 10 | # 11 | # include "/usr/share/X11/locale/pt_BR.UTF-8/Compose" 12 | 13 | # Adjust /usr/local/share to your installation path. 14 | include "/usr/local/share/pointless-xcompose/xcompose" 15 | 16 | # If you use a layout with X deadkeys, use bin/make-dead-compose.rb to 17 | # create this file. See the README. 18 | include "/usr/local/share/pointless-xcompose/dead.xcompose" 19 | -------------------------------------------------------------------------------- /bin/checklines.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # From purpleposeidon! 4 | 5 | from unicodedata import name 6 | import re 7 | import sys 8 | 9 | for line in sys.stdin: 10 | line=line.strip() 11 | if not line or line[0]=="#": 12 | continue 13 | match=re.match(r'\s*(.*):\s*"(.*?)"\s*(\S*)\s*(#.*)?', line) 14 | if not match: 15 | print("({0})".format(line)) 16 | continue 17 | (keystrokes, char, num, comments)=match.groups() 18 | nummatch=re.match(r'U([0-9A-Fa-f]+)', num) 19 | if not nummatch: 20 | print("Number not parsed: {0}".format(line)) 21 | continue 22 | x=int(nummatch.group(1),0x10) 23 | c=chr(x) 24 | try: 25 | if c != char: 26 | print(line) 27 | print("\tLine's char: {0} ({1})".format(char, name(char))) 28 | print("\tLine's number: {0:X}".format(x)) 29 | print("\tChar gives number: {0:X}".format(ord(char))) 30 | print("\tNumber gives character: {0} ({1})".format(c, name(c))) 31 | except Exception as e: 32 | print("{0}\n\t{1}".format(line, e)) 33 | -------------------------------------------------------------------------------- /examples/dead.xcompose: -------------------------------------------------------------------------------- 1 | # Autogenerated by make-dead-compose.rb at 2009-06-13 13:38:48 GMT 2 | 3 | # Starting abbrevs.xcompose. 4 | 5 | # Starting arrows.xcompose. 6 | 7 | # Starting bullets.xcompose. 8 | 9 | # Starting cjk.xcompose. 10 | : "〜" U301C # WAVE DASH 11 | 12 | # Starting dashes-hyphens.xcompose. 13 | : "⁓" U2053 # SWUNG DASH 14 | : "⁓" U2053 # SWUNG DASH 15 | 16 | # Starting dingbats.xcompose. 17 | 18 | # Starting enclosed.xcompose. 19 | 20 | # Starting fractions.xcompose. 21 | 22 | # Starting historical.xcompose. 23 | 24 | # Starting hyphen-macron.xcompose. 25 | 26 | # Starting invisible.xcompose. 27 | 28 | # Starting math.xcompose. 29 | 30 | # Starting typographic.xcompose. 31 | : "·" U00B7 # MIDDLE DOT 32 | : "‟" U201F # DOUBLE HIGH-REVERSED-9 33 | : "‟" U201F # DOUBLE HIGH-REVERSED-9 34 | : "’" U2019 # RIGHT SINGLE QUOTATION MARK 35 | -------------------------------------------------------------------------------- /bin/make-dead-compose.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby1.9.1 2 | require 'pp' 3 | require File.dirname(__FILE__) + '/keysymdef.rb' 4 | require File.dirname(__FILE__) + '/xcompose_parser.rb' 5 | 6 | exit if ARGV.size == 0 7 | files = ARGV.collect do |fname| 8 | if not File.readable?(fname) 9 | $stderr.puts("Error: Cannot read file #{fname}.") 10 | exit 1 11 | end 12 | end 13 | 14 | Map = { 15 | '' => '', 16 | '' => '', 17 | '' => '', 18 | '' => '' 19 | } 20 | 21 | def has_undead(str) 22 | Map.keys.each do |undead| 23 | return true if str.match(undead) 24 | end 25 | false 26 | end 27 | 28 | def deadize(str) 29 | out = str 30 | Map.keys.each do |undead| 31 | out.gsub!(undead, Map[undead]) 32 | end 33 | out 34 | end 35 | 36 | puts < %s,', -max_name_len, quote(key), quote(hash[key]))) 58 | end 59 | puts " }" 60 | puts "end" 61 | end 62 | 63 | -------------------------------------------------------------------------------- /bin/scan4dups.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys 4 | import re 5 | 6 | 7 | listing={} 8 | 9 | try: 10 | while True: 11 | line=sys.stdin.next() 12 | # print "((%s))"%line 13 | startpos=0 14 | name='' 15 | dupsfound=[] 16 | while True: 17 | m=re.match("\s*<(\w+)>",line[startpos:]) 18 | if not m: 19 | break 20 | word=m.group(1) 21 | name+=' '+word 22 | startpos+=m.end() 23 | if startpos<=0: 24 | continue 25 | m=re.match(r'[^"]*"(.+)"',line) 26 | if not m: 27 | # shouldn't happen, but just in case 28 | val='???' 29 | print "couldn't make sense of line: "+line 30 | else: 31 | val=m.group(1) 32 | if listing.has_key(name) and not re.search(r'INTENTIONAL CONFLICT', line): 33 | if val != listing[name]: 34 | print "Exact conflict found: (%s )[%s][%s]"%(name, 35 | listing[name], val) 36 | else: # It's easier to read if lines have different indentations 37 | print "\tRedundant definition: (%s )[%s]"%(name, val) 38 | else: 39 | listing[name]=val 40 | except StopIteration: 41 | print "hit end" 42 | # NOW check for prefix conflicts: 43 | print "Checking prefixes." 44 | for key in listing.keys(): 45 | # print "Key: (%s)"%key 46 | pref='' 47 | # Careful when splitting. The key always starts with a space. 48 | for word in key.split(" ")[:-1]: # chop the last one; that'll always match. 49 | # Skip the empty first entry 50 | if not word: 51 | continue 52 | pref+=" "+word 53 | # print "checking (%s)"%pref 54 | if listing.has_key(pref): 55 | print "Prefix conflict found: " \ 56 | "(%s )[%s] vs (%s )[%s]"%(pref, listing[pref], 57 | key, listing[key]) 58 | 59 | 60 | -------------------------------------------------------------------------------- /bin/treeprint.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys 4 | import re 5 | try: 6 | import unicodedata 7 | except: 8 | pass 9 | 10 | """ 11 | This program slurps in a .XCompose file on standard input (or several 12 | concatenated together, since it won't follow includes) and outputs the 13 | compose sequences in an S-expression-like syntax, showing the prefix tree 14 | of sequences. This should bring together some of the groups that use a 15 | prefix-character, like * for the Greek alphabet and # for musical symbols. 16 | And scatter other related things far and wide. But it might be fun to look 17 | at. 18 | 19 | Prefix conflicts (in which you have a compose sequence that is the proper 20 | prefix of another) and exact conflicts (in which you have a compose 21 | sequence listed two with two different translations) cannot be handled 22 | gracefully in this notation, and they are not handled gracefully by this 23 | program. The tie is not broken in a consistent or predictable fashion, 24 | etc: this is a case of GIGO. Deal with it. 25 | """ 26 | 27 | def showdict(data, indent): 28 | first=True 29 | for key in sorted(data.keys()): 30 | value=data[key] 31 | if first: 32 | first=False 33 | else: 34 | print 35 | print " "*max(indent,0) + "("+key, 36 | # Sneaky trick: we don't want to go newline-indent over and 37 | # over for long sequences, i.e. cases where there is only 38 | # one possible follower. So we skip the newlines in those 39 | # cases, and tell the next-lower iteration not to do the whole 40 | # indent thing by passing a negative indent. We don't just 41 | # pass 0 or 1 because if another iteration *further down* 42 | # turns out not to be an only case, it will need to know 43 | # the right indent to pass along. So a case like 44 | # R-O-{CK|LL}, the O is unique after the R, so no linefeed, 45 | # but then the {C|L} are not unique after the O. 46 | if type(value)==dict: 47 | if len(value)>1: 48 | print "" 49 | showdict(value, abs(indent)+4), 50 | else: 51 | showdict(value, -abs(indent+4)), 52 | else: 53 | print " "+value.encode('utf-8'), 54 | if "-n" in sys.argv: 55 | try: 56 | print unicodedata.name(value), 57 | except: 58 | pass 59 | print ")", 60 | 61 | listing={} 62 | 63 | try: 64 | while True: 65 | line=sys.stdin.next().decode('utf-8') 66 | # print "((%s))"%line 67 | startpos=0 68 | name=[] 69 | dupsfound=[] 70 | while True: 71 | m=re.match("\s*<(\w+)>",line[startpos:]) 72 | if not m: 73 | break 74 | word=m.group(1) 75 | name.append(str(word)) # The keys are ordinary strings, not unicode 76 | startpos+=m.end() 77 | if startpos<=0: 78 | continue 79 | m=re.match(r'[^"]*"(.+?)"',line) 80 | if not m: 81 | # shouldn't happen, but just in case 82 | val='???' 83 | print "couldn't make sense of line: "+line 84 | else: 85 | val=m.group(1) 86 | cur=listing 87 | for elt in name[:-1]: 88 | if type(cur)==dict: 89 | if not cur.has_key(elt): 90 | cur[elt]={} 91 | cur=cur[elt] # This will fail for prefix conflicts 92 | else: 93 | break # prefix conflict 94 | # Presumably by now we're at the end, pointing to an empty dict. 95 | if type(cur)==dict: 96 | cur[name[-1]]=val 97 | else: 98 | # fail. Prefix conflict. Let's ignore it. 99 | pass 100 | except StopIteration: 101 | # print "hit end" 102 | pass 103 | 104 | # Actually, you could get almost as nice a listing just by using yaml, 105 | # but now that we have special no-newlines-for-singletons handling, 106 | # showdict looks nicer. 107 | showdict(listing,0) 108 | 109 | # #print "\n\n-=- YAML -=-" 110 | # import yaml 111 | # print yaml.dump(listing, default_style=r'"', allow_unicode=True) 112 | # # Huh. Yaml "allow_unicode=True" still escapes non-BMP chars. 113 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | All files in this distribution use UTF‐8 pointlessly. Read them in a 2 | font with good Unicode coverage — say, DejaVu Sans Mono or GNU unifont 3 | (xfonts-unifont). 4 | 5 | Introduction 6 | ============ 7 | 8 | Unicode has lots of cool characters. I mean lots and lots of cool 9 | characters. Enough characters to annoy all your friends with useless 10 | charactery. Your keyboard doesn’t have nearly enough keys to input 11 | all them. 12 | 13 | In X — the GUI system used in Linux, BSD, Solaris &c. — there are a 14 | number of different ways to input these extra characters. Some are 15 | suitable for occasional use: search for the character online or in a 16 | character map program by name, then copy and paste it or enter its 17 | number or name. Some are suitable for frequent use: use a “3rd Level 18 | Shift” (typically AltGr), dead keys, or input methods. XCompose is an 19 | intermediate solution: each character is typed using a mnemonic 20 | combination of a few keystrokes. It’s not fast enough to use in every 21 | word, but it’s fairly easy to remember (or rediscover) for characters 22 | you might use once a day or once a fortnight, and much less annoying 23 | than having to search online that often. 24 | 25 | Most Compose sequences begin with the Compose key, also known as 26 | Multi_key (typically assigned to the Windows Menu key or equivalent). 27 | Dead keys (where you press an accent key, then a letter, and an 28 | accented letter is typed) are implemented with Compose too. X comes 29 | with many builtin mappings described in 30 | /usr/share/X11/locale/*/Compose, and you can add your own in 31 | ~/.XCompose. But what to add, and how? 32 | 33 | Pointless‐XCompose provides a Compose file with thousands of extra 34 | Compose mappings, compatible with the standard X US English Compose 35 | file. (I intend to make it compatible with *all* standard Compose 36 | files.) 37 | 38 | 39 | What’s included 40 | =============== 41 | 42 | I also included a few other potentially interesting Compose‐related 43 | stuff, such as a selection of standard X mappings, a script to 44 | generate deadkey variants of Compose files, &c. 45 | 46 | • doc/README: This. 47 | 48 | • xcompose: Abbreviations. 49 | • bin/make-dead-compose.rb: You want to run this if you use a 50 | keyboard layout with deadkeys. 51 | • examples/dead.xcompose: Example output of make-dead-keys.rb for 52 | everything in this package plus today’s 53 | Xorg Compose table. 54 | 55 | • doc/xorg-compose-extracts: Selected, annotated reading material. 56 | 57 | • bin/*.rb: Misc Ruby XCompose parsers and 58 | validators. Not likely to be 59 | interesting to anyone at the moment. 60 | 61 | • doc/license.txt: “Public domain.” 62 | 63 | 64 | Installation 65 | ============ 66 | 67 | 1. Copy or git-clone this directory. 68 | 69 | 2. Skip to the next step if you don’t use X deadkeys. If you do use 70 | them (for example, if you use an XKB layout like “us_intl”, 71 | “us(intl)”, or “br”), let’s create deadkey versions of the mappings 72 | now: 73 | 74 | pointless-xcompose$ ./bin/make-dead-compose.rb \ 75 | /usr/share/X11/locale/en_US.UTF-8/Compose \ 76 | /path/to/pointless-xcompose/xcompose \ 77 | > dead.xcompose 78 | 79 | In the next step, use dead.xcompose instead of xcompose. 80 | 81 | 3. Symlink xcompose to ~/.XCompose: 82 | 83 | ln -s /path/to/pointless-xcompose/xcompose ~/.XCompose 84 | 85 | 86 | 4. Check your Compose key setup: the command 87 | 88 | setxkbmap -print 89 | 90 | should mention “compose” in a line starting `xkb_symbols`, for example: 91 | 92 | xkb_symbols { include "pc+us(altgr-intl)+gb:2+us:3+inet(evdev)+altwin(swap_alt_win)+level3(rwin_switch)+capslock(ctrl_modifier)+compose(ralt)" }; 93 | 94 | (near the end of the line; here it says Compose is the right Alt 95 | key). If no Compose key is set up, you’ll need to configure one. 96 | Sadly, this works differently in different desktops, so I can’t 97 | give standard instructions. 98 | 99 | Once you have a Compose key configured, try it out: type “Compose + 100 | -” (i.e., the Compose key, then the plus key, then the minus key) 101 | and you should get “±”. 102 | 103 | 5. Restart your apps (and perhaps X the first time) — XCompose 104 | settings only apply for new windows. 105 | 106 | 6. In GNOME (or GTK applications, if you know what that means), 107 | XCompose configuration unfortunately won’t work by default; GTK 108 | defines its own static, compile‐time, non-configurable compose 109 | mechanism which overrides X. 110 | 111 | A workaround is to use the uim input method. Sadly, how to install 112 | and configure it varies from system to system. The package is 113 | probably called uim. On Debian or Ubuntu, use im-config; on Fedora 114 | or RedHat, use ImChooser. 115 | 116 | 117 | Usage 118 | ===== 119 | 120 | Read the included xcompose file to see what’s included. The system’s 121 | mappings are in /usr/share/X11/locale/$LANG/Compose (if there’s no 122 | such directory for your locale, look in 123 | /usr/share/X11/locale/locale.dir; for example my locale, en_GB.UTF-8 124 | is listed there under en_US.UTF-8): 125 | 126 | en_US.UTF-8/XLC_LOCALE en_GB.UTF-8 127 | 128 | 129 | Adding your own Compose sequences 130 | ================================= 131 | 132 | One Compose sequence cannot be a prefix of another. Suppose you have 133 | this sequence: 134 | 135 | • Compose . . = → · 136 | • Compose . . . = → … 137 | 138 | Now when you type «Compose . .», X won’t print anything because it’s 139 | waiting for «Compose . . .» (IMHO it should print · and then change it 140 | to … should you type another period, but I digress). That means you 141 | probably don’t want to make a Compose shortcut for U2A94 GREATER-THAN 142 | ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL (⪔). 143 | 144 | All the mappings here have been compared against X.org 1.6.2’s en_US 145 | Compose file for conflicts. Several of my entries are present in X’s 146 | Compose as another sequence, but I prefer one that’s more mnemonic. 147 | The few entries that replace X mappings are marked “INTENTIONAL 148 | CONFLICT”. 149 | 150 | Conventions: 151 | 152 | • Follow patterns in system Compose files. For example: 153 | 154 | • Termination convention (copied from X): 155 | ◦ A repeated character: Compose v v → ✓ 156 | ◦ Where that would conflict, a period: 157 | ‣ Compose - . → − (true hypen) 158 | ‣ Compose - - . → – (en‐bar) 159 | ‣ Compose - - - → — (em‐bar) 160 | (Side note: the difference between the above three characters is 161 | small in monospaced fonts, but large in proportionals). 162 | 163 | • Where we conflict with the system files, do so only for characters 164 | that have multiple definitions, and where multiple sequences follow 165 | the same pattern, only conflict with one pattern, so that users can 166 | use the remaining pattern(s) without being bothered with 167 | exceptions. 168 | 169 | • Avoid spelling out names (rather, use an input method that allows 170 | spelling out). 171 | 172 | # vim: encoding=utf-8 173 | # Emacs: 174 | # Local Variables: 175 | # mode: text 176 | # fill-column: 70 177 | # eval: (turn-on-filladapt-mode) 178 | # coding: utf-8 179 | # End: 180 | -------------------------------------------------------------------------------- /bin/xcompose_parser.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby1.9.1 2 | # -*- coding: utf-8 -*- 3 | require 'rubygems' 4 | require 'optparse' 5 | require 'ostruct' 6 | require 'log4r' 7 | 8 | require 'pp' 9 | include Log4r 10 | 11 | require_relative 'keysymdef' 12 | include Keysymdef 13 | 14 | #require 'unprof' 15 | 16 | module Enumerable 17 | # [1,2,3] -> [[1,2],[1,3],[2,3]] 18 | def each_pair() 19 | self.each_with_index do |item1, i| 20 | self[(i+1)..self.size].each do |item2| 21 | yield([item1, item2]) 22 | end 23 | end 24 | end 25 | 26 | def each_prefix() 27 | 0.upto(self.size-1-1) do |i| 28 | yield self[0..i] 29 | end 30 | end 31 | 32 | end 33 | 34 | 35 | # Parser for XCompose compose definitions. 36 | # 37 | # TODO: • includes 38 | # • "\nnn" description format 39 | class XComposeParser 40 | attr_accessor :file, :parsed_lines, :logger 41 | 42 | # Index to speed mapping prefix checks. 43 | # 44 | # The format is mapping => [parser, lineno] 45 | @@map_index = {} 46 | def self.map_index 47 | @@map_index 48 | end 49 | 50 | class MapDuplicate < StandardError 51 | end 52 | class MapConflict < StandardError 53 | end 54 | class MapPrefixConflict < MapConflict 55 | end 56 | class ParseError < StandardError 57 | def initialize(file) 58 | super("Parse error at file #{@file.path}:#{@file.lineno}.") 59 | end 60 | end 61 | 62 | 63 | def initialize(file, logger=nil) 64 | 65 | if not file.respond_to? :read 66 | file = File.open(file.to_str, 'r') 67 | end 68 | @file = file 69 | 70 | if logger 71 | @logger = Logger.new(logger.fullname + '::' + \ 72 | "parser:#{@file.path}") 73 | else 74 | @logger = Logger.new("parser:#{@file.path}") 75 | @logger.outputters << Outputter.stdout 76 | @logger.level = DEBUG 77 | end 78 | @parsed_lines = [] 79 | end 80 | 81 | 82 | # Parse the file; fill @parsed_lines, @@map_index. 83 | def parse 84 | @file.seek 0 85 | duplicates = [] 86 | conflicts = [] 87 | 88 | @file.each_line do |line| 89 | pline = nil 90 | 91 | if line.match(/^#/) 92 | @logger.debug("Skipped comment at line #{@file.lineno}") 93 | elsif line.match(/^\s*$/) 94 | @logger.debug("Skipped blank line at line #{@file.lineno}") 95 | elsif line.match(/^\s*include/) 96 | @logger.warn("Skipped include at line #{@file.lineno}") 97 | elsif line.index(':') 98 | pline = self.class.parse_line(line) 99 | if not pline 100 | raise ParseError.new(@file) 101 | else 102 | @parsed_lines[@file.lineno] = pline 103 | end 104 | else 105 | raise ParseError.new(@file) 106 | end 107 | 108 | next if not pline 109 | 110 | if not (@@map_index.has_key?(pline[:map])) 111 | @@map_index[pline[:map]] = [self, @file.lineno] 112 | else # mapping already indexed! 113 | dup_parser, dup_index = @@map_index[pline[:map]] 114 | dup_pline = dup_parser.parsed_lines[dup_index] 115 | if pline[:definition] == dup_pline[:definition] 116 | duplicates << [@file.lineno, 117 | dup_parser, dup_index] 118 | else 119 | conflicts << [@file.lineno, 120 | dup_parser, dup_index] 121 | end 122 | end 123 | end 124 | 125 | out="\n" 126 | conflicts.each do |li, dup_parser, dup_index| 127 | out += format(" %s:%d: conflicts with %s:%d (%s -> %s vs. %s)\n", 128 | @file.path, li, 129 | dup_parser.file.path, dup_index, 130 | @parsed_lines[li][:map], 131 | @parsed_lines[li][:definition], 132 | dup_parser.parsed_lines[dup_index][:definition]) 133 | end 134 | duplicates.each do |li, dup_parser, dup_index| 135 | out += format(" %s:%d: duplicate of %s:%d (%s -> %s)\n", 136 | @file.path, li, 137 | dup_parser.file.path, dup_index, 138 | @parsed_lines[li][:map], 139 | @parsed_lines[li][:definition]) 140 | end 141 | if not conflicts.empty? 142 | raise MapConflict.new(out) 143 | elsif not duplicates.empty? 144 | raise MapDuplicate.new(out) 145 | end 146 | end 147 | 148 | # Parse a singe XCompose line. 149 | # 150 | # Returns a hash with :map, :definition, :description, and :comment. 151 | def self.parse_line(line) 152 | map_side, definition_side = line.split ':' 153 | definition, comment = definition_side.split '#' 154 | defchar, defdesc = definition.split(/\s/).reject {|s| s.empty?} 155 | 156 | parsed = {} 157 | 158 | parsed[:map] = map_side.split(/\s/).reject {|s| s.empty?}.each do |s| 159 | s.strip 160 | end 161 | 162 | defin = defchar.strip.sub(/^["']/,'').sub(/["']$/,'') 163 | # unquote definition 164 | if defin == '\\"' 165 | parsed[:definition] = '"' 166 | elsif defin == '\\\\' 167 | parsed[:definition] = '\\' 168 | else 169 | parsed[:definition] = defin 170 | end 171 | 172 | parsed[:description] = defdesc.strip if defdesc 173 | parsed[:comment] = comment.strip if comment 174 | 175 | parsed 176 | end 177 | 178 | 179 | class InvalidCodepoint < StandardError 180 | def initialize(invcd) 181 | super(invcd + " doesn't look like a codepoint") 182 | end 183 | end 184 | 185 | class UnknownKeysymname < StandardError 186 | def initialize(keysymname) 187 | super(format("Couldn't find keysym name `%s' in database", keysymname)) 188 | end 189 | end 190 | 191 | class DescriptionConflict < StandardError 192 | def initialize(parsed_line) 193 | super(format("Description `%s' doesn't match definition `%s'", 194 | parsed_line[:description], 195 | parsed_line[:definition])) 196 | 197 | end 198 | end 199 | 200 | # Utility function to convert a codepoint like U+nnn or Unnnn to 201 | # UTF-8 string. 202 | def self.codepoint_to_unichar(codepoint) 203 | # get an integer out of codepoint 204 | if not codepoint.kind_of? Integer 205 | if codepoint.respond_to? :to_str 206 | if m=codepoint.match(/^U\+?([0-9abcdef]+)$/i) 207 | codepoint = m[1].to_i(16) 208 | else 209 | raise InvalidCodepoint.new(codepoint) 210 | end 211 | else 212 | codepoint = codepoint.to_i 213 | end 214 | end 215 | 216 | [codepoint].pack('U') 217 | end 218 | 219 | # Checks whether a parsed line's description matches its definition. 220 | def self.validate_desc(parsed_line) 221 | desc, defin = parsed_line[:description], parsed_line[:definition] 222 | 223 | return true if (not desc or not defin) 224 | if desc.match(/^U\+?[0-9A-F]+$/i) # if unicode description 225 | if (defin != codepoint_to_unichar(desc)) 226 | raise DescriptionConflict.new(parsed_line) 227 | else 228 | return true 229 | end 230 | else # keysymname description 231 | keysymval = Keysyms[desc] 232 | if not keysymval 233 | raise UnknownKeysymname.new(desc) 234 | elsif defin != keysymval 235 | raise DescriptionConflict.new(parsed_line) 236 | else 237 | return true 238 | end 239 | end 240 | end 241 | 242 | def validate_descs() 243 | valid=true 244 | 0.upto(@parsed_lines.size) do |i| 245 | next if not @parsed_lines[i] 246 | begin 247 | self.class.validate_desc(@parsed_lines[i]) 248 | @logger.debug("#{i}: description valid.") 249 | rescue UnknownKeysymname, DescriptionConflict, InvalidCodepoint => ex 250 | @logger.error("#{i}: #{ex.message}") 251 | valid = false 252 | end 253 | end 254 | return valid 255 | end 256 | 257 | def validate_mapping(li) 258 | l = @parsed_lines[li] 259 | return true if not l 260 | l[:map].each_prefix do |pref| 261 | conflict = @@map_index[pref] 262 | if conflict 263 | raise MapPrefixConflict.new(format("%s:%s: prefix conflict with %s:%s", 264 | @file.path, li, 265 | conflict[0].file.path, conflict[1])) 266 | end 267 | end 268 | return true 269 | end 270 | 271 | end 272 | 273 | 274 | if __FILE__ == $0 275 | l = Logger.new('xcompose_parser') 276 | 277 | options = OpenStruct.new 278 | options.loglevel = WARN 279 | 280 | OptionParser.new {|op| 281 | op.banner = "Usage: #{$0} [options] " 282 | op.on('l', '--loglevel LOG', 'Set loglevel ') do |l| 283 | if l.downcase.match /debug/ 284 | options.loglevel = DEBUG 285 | elsif l.downcase.match /info/ 286 | options.loglevel = INFO 287 | elsif l.downcase.match /warn/ 288 | options.loglevel = WARN 289 | elsif l.downcase.match /info/ 290 | options.loglevel = ERROR 291 | end 292 | end 293 | op.on('d', '--debug', 'Equivalent to -l DEBUG') do |d| 294 | options.loglevel = DEBUG if d 295 | end 296 | op.on('v', '--verbose', 'Equivalent to -l INFO') do |v| 297 | options.loglevel = INFO if v 298 | end 299 | op.on('q', '--quiet', 'Equivalent to -l ERROR') do |q| 300 | options.loglevel = ERROR if q 301 | end 302 | }.parse! 303 | 304 | exit 1 if not ARGV[0] 305 | ARGV.each do |fpath| 306 | if not File.readable? fpath 307 | $stderr.puts "Cannot read file #{fpath}" 308 | exit 1 309 | end 310 | end 311 | 312 | l.level=options.loglevel 313 | l.outputters << Outputter.stdout 314 | 315 | 316 | l.info("Checking syntax and mappings...") 317 | parsers=[] 318 | ARGV.each do |fpath| 319 | p = XComposeParser.new(fpath, l) 320 | begin 321 | p.parse 322 | p.logger.info("Parsed fine.") 323 | parsers << p 324 | rescue XComposeParser::MapDuplicate => ex 325 | l.warn(ex.message) 326 | parsers << p 327 | rescue XComposeParser::MapConflict => ex 328 | l.error(ex.message) 329 | rescue XComposeParser::ParseError => ex 330 | l.error(ex.message) 331 | l.info("#{p.file.path} will be skipped") 332 | end 333 | end 334 | 335 | l.info("Checking for bad descriptions...") 336 | 337 | parsers.each do |p| 338 | if p.validate_descs 339 | p.logger.info("Descriptions ok.") 340 | else 341 | p.logger.error("Description errors.") 342 | end 343 | end 344 | 345 | l.info("Checking for mapping conflicts...") 346 | 347 | parsers.each do |p| 348 | p.parsed_lines.each_index do |i| 349 | begin 350 | p.validate_mapping(i) 351 | rescue XComposeParser::MapConflict => ex 352 | p.logger.error(ex.message) 353 | end 354 | end 355 | end 356 | end 357 | -------------------------------------------------------------------------------- /doc/xorg-compose-extracts: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8; mode: conf -*- 2 | # vim: encoding=utf-8 ft=conf 3 | # 4 | # This file is not intended for Compose inclusion; rather, it’s a 5 | # selected extract of current (2009‒04) 6 | # /usr/share/X11/locale/en_US.UTF-8/Compose. There’s a lot of 7 | # interesting mappings there, but also a lot of cruft (such as vowels 8 | # with various permutations of piled diacritics; grep -v "WITH " and 9 | # it gets a lot better). I started this file for my own benefit and 10 | # decided to include it for lazy people. It doubles as a “X keyboard 11 | # shortcut quick reference”. 12 | # 13 | # I included personal comments with ##. 14 | # 15 | #—leoboiko 16 | # 17 | 18 | 19 | ## Typography 20 | ## ========== 21 | 22 | : "…" ellipsis # HORIZONTAL ELLIPSIS 23 | 24 | : "–" U2013 # EN DASH 25 | : "—" U2014 # EM DASH 26 | ## true‐minus, true‐hyphen, and true–horizontal‐bar are absent. see 27 | ## my typographic.xcompose for some suggestions. 28 | 29 | ## Wouldn’t be more consistent with the mappings 30 | ## for e.g. «, », –? 31 | : "›" U203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 32 | : "‹" U2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK 33 | 34 | ## What’s the difference between this and the “seconds mark” ″? 35 | : "〞" U301e # DOUBLE PRIME QUOTATION MARK 36 | ## And what is this one for? 37 | : "〝" U301d # REVERSED DOUBLE PRIME QUOTATION MARK 38 | 39 | ## These actually are fairly intuitive once you get the hang of it. 40 | : "«" guillemotleft # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 41 | : "»" guillemotright # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 42 | : "‘" U2018 # LEFT SINGLE QUOTATION MARK 43 | : "‘" U2018 # LEFT SINGLE QUOTATION MARK 44 | : "’" U2019 # RIGHT SINGLE QUOTATION MARK 45 | : "’" U2019 # RIGHT SINGLE QUOTATION MARK 46 | : "‚" U201a # SINGLE LOW-9 QUOTATION MARK 47 | : "‚" U201a # SINGLE LOW-9 QUOTATION MARK 48 | : "“" U201c # LEFT DOUBLE QUOTATION MARK 49 | : "“" U201c # LEFT DOUBLE QUOTATION MARK 50 | : "”" U201d # RIGHT DOUBLE QUOTATION MARK 51 | : "”" U201d # RIGHT DOUBLE QUOTATION MARK 52 | : "„" U201e # DOUBLE LOW-9 QUOTATION MARK 53 | : "„" U201e # DOUBLE LOW-9 QUOTATION MARK 54 | 55 | ## Typography for Lawyers 56 | : "§" section # SECTION SIGN 57 | : "§" section # SECTION SIGN 58 |

: "¶" paragraph # PILCROW SIGN 59 | 60 | ## Oldschool 61 | 62 | ## This isn’t the same as English ð/Ð (dh). 63 | : "đ" dstroke # LATIN SMALL LETTER D WITH STROKE 64 | : "Đ" Dstroke # LATIN CAPITAL LETTER D WITH STROKE 65 | 66 | : "Þ" THORN # LATIN CAPITAL LETTER THORN 67 | : "Ð" ETH # LATIN CAPITAL LETTER ETH 68 | : "ð" eth # LATIN SMALL LETTER ETH 69 | : "þ" thorn # LATIN SMALL LETTER THORN 70 | 71 | ## True Germans use essesses. 72 | : "ß" ssharp # LATIN SMALL LETTER SHARP S 73 | 74 | ## Long S is not an F dammit. They should use or something. 75 | ## Well‐kown trivia: ever noticed ß is ſ+s? 76 | : "ſ" U017f # LATIN SMALL LETTER LONG S 77 | : "ſ" U017f # LATIN SMALL LETTER LONG S 78 | 79 | : "œ" oe # LATIN SMALL LIGATURE OE 80 | : "Œ" OE # LATIN CAPITAL LIGATURE OE 81 | : "æ" ae # LATIN SMALL LETTER AE 82 | : "Æ" AE # LATIN CAPITAL LETTER AE 83 | 84 | 85 | ## Miscellaneous 86 | ## ============= 87 | 88 | ## If only browsers could read this one. 89 | : " " nobreakspace # NO-BREAK SPACE 90 | 91 | : " " U2008 # PUNCTUATION SPACE 92 | ## All the other interesting spaces are missing, and 93 | ## is such a good prefix. 94 | 95 | ## I prefer “( c )”, “( r )” like all other enclosed chars. 96 | : "©" copyright # COPYRIGHT SIGN 97 | : "®" registered # REGISTERED SIGN 98 | 99 | ## These four aren’t mnemonic at all IMHO. 100 | : "·" periodcentered # MIDDLE DOT 101 | : "•" enfilledcircbullet # BULLET 102 | : "¦" brokenbar # BROKEN BAR 103 |

: "¶" paragraph # PILCROW SIGN 104 | 105 | : "¡" exclamdown # INVERTED EXCLAMATION MARK 106 | : "¿" questiondown # INVERTED QUESTION MARK 107 | ## …and everyone’s favourite: 108 | : "‽" U203D # INTERROBANG 109 | : "‽" U203D # INTERROBANG 110 | ## I want the ganborretni ⸘ 111 | 112 | : "±" plusminus # PLUS-MINUS SIGN 113 | 114 | : "°" degree # DEGREE SIGN 115 | 116 | ## Percent ÷10. 117 | : "‰" U2030 # PER MILLE SIGN 118 | ## Obvious extension to ‱ won’n work due to XCompose substring 119 | ## conflict problem. 120 | 121 | ## No idea how to type this sequence, but isn’t it interesting? The 122 | ## decomposed character is a negation (⫝ “non‐forking”), so the 123 | ## slashed version is an affirmative. Both symbols are some math 124 | ## thing apparently. 125 | : "⫝̸" U2ADC # FORKING 126 | 127 | ## stroking arrows! (can’t input though) 128 | : "↚" U219A # LEFTWARDS ARROW WITH STROKE 129 | : "↚" U219A # LEFTWARDS ARROW WITH STROKE 130 | : "↛" U219B # RIGHTWARDS ARROW WITH STROKE 131 | : "↛" U219B # RIGHTWARDS ARROW WITH STROKE 132 | : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE 133 | : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE 134 | 135 | ## Super– and subscripts 136 | ## ===================== 137 | 138 | ## With keypad or not, with deadkeys or not = 4 ways to superscript 139 | <0> : "⁰" U2070 # SUPERSCRIPT ZERO 140 | <0> : "⁰" U2070 # SUPERSCRIPT ZERO 141 | : "⁰" U2070 # SUPERSCRIPT ZERO 142 | : "⁰" U2070 # SUPERSCRIPT ZERO 143 | ## there’s dead_circumflex and keypad variant for all sub– and superscripts. 144 | <1> : "¹" onesuperior # SUPERSCRIPT ONE 145 | <2> : "²" twosuperior # SUPERSCRIPT TWO 146 | ## ³,⁴, ⁵…⁰ 147 | 148 | ## Isn’t it weird how they didn’t include 149 | ## ? Anyway my bin/make-dead-compose.sh fixes this. 150 | : "ª" ordfeminine # FEMININE ORDINAL INDICATOR 151 | : "ª" ordfeminine # FEMININE ORDINAL INDICATOR 152 | : "ª" ordfeminine # FEMININE ORDINAL INDICATOR 153 | : "ª" ordfeminine # FEMININE ORDINAL INDICATOR 154 | : "º" masculine # MASCULINE ORDINAL INDICATOR 155 | : "º" masculine # MASCULINE ORDINAL INDICATOR 156 | : "º" masculine # MASCULINE ORDINAL INDICATOR 157 | : "º" masculine # MASCULINE ORDINAL INDICATOR 158 | 159 | ## versions for all of these 160 | : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I 161 | : "⁺" U207A # SUPERSCRIPT PLUS SIGN 162 | ## how do I u2212? (without pointless‐xcompose, I mean) 163 | : "⁻" U207B # SUPERSCRIPT MINUS 164 | : "⁼" U207C # SUPERSCRIPT EQUALS SIGN 165 | : "⁼" U207C # SUPERSCRIPT EQUALS SIGN 166 | : "⁽" U207D # SUPERSCRIPT LEFT PARENTHESIS 167 | : "⁾" U207E # SUPERSCRIPT RIGHT PARENTHESIS 168 | 169 | ## there’s keypad and underbar versions for all subscripts 170 | <0> : "₀" U2080 # SUBSCRIPT ZERO 171 | <1> : "₁" U2081 # SUBSCRIPT ONE 172 | <2> : "₂" U2082 # SUBSCRIPT TWO 173 | ## ₃, ₄, ₅… ₀ 174 | 175 | : "₊" U208A # SUBSCRIPT PLUS SIGN 176 | : "₋" U208B # SUBSCRIPT MINUS 177 | : "₌" U208C # SUBSCRIPT EQUALS SIGN 178 | : "₍" U208D # SUBSCRIPT LEFT PARENTHESIS 179 | : "₎" U208E # SUBSCRIPT RIGHT PARENTHESIS 180 | 181 | ## why underscore for a superscript? a mistake? 182 | : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N 183 | 184 | ## redundant? similarly for all below (ommited) 185 | : "℠" U2120 # SERVICE MARK 186 | : "℠" U2120 # SERVICE MARK 187 | ## they include all case permutations 188 | : "℠" U2120 # SERVICE MARK 189 | : "℠" U2120 # SERVICE MARK 190 | : "℠" U2120 # SERVICE MARK 191 | 192 | ## same variants as ℠ 193 | : "™" U2122 # TRADE MARK SIGN 194 | 195 | 196 | ## Circled things 197 | 198 | <0> : "⓪" U24EA # CIRCLED DIGIT ZERO 199 | <1> : "①" U2460 # CIRCLED DIGIT ONE 200 | <2> : "②" U2461 # CIRCLED DIGIT TWO 201 | ## ③, ④… ⑩, ⑪, ⑫… ⑳, ㉑… ㊿ 202 | 203 | : "Ⓐ" U24B6 # CIRCLED LATIN CAPITAL LETTER A 204 | : "Ⓑ" U24B7 # CIRCLED LATIN CAPITAL LETTER B 205 | : "Ⓒ" U24B8 # CIRCLED LATIN CAPITAL LETTER C 206 | ## …Ⓩ 207 | 208 | : "ⓐ" U24D0 # CIRCLED LATIN SMALL LETTER A 209 | : "ⓑ" U24D1 # CIRCLED LATIN SMALL LETTER B 210 | : "ⓒ" U24D2 # CIRCLED LATIN SMALL LETTER C 211 | ## …ⓩ 212 | 213 | ## Korean hangul 214 | : "㉠" U3260 # CIRCLED HANGUL KIYEOK 215 | : "㉡" U3261 # CIRCLED HANGUL NIEUN 216 | ## …&c. 217 | 218 | ## Fractions 219 | ## ========= 220 | ## I’d expect variants with slash. 221 | 222 | <1> <4> : "¼" onequarter # VULGAR FRACTION ONE QUARTER 223 | <1> <2> : "½" onehalf # VULGAR FRACTION ONE HALF 224 | <3> <4> : "¾" threequarters # VULGAR FRACTION THREE QUARTERS 225 | <1> <3> : "⅓" U2153 # VULGAR FRACTION ONE THIRD 226 | <2> <3> : "⅔" U2154 # VULGAR FRACTION TWO THIRDS 227 | <1> <5> : "⅕" U2155 # VULGAR FRACTION ONE FIFTH 228 | <2> <5> : "⅖" U2156 # VULGAR FRACTION TWO FIFTHS 229 | <3> <5> : "⅗" U2157 # VULGAR FRACTION THREE FIFTHS 230 | <4> <5> : "⅘" U2158 # VULGAR FRACTION FOUR FIFTHS 231 | <1> <6> : "⅙" U2159 # VULGAR FRACTION ONE SIXTH 232 | <5> <6> : "⅚" U215A # VULGAR FRACTION FIVE SIXTHS 233 | <1> <8> : "⅛" U215B # VULGAR FRACTION ONE EIGHTH 234 | <3> <8> : "⅜" U215C # VULGAR FRACTION THREE EIGHTHS 235 | <5> <8> : "⅝" U215D # VULGAR FRACTION FIVE EIGHTHS 236 | <7> <8> : "⅞" U215E # VULGAR FRACTION SEVEN EIGHTHS 237 | 238 | 239 | ## Three ways of doing Ø… don’t confuse slashed‐O with U2205 “empty 240 | ## set” ∅, with U2300 “diameter sign” ⌀, or with the slashed zero (a 241 | ## glyph, not a character; when needed, it is represented by U0338 242 | ## “combining long solidus overlay” plus a zero (0̸). Confused yet? 243 | : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE 244 | : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE 245 | : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE 246 | 247 | 248 | ## Music 249 | 250 | ## Btw = # 251 | : "♭" U266d # MUSIC FLAT SIGN 252 | : "♮" U266e # MUSIC NATURAL SIGN 253 | : "♯" U266f # MUSIC SHARP SIGN 254 | 255 | ## These characters somehow appear as hanzi in my system (Emacs with 256 | ## custom fontset). In any case they appear to be unsupported by most 257 | ## fonts. 258 | : "𝅗𝅥" U1D15E # MUSICAL SYMBOL HALF NOTE 259 | : "𝅘𝅥" U1D15F # MUSICAL SYMBOL QUARTER NOTE 260 | : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE 261 | : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE 262 | : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY‐SECOND NOTE 263 | : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE 264 | : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE 265 | : "𝆹𝅥" U1D1BB # MUSICAL SYMBOL MINIMA 266 | : "𝆺𝅥" U1D1BC # MUSICAL SYMBOL MINIMA BLACK 267 | : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE 268 | : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK 269 | : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE 270 | : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK 271 | 272 | ## and where’s the more common U2669–266C ♩♪♫♬? 273 | 274 | 275 | ## Money! 276 | ## ====== 277 | ## Pay attention to case. 278 | : "₠" U20a0 # EURO-CURRENCY SIGN 279 | : "₡" U20a1 # COLON SIGN 280 | : "₡" U20a1 # COLON SIGN 281 | ## This is awesome! —nostalgic brazilian 282 | : "₢" U20a2 # CRUZEIRO SIGN 283 | : "₣" U20a3 # FRENCH FRANC SIGN 284 | : "₤" U20a4 # LIRA SIGN 285 | : "₤" U20a4 # LIRA SIGN 286 | : "₥" U20a5 # MILL SIGN 287 | : "₥" U20a5 # MILL SIGN 288 | : "₦" U20a6 # NAIRA SIGN 289 | : "₦" U20a6 # NAIRA SIGN 290 |

: "₧" U20a7 # PESETA SIGN 291 | ## Zelda fans: 292 | : "₨" U20a8 # RUPEE SIGN 293 | : "₩" U20a9 # WON SIGN 294 | : "₩" U20a9 # WON SIGN 295 | ## ₪… heh xorg, bet you couldn’t mnemonic THIS 296 | ## On second though, perhaps “Compose [ ]”? 297 | ## On third though, I use that for ∎. 298 | # "₪" U20aa NEW SHEQEL SIGN 299 | : "₫" U20ab # DONG SIGN 300 | ## Euro, for people with visual imagination. 301 | : "€" EuroSign # EURO SIGN 302 | : "€" EuroSign # EURO SIGN 303 | : "€" EuroSign # EURO SIGN 304 | : "€" EuroSign # EURO SIGN 305 | ## Euro, for people with verbal imagination. 306 | : "€" EuroSign # EURO SIGN 307 | : "€" EuroSign # EURO SIGN 308 | : "€" EuroSign # EURO SIGN 309 | : "€" EuroSign # EURO SIGN 310 | ## Euro, for people with, er… Cyrillic keyboards? 311 | : "€" EuroSign # EURO SIGN 312 | : "€" EuroSign # EURO SIGN 313 | : "€" EuroSign # EURO SIGN 314 | : "€" EuroSign # EURO SIGN 315 | ## Drachma? German penny? Guarani? Someone think of shorcuts for 316 | ## these, they’re great! 317 | # "₭" U20ad KIP SIGN 318 | # "₮" U20ae TUGRIK SIGN 319 | # "₯" U20af DRACHMA SIGN 320 | # "₰" U20b0 GERMAN PENNY SIGN 321 | # "₱" U20b1 PESO SIGN 322 | # "₲" U20b2 GUARANI SIGN 323 | # "₳" U20b3 AUSTRAL SIGN 324 | # "₴" U20b4 HRYVNIA SIGN 325 | # "₵" U20b5 CEDI SIGN 326 | : "¢" cent # CENT SIGN 327 | : "¢" cent # CENT SIGN 328 | : "¢" cent # CENT SIGN 329 | : "¢" cent # CENT SIGN 330 | : "£" sterling # POUND SIGN 331 | : "£" sterling # POUND SIGN 332 | : "¥" yen # YEN SIGN 333 | : "¥" yen # YEN SIGN 334 | 335 | ## Generic currency! 336 | : "¤" currency # CURRENCY SIGN 337 | : "¤" currency # CURRENCY SIGN 338 | 339 | 340 | ## Japanese 341 | ## ======== 342 | 343 | ## How is one supposed to combine ideographs (normally inputed with an 344 | ## IM) and X compose? In any case it’s interesting to know there are 345 | ## superscript kanji, deadkey variants and all. I wonder how to type 346 | ## them in common IMs? 347 | 348 | : "㆒" U3192 # IDEOGRAPHIC ANNOTATION ONE MARK 349 | : "㆒" U3192 # IDEOGRAPHIC ANNOTATION ONE MARK 350 | : "㆓" U3193 # IDEOGRAPHIC ANNOTATION TWO MARK 351 | : "㆓" U3193 # IDEOGRAPHIC ANNOTATION TWO MARK 352 | ## dead_circumflex for all the following 353 | : "㆔" U3194 # IDEOGRAPHIC ANNOTATION THREE MARK 354 | : "㆕" U3195 # IDEOGRAPHIC ANNOTATION FOUR MARK 355 | : "㆖" U3196 # IDEOGRAPHIC ANNOTATION TOP MARK 356 | : "㆗" U3197 # IDEOGRAPHIC ANNOTATION MIDDLE MARK 357 | : "㆘" U3198 # IDEOGRAPHIC ANNOTATION BOTTOM MARK 358 | : "㆙" U3199 # IDEOGRAPHIC ANNOTATION FIRST MARK 359 | : "㆚" U319A # IDEOGRAPHIC ANNOTATION SECOND MARK 360 | : "㆛" U319B # IDEOGRAPHIC ANNOTATION THIRD MARK 361 | : "㆜" U319C # IDEOGRAPHIC ANNOTATION FOURTH MARK 362 | : "㆝" U319D # IDEOGRAPHIC ANNOTATION HEAVEN MARK 363 | : "㆞" U319E # IDEOGRAPHIC ANNOTATION EARTH MARK 364 | ## unicode sexism! why not “person mark”? 365 | : "㆟" U319F # IDEOGRAPHIC ANNOTATION MAN MARK 366 | 367 | : "㊀" U3280 # CIRCLED IDEOGRAPH ONE 368 | : "㊁" U3281 # CIRCLED IDEOGRAPH TWO 369 | : "㊂" U3282 # CIRCLED IDEOGRAPH THREE 370 | ## ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ 371 | ## ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ ㊡ ㊢ ㊣ ㊤ ㊥ ㊦ ㊧ ㊨ ㊩ ㊪ ㊫ ㊬ ㊭ ㊮ ㊯ ㊰ 372 | 373 | : "㋐" U32D0 # CIRCLED KATAKANA A 374 | : "㋑" U32D1 # CIRCLED KATAKANA I 375 | ## …㋻㋼㋽㋾. (all katakana; no hiragana?) 376 | 377 | 378 | ## Linguistics 379 | ## =========== 380 | : "ə" U0259 # LATIN SMALL LETTER SCHWA 381 | 382 | ## There are order and deadkey variants for the following. The 383 | ## ones use Multi_key after the circumflex, not 384 | ## before as I’d expect. 385 | : "ɨ" U0268 # LATIN SMALL LETTER I WITH STROKE 386 | : "ʡ" U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE 387 | : "ʰ" U02B0 # MODIFIER LETTER SMALL H 388 | : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK 389 | : "ʲ" U02B2 # MODIFIER LETTER SMALL J 390 | : "ʳ" U02B3 # MODIFIER LETTER SMALL R 391 | : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R 392 | : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK 393 | : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R 394 | : "ʷ" U02B7 # MODIFIER LETTER SMALL W 395 | : "ʸ" U02B8 # MODIFIER LETTER SMALL Y 396 | : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA 397 | : "ˡ" U02E1 # MODIFIER LETTER SMALL L 398 | : "ˢ" U02E2 # MODIFIER LETTER SMALL S 399 | : "ˣ" U02E3 # MODIFIER LETTER SMALL X 400 | : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP 401 | 402 | ## lots more with various modifiers, go look the file if you’re a linguist. 403 | 404 | 405 | -------------------------------------------------------------------------------- /bin/keysymdef.rb: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Autogenerated by ./make-keysymdef.rb at 2009-05-15. 3 | # First line of input file was: 4 | # /* $Xorg: keysymdef.h,v 1.4 2001/02/09 02:03:23 $ */ 5 | 6 | 7 | module Keysymdef 8 | Keysyms = { 9 | "0" => "0", 10 | "1" => "1", 11 | "2" => "2", 12 | "3" => "3", 13 | "4" => "4", 14 | "5" => "5", 15 | "6" => "6", 16 | "7" => "7", 17 | "8" => "8", 18 | "9" => "9", 19 | "A" => "A", 20 | "AE" => "Æ", 21 | "Aacute" => "Á", 22 | "Abelowdot" => "Ạ", 23 | "Abreve" => "Ă", 24 | "Abreveacute" => "Ắ", 25 | "Abrevebelowdot" => "Ặ", 26 | "Abrevegrave" => "Ằ", 27 | "Abrevehook" => "Ẳ", 28 | "Abrevetilde" => "Ẵ", 29 | "Acircumflex" => "Â", 30 | "Acircumflexacute" => "Ấ", 31 | "Acircumflexbelowdot" => "Ậ", 32 | "Acircumflexgrave" => "Ầ", 33 | "Acircumflexhook" => "Ẩ", 34 | "Acircumflextilde" => "Ẫ", 35 | "Adiaeresis" => "Ä", 36 | "Agrave" => "À", 37 | "Ahook" => "Ả", 38 | "Amacron" => "Ā", 39 | "Aogonek" => "Ą", 40 | "Arabic_0" => "٠", 41 | "Arabic_1" => "١", 42 | "Arabic_2" => "٢", 43 | "Arabic_3" => "٣", 44 | "Arabic_4" => "٤", 45 | "Arabic_5" => "٥", 46 | "Arabic_6" => "٦", 47 | "Arabic_7" => "٧", 48 | "Arabic_8" => "٨", 49 | "Arabic_9" => "٩", 50 | "Arabic_ain" => "ع", 51 | "Arabic_alef" => "ا", 52 | "Arabic_alefmaksura" => "ى", 53 | "Arabic_beh" => "ب", 54 | "Arabic_comma" => "،", 55 | "Arabic_dad" => "ض", 56 | "Arabic_dal" => "د", 57 | "Arabic_damma" => "ُ", 58 | "Arabic_dammatan" => "ٌ", 59 | "Arabic_ddal" => "ڈ", 60 | "Arabic_farsi_yeh" => "ی", 61 | "Arabic_fatha" => "َ", 62 | "Arabic_fathatan" => "ً", 63 | "Arabic_feh" => "ف", 64 | "Arabic_fullstop" => "۔", 65 | "Arabic_gaf" => "گ", 66 | "Arabic_ghain" => "غ", 67 | "Arabic_ha" => "ه", 68 | "Arabic_hah" => "ح", 69 | "Arabic_hamza" => "ء", 70 | "Arabic_hamza_above" => "ٔ", 71 | "Arabic_hamza_below" => "ٕ", 72 | "Arabic_hamzaonalef" => "أ", 73 | "Arabic_hamzaonwaw" => "ؤ", 74 | "Arabic_hamzaonyeh" => "ئ", 75 | "Arabic_hamzaunderalef" => "إ", 76 | "Arabic_heh_doachashmee" => "ھ", 77 | "Arabic_heh_goal" => "ہ", 78 | "Arabic_jeem" => "ج", 79 | "Arabic_jeh" => "ژ", 80 | "Arabic_kaf" => "ك", 81 | "Arabic_kasra" => "ِ", 82 | "Arabic_kasratan" => "ٍ", 83 | "Arabic_keheh" => "ک", 84 | "Arabic_khah" => "خ", 85 | "Arabic_lam" => "ل", 86 | "Arabic_madda_above" => "ٓ", 87 | "Arabic_maddaonalef" => "آ", 88 | "Arabic_meem" => "م", 89 | "Arabic_noon" => "ن", 90 | "Arabic_noon_ghunna" => "ں", 91 | "Arabic_peh" => "پ", 92 | "Arabic_percent" => "٪", 93 | "Arabic_qaf" => "ق", 94 | "Arabic_question_mark" => "؟", 95 | "Arabic_ra" => "ر", 96 | "Arabic_rreh" => "ڑ", 97 | "Arabic_sad" => "ص", 98 | "Arabic_seen" => "س", 99 | "Arabic_semicolon" => "؛", 100 | "Arabic_shadda" => "ّ", 101 | "Arabic_sheen" => "ش", 102 | "Arabic_sukun" => "ْ", 103 | "Arabic_superscript_alef" => "ٰ", 104 | "Arabic_tah" => "ط", 105 | "Arabic_tatweel" => "ـ", 106 | "Arabic_tcheh" => "چ", 107 | "Arabic_teh" => "ت", 108 | "Arabic_tehmarbuta" => "ة", 109 | "Arabic_thal" => "ذ", 110 | "Arabic_theh" => "ث", 111 | "Arabic_tteh" => "ٹ", 112 | "Arabic_veh" => "ڤ", 113 | "Arabic_waw" => "و", 114 | "Arabic_yeh" => "ي", 115 | "Arabic_yeh_baree" => "ے", 116 | "Arabic_zah" => "ظ", 117 | "Arabic_zain" => "ز", 118 | "Aring" => "Å", 119 | "Armenian_AT" => "Ը", 120 | "Armenian_AYB" => "Ա", 121 | "Armenian_BEN" => "Բ", 122 | "Armenian_CHA" => "Չ", 123 | "Armenian_DA" => "Դ", 124 | "Armenian_DZA" => "Ձ", 125 | "Armenian_E" => "Է", 126 | "Armenian_FE" => "Ֆ", 127 | "Armenian_GHAT" => "Ղ", 128 | "Armenian_GIM" => "Գ", 129 | "Armenian_HI" => "Յ", 130 | "Armenian_HO" => "Հ", 131 | "Armenian_INI" => "Ի", 132 | "Armenian_JE" => "Ջ", 133 | "Armenian_KE" => "Ք", 134 | "Armenian_KEN" => "Կ", 135 | "Armenian_KHE" => "Խ", 136 | "Armenian_LYUN" => "Լ", 137 | "Armenian_MEN" => "Մ", 138 | "Armenian_NU" => "Ն", 139 | "Armenian_O" => "Օ", 140 | "Armenian_PE" => "Պ", 141 | "Armenian_PYUR" => "Փ", 142 | "Armenian_RA" => "Ռ", 143 | "Armenian_RE" => "Ր", 144 | "Armenian_SE" => "Ս", 145 | "Armenian_SHA" => "Շ", 146 | "Armenian_TCHE" => "Ճ", 147 | "Armenian_TO" => "Թ", 148 | "Armenian_TSA" => "Ծ", 149 | "Armenian_TSO" => "Ց", 150 | "Armenian_TYUN" => "Տ", 151 | "Armenian_VEV" => "Վ", 152 | "Armenian_VO" => "Ո", 153 | "Armenian_VYUN" => "Ւ", 154 | "Armenian_YECH" => "Ե", 155 | "Armenian_ZA" => "Զ", 156 | "Armenian_ZHE" => "Ժ", 157 | "Armenian_accent" => "՛", 158 | "Armenian_amanak" => "՜", 159 | "Armenian_apostrophe" => "՚", 160 | "Armenian_at" => "ը", 161 | "Armenian_ayb" => "ա", 162 | "Armenian_ben" => "բ", 163 | "Armenian_but" => "՝", 164 | "Armenian_cha" => "չ", 165 | "Armenian_da" => "դ", 166 | "Armenian_dza" => "ձ", 167 | "Armenian_e" => "է", 168 | "Armenian_exclam" => "՜", 169 | "Armenian_fe" => "ֆ", 170 | "Armenian_full_stop" => "։", 171 | "Armenian_ghat" => "ղ", 172 | "Armenian_gim" => "գ", 173 | "Armenian_hi" => "յ", 174 | "Armenian_ho" => "հ", 175 | "Armenian_hyphen" => "֊", 176 | "Armenian_ini" => "ի", 177 | "Armenian_je" => "ջ", 178 | "Armenian_ke" => "ք", 179 | "Armenian_ken" => "կ", 180 | "Armenian_khe" => "խ", 181 | "Armenian_ligature_ew" => "և", 182 | "Armenian_lyun" => "լ", 183 | "Armenian_men" => "մ", 184 | "Armenian_nu" => "ն", 185 | "Armenian_o" => "օ", 186 | "Armenian_paruyk" => "՞", 187 | "Armenian_pe" => "պ", 188 | "Armenian_pyur" => "փ", 189 | "Armenian_question" => "՞", 190 | "Armenian_ra" => "ռ", 191 | "Armenian_re" => "ր", 192 | "Armenian_se" => "ս", 193 | "Armenian_separation_mark" => "՝", 194 | "Armenian_sha" => "շ", 195 | "Armenian_shesht" => "՛", 196 | "Armenian_tche" => "ճ", 197 | "Armenian_to" => "թ", 198 | "Armenian_tsa" => "ծ", 199 | "Armenian_tso" => "ց", 200 | "Armenian_tyun" => "տ", 201 | "Armenian_verjaket" => "։", 202 | "Armenian_vev" => "վ", 203 | "Armenian_vo" => "ո", 204 | "Armenian_vyun" => "ւ", 205 | "Armenian_yech" => "ե", 206 | "Armenian_yentamna" => "֊", 207 | "Armenian_za" => "զ", 208 | "Armenian_zhe" => "ժ", 209 | "Atilde" => "Ã", 210 | "B" => "B", 211 | "Babovedot" => "Ḃ", 212 | "Byelorussian_SHORTU" => "Ў", 213 | "Byelorussian_shortu" => "ў", 214 | "C" => "C", 215 | "Cabovedot" => "Ċ", 216 | "Cacute" => "Ć", 217 | "Ccaron" => "Č", 218 | "Ccedilla" => "Ç", 219 | "Ccircumflex" => "Ĉ", 220 | "ColonSign" => "₡", 221 | "CruzeiroSign" => "₢", 222 | "Cyrillic_A" => "А", 223 | "Cyrillic_BE" => "Б", 224 | "Cyrillic_CHE" => "Ч", 225 | "Cyrillic_CHE_descender" => "Ҷ", 226 | "Cyrillic_CHE_vertstroke" => "Ҹ", 227 | "Cyrillic_DE" => "Д", 228 | "Cyrillic_DZHE" => "Џ", 229 | "Cyrillic_E" => "Э", 230 | "Cyrillic_EF" => "Ф", 231 | "Cyrillic_EL" => "Л", 232 | "Cyrillic_EM" => "М", 233 | "Cyrillic_EN" => "Н", 234 | "Cyrillic_EN_descender" => "Ң", 235 | "Cyrillic_ER" => "Р", 236 | "Cyrillic_ES" => "С", 237 | "Cyrillic_GHE" => "Г", 238 | "Cyrillic_GHE_bar" => "Ғ", 239 | "Cyrillic_HA" => "Х", 240 | "Cyrillic_HARDSIGN" => "Ъ", 241 | "Cyrillic_HA_descender" => "Ҳ", 242 | "Cyrillic_I" => "И", 243 | "Cyrillic_IE" => "Е", 244 | "Cyrillic_IO" => "Ё", 245 | "Cyrillic_I_macron" => "Ӣ", 246 | "Cyrillic_JE" => "Ј", 247 | "Cyrillic_KA" => "К", 248 | "Cyrillic_KA_descender" => "Қ", 249 | "Cyrillic_KA_vertstroke" => "Ҝ", 250 | "Cyrillic_LJE" => "Љ", 251 | "Cyrillic_NJE" => "Њ", 252 | "Cyrillic_O" => "О", 253 | "Cyrillic_O_bar" => "Ө", 254 | "Cyrillic_PE" => "П", 255 | "Cyrillic_SCHWA" => "Ә", 256 | "Cyrillic_SHA" => "Ш", 257 | "Cyrillic_SHCHA" => "Щ", 258 | "Cyrillic_SHHA" => "Һ", 259 | "Cyrillic_SHORTI" => "Й", 260 | "Cyrillic_SOFTSIGN" => "Ь", 261 | "Cyrillic_TE" => "Т", 262 | "Cyrillic_TSE" => "Ц", 263 | "Cyrillic_U" => "У", 264 | "Cyrillic_U_macron" => "Ӯ", 265 | "Cyrillic_U_straight" => "Ү", 266 | "Cyrillic_U_straight_bar" => "Ұ", 267 | "Cyrillic_VE" => "В", 268 | "Cyrillic_YA" => "Я", 269 | "Cyrillic_YERU" => "Ы", 270 | "Cyrillic_YU" => "Ю", 271 | "Cyrillic_ZE" => "З", 272 | "Cyrillic_ZHE" => "Ж", 273 | "Cyrillic_ZHE_descender" => "Җ", 274 | "Cyrillic_a" => "а", 275 | "Cyrillic_be" => "б", 276 | "Cyrillic_che" => "ч", 277 | "Cyrillic_che_descender" => "ҷ", 278 | "Cyrillic_che_vertstroke" => "ҹ", 279 | "Cyrillic_de" => "д", 280 | "Cyrillic_dzhe" => "џ", 281 | "Cyrillic_e" => "э", 282 | "Cyrillic_ef" => "ф", 283 | "Cyrillic_el" => "л", 284 | "Cyrillic_em" => "м", 285 | "Cyrillic_en" => "н", 286 | "Cyrillic_en_descender" => "ң", 287 | "Cyrillic_er" => "р", 288 | "Cyrillic_es" => "с", 289 | "Cyrillic_ghe" => "г", 290 | "Cyrillic_ghe_bar" => "ғ", 291 | "Cyrillic_ha" => "х", 292 | "Cyrillic_ha_descender" => "ҳ", 293 | "Cyrillic_hardsign" => "ъ", 294 | "Cyrillic_i" => "и", 295 | "Cyrillic_i_macron" => "ӣ", 296 | "Cyrillic_ie" => "е", 297 | "Cyrillic_io" => "ё", 298 | "Cyrillic_je" => "ј", 299 | "Cyrillic_ka" => "к", 300 | "Cyrillic_ka_descender" => "қ", 301 | "Cyrillic_ka_vertstroke" => "ҝ", 302 | "Cyrillic_lje" => "љ", 303 | "Cyrillic_nje" => "њ", 304 | "Cyrillic_o" => "о", 305 | "Cyrillic_o_bar" => "ө", 306 | "Cyrillic_pe" => "п", 307 | "Cyrillic_schwa" => "ә", 308 | "Cyrillic_sha" => "ш", 309 | "Cyrillic_shcha" => "щ", 310 | "Cyrillic_shha" => "һ", 311 | "Cyrillic_shorti" => "й", 312 | "Cyrillic_softsign" => "ь", 313 | "Cyrillic_te" => "т", 314 | "Cyrillic_tse" => "ц", 315 | "Cyrillic_u" => "у", 316 | "Cyrillic_u_macron" => "ӯ", 317 | "Cyrillic_u_straight" => "ү", 318 | "Cyrillic_u_straight_bar" => "ұ", 319 | "Cyrillic_ve" => "в", 320 | "Cyrillic_ya" => "я", 321 | "Cyrillic_yeru" => "ы", 322 | "Cyrillic_yu" => "ю", 323 | "Cyrillic_ze" => "з", 324 | "Cyrillic_zhe" => "ж", 325 | "Cyrillic_zhe_descender" => "җ", 326 | "D" => "D", 327 | "Dabovedot" => "Ḋ", 328 | "Dcaron" => "Ď", 329 | "DongSign" => "₫", 330 | "Dstroke" => "Đ", 331 | "E" => "E", 332 | "ENG" => "Ŋ", 333 | "ETH" => "Ð", 334 | "Eabovedot" => "Ė", 335 | "Eacute" => "É", 336 | "Ebelowdot" => "Ẹ", 337 | "Ecaron" => "Ě", 338 | "Ecircumflex" => "Ê", 339 | "Ecircumflexacute" => "Ế", 340 | "Ecircumflexbelowdot" => "Ệ", 341 | "Ecircumflexgrave" => "Ề", 342 | "Ecircumflexhook" => "Ể", 343 | "Ecircumflextilde" => "Ễ", 344 | "EcuSign" => "₠", 345 | "Ediaeresis" => "Ë", 346 | "Egrave" => "È", 347 | "Ehook" => "Ẻ", 348 | "Emacron" => "Ē", 349 | "Eogonek" => "Ę", 350 | "Etilde" => "Ẽ", 351 | "EuroSign" => "€", 352 | "F" => "F", 353 | "FFrancSign" => "₣", 354 | "Fabovedot" => "Ḟ", 355 | "Farsi_0" => "۰", 356 | "Farsi_1" => "۱", 357 | "Farsi_2" => "۲", 358 | "Farsi_3" => "۳", 359 | "Farsi_4" => "۴", 360 | "Farsi_5" => "۵", 361 | "Farsi_6" => "۶", 362 | "Farsi_7" => "۷", 363 | "Farsi_8" => "۸", 364 | "Farsi_9" => "۹", 365 | "Farsi_yeh" => "ی", 366 | "G" => "G", 367 | "Gabovedot" => "Ġ", 368 | "Gbreve" => "Ğ", 369 | "Gcaron" => "Ǧ", 370 | "Gcedilla" => "Ģ", 371 | "Gcircumflex" => "Ĝ", 372 | "Georgian_an" => "ა", 373 | "Georgian_ban" => "ბ", 374 | "Georgian_can" => "ც", 375 | "Georgian_char" => "ჭ", 376 | "Georgian_chin" => "ჩ", 377 | "Georgian_cil" => "წ", 378 | "Georgian_don" => "დ", 379 | "Georgian_en" => "ე", 380 | "Georgian_fi" => "ჶ", 381 | "Georgian_gan" => "გ", 382 | "Georgian_ghan" => "ღ", 383 | "Georgian_hae" => "ჰ", 384 | "Georgian_har" => "ჴ", 385 | "Georgian_he" => "ჱ", 386 | "Georgian_hie" => "ჲ", 387 | "Georgian_hoe" => "ჵ", 388 | "Georgian_in" => "ი", 389 | "Georgian_jhan" => "ჯ", 390 | "Georgian_jil" => "ძ", 391 | "Georgian_kan" => "კ", 392 | "Georgian_khar" => "ქ", 393 | "Georgian_las" => "ლ", 394 | "Georgian_man" => "მ", 395 | "Georgian_nar" => "ნ", 396 | "Georgian_on" => "ო", 397 | "Georgian_par" => "პ", 398 | "Georgian_phar" => "ფ", 399 | "Georgian_qar" => "ყ", 400 | "Georgian_rae" => "რ", 401 | "Georgian_san" => "ს", 402 | "Georgian_shin" => "შ", 403 | "Georgian_tan" => "თ", 404 | "Georgian_tar" => "ტ", 405 | "Georgian_un" => "უ", 406 | "Georgian_vin" => "ვ", 407 | "Georgian_we" => "ჳ", 408 | "Georgian_xan" => "ხ", 409 | "Georgian_zen" => "ზ", 410 | "Georgian_zhar" => "ჟ", 411 | "Greek_ALPHA" => "Α", 412 | "Greek_ALPHAaccent" => "Ά", 413 | "Greek_BETA" => "Β", 414 | "Greek_CHI" => "Χ", 415 | "Greek_DELTA" => "Δ", 416 | "Greek_EPSILON" => "Ε", 417 | "Greek_EPSILONaccent" => "Έ", 418 | "Greek_ETA" => "Η", 419 | "Greek_ETAaccent" => "Ή", 420 | "Greek_GAMMA" => "Γ", 421 | "Greek_IOTA" => "Ι", 422 | "Greek_IOTAaccent" => "Ί", 423 | "Greek_IOTAdieresis" => "Ϊ", 424 | "Greek_KAPPA" => "Κ", 425 | "Greek_LAMBDA" => "Λ", 426 | "Greek_LAMDA" => "Λ", 427 | "Greek_MU" => "Μ", 428 | "Greek_NU" => "Ν", 429 | "Greek_OMEGA" => "Ω", 430 | "Greek_OMEGAaccent" => "Ώ", 431 | "Greek_OMICRON" => "Ο", 432 | "Greek_OMICRONaccent" => "Ό", 433 | "Greek_PHI" => "Φ", 434 | "Greek_PI" => "Π", 435 | "Greek_PSI" => "Ψ", 436 | "Greek_RHO" => "Ρ", 437 | "Greek_SIGMA" => "Σ", 438 | "Greek_TAU" => "Τ", 439 | "Greek_THETA" => "Θ", 440 | "Greek_UPSILON" => "Υ", 441 | "Greek_UPSILONaccent" => "Ύ", 442 | "Greek_UPSILONdieresis" => "Ϋ", 443 | "Greek_XI" => "Ξ", 444 | "Greek_ZETA" => "Ζ", 445 | "Greek_accentdieresis" => "΅", 446 | "Greek_alpha" => "α", 447 | "Greek_alphaaccent" => "ά", 448 | "Greek_beta" => "β", 449 | "Greek_chi" => "χ", 450 | "Greek_delta" => "δ", 451 | "Greek_epsilon" => "ε", 452 | "Greek_epsilonaccent" => "έ", 453 | "Greek_eta" => "η", 454 | "Greek_etaaccent" => "ή", 455 | "Greek_finalsmallsigma" => "ς", 456 | "Greek_gamma" => "γ", 457 | "Greek_horizbar" => "―", 458 | "Greek_iota" => "ι", 459 | "Greek_iotaaccent" => "ί", 460 | "Greek_iotaaccentdieresis" => "ΐ", 461 | "Greek_iotadieresis" => "ϊ", 462 | "Greek_kappa" => "κ", 463 | "Greek_lambda" => "λ", 464 | "Greek_lamda" => "λ", 465 | "Greek_mu" => "μ", 466 | "Greek_nu" => "ν", 467 | "Greek_omega" => "ω", 468 | "Greek_omegaaccent" => "ώ", 469 | "Greek_omicron" => "ο", 470 | "Greek_omicronaccent" => "ό", 471 | "Greek_phi" => "φ", 472 | "Greek_pi" => "π", 473 | "Greek_psi" => "ψ", 474 | "Greek_rho" => "ρ", 475 | "Greek_sigma" => "σ", 476 | "Greek_tau" => "τ", 477 | "Greek_theta" => "θ", 478 | "Greek_upsilon" => "υ", 479 | "Greek_upsilonaccent" => "ύ", 480 | "Greek_upsilonaccentdieresis" => "ΰ", 481 | "Greek_upsilondieresis" => "ϋ", 482 | "Greek_xi" => "ξ", 483 | "Greek_zeta" => "ζ", 484 | "H" => "H", 485 | "Hcircumflex" => "Ĥ", 486 | "Hstroke" => "Ħ", 487 | "I" => "I", 488 | "Iabovedot" => "İ", 489 | "Iacute" => "Í", 490 | "Ibelowdot" => "Ị", 491 | "Ibreve" => "Ĭ", 492 | "Icircumflex" => "Î", 493 | "Idiaeresis" => "Ï", 494 | "Igrave" => "Ì", 495 | "Ihook" => "Ỉ", 496 | "Imacron" => "Ī", 497 | "Iogonek" => "Į", 498 | "Itilde" => "Ĩ", 499 | "J" => "J", 500 | "Jcircumflex" => "Ĵ", 501 | "K" => "K", 502 | "Kcedilla" => "Ķ", 503 | "Korean_Won" => "₩", 504 | "L" => "L", 505 | "Lacute" => "Ĺ", 506 | "Lbelowdot" => "Ḷ", 507 | "Lcaron" => "Ľ", 508 | "Lcedilla" => "Ļ", 509 | "LiraSign" => "₤", 510 | "Lstroke" => "Ł", 511 | "M" => "M", 512 | "Mabovedot" => "Ṁ", 513 | "Macedonia_DSE" => "Ѕ", 514 | "Macedonia_GJE" => "Ѓ", 515 | "Macedonia_KJE" => "Ќ", 516 | "Macedonia_dse" => "ѕ", 517 | "Macedonia_gje" => "ѓ", 518 | "Macedonia_kje" => "ќ", 519 | "MillSign" => "₥", 520 | "N" => "N", 521 | "Nacute" => "Ń", 522 | "NairaSign" => "₦", 523 | "Ncaron" => "Ň", 524 | "Ncedilla" => "Ņ", 525 | "NewSheqelSign" => "₪", 526 | "Ntilde" => "Ñ", 527 | "O" => "O", 528 | "OE" => "Œ", 529 | "Oacute" => "Ó", 530 | "Obarred" => "Ɵ", 531 | "Obelowdot" => "Ọ", 532 | "Ocaron" => "ǒ", 533 | "Ocircumflex" => "Ô", 534 | "Ocircumflexacute" => "Ố", 535 | "Ocircumflexbelowdot" => "Ộ", 536 | "Ocircumflexgrave" => "Ồ", 537 | "Ocircumflexhook" => "Ổ", 538 | "Ocircumflextilde" => "Ỗ", 539 | "Odiaeresis" => "Ö", 540 | "Odoubleacute" => "Ő", 541 | "Ograve" => "Ò", 542 | "Ohook" => "Ỏ", 543 | "Ohorn" => "Ơ", 544 | "Ohornacute" => "Ớ", 545 | "Ohornbelowdot" => "Ợ", 546 | "Ohorngrave" => "Ờ", 547 | "Ohornhook" => "Ở", 548 | "Ohorntilde" => "Ỡ", 549 | "Omacron" => "Ō", 550 | "Ooblique" => "Ø", 551 | "Oslash" => "Ø", 552 | "Otilde" => "Õ", 553 | "P" => "P", 554 | "Pabovedot" => "Ṗ", 555 | "PesetaSign" => "₧", 556 | "Q" => "Q", 557 | "R" => "R", 558 | "Racute" => "Ŕ", 559 | "Rcaron" => "Ř", 560 | "Rcedilla" => "Ŗ", 561 | "RupeeSign" => "₨", 562 | "S" => "S", 563 | "SCHWA" => "Ə", 564 | "Sabovedot" => "Ṡ", 565 | "Sacute" => "Ś", 566 | "Scaron" => "Š", 567 | "Scedilla" => "Ş", 568 | "Scircumflex" => "Ŝ", 569 | "Serbian_DJE" => "Ђ", 570 | "Serbian_TSHE" => "Ћ", 571 | "Serbian_dje" => "ђ", 572 | "Serbian_tshe" => "ћ", 573 | "T" => "T", 574 | "THORN" => "Þ", 575 | "Tabovedot" => "Ṫ", 576 | "Tcaron" => "Ť", 577 | "Tcedilla" => "Ţ", 578 | "Thai_baht" => "฿", 579 | "Thai_bobaimai" => "บ", 580 | "Thai_chochan" => "จ", 581 | "Thai_chochang" => "ช", 582 | "Thai_choching" => "ฉ", 583 | "Thai_chochoe" => "ฌ", 584 | "Thai_dochada" => "ฎ", 585 | "Thai_dodek" => "ด", 586 | "Thai_fofa" => "ฝ", 587 | "Thai_fofan" => "ฟ", 588 | "Thai_hohip" => "ห", 589 | "Thai_honokhuk" => "ฮ", 590 | "Thai_khokhai" => "ข", 591 | "Thai_khokhon" => "ฅ", 592 | "Thai_khokhuat" => "ฃ", 593 | "Thai_khokhwai" => "ค", 594 | "Thai_khorakhang" => "ฆ", 595 | "Thai_kokai" => "ก", 596 | "Thai_lakkhangyao" => "ๅ", 597 | "Thai_lekchet" => "๗", 598 | "Thai_lekha" => "๕", 599 | "Thai_lekhok" => "๖", 600 | "Thai_lekkao" => "๙", 601 | "Thai_leknung" => "๑", 602 | "Thai_lekpaet" => "๘", 603 | "Thai_leksam" => "๓", 604 | "Thai_leksi" => "๔", 605 | "Thai_leksong" => "๒", 606 | "Thai_leksun" => "๐", 607 | "Thai_lochula" => "ฬ", 608 | "Thai_loling" => "ล", 609 | "Thai_lu" => "ฦ", 610 | "Thai_maichattawa" => "๋", 611 | "Thai_maiek" => "่", 612 | "Thai_maihanakat" => "ั", 613 | "Thai_maitaikhu" => "็", 614 | "Thai_maitho" => "้", 615 | "Thai_maitri" => "๊", 616 | "Thai_maiyamok" => "ๆ", 617 | "Thai_moma" => "ม", 618 | "Thai_ngongu" => "ง", 619 | "Thai_nikhahit" => "ํ", 620 | "Thai_nonen" => "ณ", 621 | "Thai_nonu" => "น", 622 | "Thai_oang" => "อ", 623 | "Thai_paiyannoi" => "ฯ", 624 | "Thai_phinthu" => "ฺ", 625 | "Thai_phophan" => "พ", 626 | "Thai_phophung" => "ผ", 627 | "Thai_phosamphao" => "ภ", 628 | "Thai_popla" => "ป", 629 | "Thai_rorua" => "ร", 630 | "Thai_ru" => "ฤ", 631 | "Thai_saraa" => "ะ", 632 | "Thai_saraaa" => "า", 633 | "Thai_saraae" => "แ", 634 | "Thai_saraaimaimalai" => "ไ", 635 | "Thai_saraaimaimuan" => "ใ", 636 | "Thai_saraam" => "ำ", 637 | "Thai_sarae" => "เ", 638 | "Thai_sarai" => "ิ", 639 | "Thai_saraii" => "ี", 640 | "Thai_sarao" => "โ", 641 | "Thai_sarau" => "ุ", 642 | "Thai_saraue" => "ึ", 643 | "Thai_sarauee" => "ื", 644 | "Thai_sarauu" => "ู", 645 | "Thai_sorusi" => "ษ", 646 | "Thai_sosala" => "ศ", 647 | "Thai_soso" => "ซ", 648 | "Thai_sosua" => "ส", 649 | "Thai_thanthakhat" => "์", 650 | "Thai_thonangmontho" => "ฑ", 651 | "Thai_thophuthao" => "ฒ", 652 | "Thai_thothahan" => "ท", 653 | "Thai_thothan" => "ฐ", 654 | "Thai_thothong" => "ธ", 655 | "Thai_thothung" => "ถ", 656 | "Thai_topatak" => "ฏ", 657 | "Thai_totao" => "ต", 658 | "Thai_wowaen" => "ว", 659 | "Thai_yoyak" => "ย", 660 | "Thai_yoying" => "ญ", 661 | "Tslash" => "Ŧ", 662 | "U" => "U", 663 | "Uacute" => "Ú", 664 | "Ubelowdot" => "Ụ", 665 | "Ubreve" => "Ŭ", 666 | "Ucircumflex" => "Û", 667 | "Udiaeresis" => "Ü", 668 | "Udoubleacute" => "Ű", 669 | "Ugrave" => "Ù", 670 | "Uhook" => "Ủ", 671 | "Uhorn" => "Ư", 672 | "Uhornacute" => "Ứ", 673 | "Uhornbelowdot" => "Ự", 674 | "Uhorngrave" => "Ừ", 675 | "Uhornhook" => "Ử", 676 | "Uhorntilde" => "Ữ", 677 | "Ukrainian_GHE_WITH_UPTURN" => "Ґ", 678 | "Ukrainian_I" => "І", 679 | "Ukrainian_IE" => "Є", 680 | "Ukrainian_YI" => "Ї", 681 | "Ukrainian_ghe_with_upturn" => "ґ", 682 | "Ukrainian_i" => "і", 683 | "Ukrainian_ie" => "є", 684 | "Ukrainian_yi" => "ї", 685 | "Umacron" => "Ū", 686 | "Uogonek" => "Ų", 687 | "Uring" => "Ů", 688 | "Utilde" => "Ũ", 689 | "V" => "V", 690 | "W" => "W", 691 | "Wacute" => "Ẃ", 692 | "Wcircumflex" => "Ŵ", 693 | "Wdiaeresis" => "Ẅ", 694 | "Wgrave" => "Ẁ", 695 | "WonSign" => "₩", 696 | "X" => "X", 697 | "Xabovedot" => "Ẋ", 698 | "Y" => "Y", 699 | "Yacute" => "Ý", 700 | "Ybelowdot" => "Ỵ", 701 | "Ycircumflex" => "Ŷ", 702 | "Ydiaeresis" => "Ÿ", 703 | "Ygrave" => "Ỳ", 704 | "Yhook" => "Ỷ", 705 | "Ytilde" => "Ỹ", 706 | "Z" => "Z", 707 | "Zabovedot" => "Ż", 708 | "Zacute" => "Ź", 709 | "Zcaron" => "Ž", 710 | "Zstroke" => "Ƶ", 711 | "a" => "a", 712 | "aacute" => "á", 713 | "abelowdot" => "ạ", 714 | "abovedot" => "˙", 715 | "abreve" => "ă", 716 | "abreveacute" => "ắ", 717 | "abrevebelowdot" => "ặ", 718 | "abrevegrave" => "ằ", 719 | "abrevehook" => "ẳ", 720 | "abrevetilde" => "ẵ", 721 | "acircumflex" => "â", 722 | "acircumflexacute" => "ấ", 723 | "acircumflexbelowdot" => "ậ", 724 | "acircumflexgrave" => "ầ", 725 | "acircumflexhook" => "ẩ", 726 | "acircumflextilde" => "ẫ", 727 | "acute" => "´", 728 | "adiaeresis" => "ä", 729 | "ae" => "æ", 730 | "agrave" => "à", 731 | "ahook" => "ả", 732 | "amacron" => "ā", 733 | "ampersand" => "&", 734 | "aogonek" => "ą", 735 | "apostrophe" => "'", 736 | "approxeq" => "≅", 737 | "approximate" => "∼", 738 | "aring" => "å", 739 | "asciicircum" => "^", 740 | "asciitilde" => "~", 741 | "asterisk" => "*", 742 | "at" => "@", 743 | "atilde" => "ã", 744 | "b" => "b", 745 | "babovedot" => "ḃ", 746 | "backslash" => "\\", 747 | "ballotcross" => "✗", 748 | "bar" => "|", 749 | "because" => "∵", 750 | "botintegral" => "⌡", 751 | "botleftparens" => "⎝", 752 | "botleftsqbracket" => "⎣", 753 | "botrightparens" => "⎠", 754 | "botrightsqbracket" => "⎦", 755 | "bott" => "┴", 756 | "braceleft" => "{", 757 | "braceright" => "}", 758 | "bracketleft" => "[", 759 | "bracketright" => "]", 760 | "braille_blank" => "⠀", 761 | "braille_dots_1" => "⠁", 762 | "braille_dots_12" => "⠃", 763 | "braille_dots_123" => "⠇", 764 | "braille_dots_1234" => "⠏", 765 | "braille_dots_12345" => "⠟", 766 | "braille_dots_123456" => "⠿", 767 | "braille_dots_1234567" => "⡿", 768 | "braille_dots_12345678" => "⣿", 769 | "braille_dots_1234568" => "⢿", 770 | "braille_dots_123457" => "⡟", 771 | "braille_dots_1234578" => "⣟", 772 | "braille_dots_123458" => "⢟", 773 | "braille_dots_12346" => "⠯", 774 | "braille_dots_123467" => "⡯", 775 | "braille_dots_1234678" => "⣯", 776 | "braille_dots_123468" => "⢯", 777 | "braille_dots_12347" => "⡏", 778 | "braille_dots_123478" => "⣏", 779 | "braille_dots_12348" => "⢏", 780 | "braille_dots_1235" => "⠗", 781 | "braille_dots_12356" => "⠷", 782 | "braille_dots_123567" => "⡷", 783 | "braille_dots_1235678" => "⣷", 784 | "braille_dots_123568" => "⢷", 785 | "braille_dots_12357" => "⡗", 786 | "braille_dots_123578" => "⣗", 787 | "braille_dots_12358" => "⢗", 788 | "braille_dots_1236" => "⠧", 789 | "braille_dots_12367" => "⡧", 790 | "braille_dots_123678" => "⣧", 791 | "braille_dots_12368" => "⢧", 792 | "braille_dots_1237" => "⡇", 793 | "braille_dots_12378" => "⣇", 794 | "braille_dots_1238" => "⢇", 795 | "braille_dots_124" => "⠋", 796 | "braille_dots_1245" => "⠛", 797 | "braille_dots_12456" => "⠻", 798 | "braille_dots_124567" => "⡻", 799 | "braille_dots_1245678" => "⣻", 800 | "braille_dots_124568" => "⢻", 801 | "braille_dots_12457" => "⡛", 802 | "braille_dots_124578" => "⣛", 803 | "braille_dots_12458" => "⢛", 804 | "braille_dots_1246" => "⠫", 805 | "braille_dots_12467" => "⡫", 806 | "braille_dots_124678" => "⣫", 807 | "braille_dots_12468" => "⢫", 808 | "braille_dots_1247" => "⡋", 809 | "braille_dots_12478" => "⣋", 810 | "braille_dots_1248" => "⢋", 811 | "braille_dots_125" => "⠓", 812 | "braille_dots_1256" => "⠳", 813 | "braille_dots_12567" => "⡳", 814 | "braille_dots_125678" => "⣳", 815 | "braille_dots_12568" => "⢳", 816 | "braille_dots_1257" => "⡓", 817 | "braille_dots_12578" => "⣓", 818 | "braille_dots_1258" => "⢓", 819 | "braille_dots_126" => "⠣", 820 | "braille_dots_1267" => "⡣", 821 | "braille_dots_12678" => "⣣", 822 | "braille_dots_1268" => "⢣", 823 | "braille_dots_127" => "⡃", 824 | "braille_dots_1278" => "⣃", 825 | "braille_dots_128" => "⢃", 826 | "braille_dots_13" => "⠅", 827 | "braille_dots_134" => "⠍", 828 | "braille_dots_1345" => "⠝", 829 | "braille_dots_13456" => "⠽", 830 | "braille_dots_134567" => "⡽", 831 | "braille_dots_1345678" => "⣽", 832 | "braille_dots_134568" => "⢽", 833 | "braille_dots_13457" => "⡝", 834 | "braille_dots_134578" => "⣝", 835 | "braille_dots_13458" => "⢝", 836 | "braille_dots_1346" => "⠭", 837 | "braille_dots_13467" => "⡭", 838 | "braille_dots_134678" => "⣭", 839 | "braille_dots_13468" => "⢭", 840 | "braille_dots_1347" => "⡍", 841 | "braille_dots_13478" => "⣍", 842 | "braille_dots_1348" => "⢍", 843 | "braille_dots_135" => "⠕", 844 | "braille_dots_1356" => "⠵", 845 | "braille_dots_13567" => "⡵", 846 | "braille_dots_135678" => "⣵", 847 | "braille_dots_13568" => "⢵", 848 | "braille_dots_1357" => "⡕", 849 | "braille_dots_13578" => "⣕", 850 | "braille_dots_1358" => "⢕", 851 | "braille_dots_136" => "⠥", 852 | "braille_dots_1367" => "⡥", 853 | "braille_dots_13678" => "⣥", 854 | "braille_dots_1368" => "⢥", 855 | "braille_dots_137" => "⡅", 856 | "braille_dots_1378" => "⣅", 857 | "braille_dots_138" => "⢅", 858 | "braille_dots_14" => "⠉", 859 | "braille_dots_145" => "⠙", 860 | "braille_dots_1456" => "⠹", 861 | "braille_dots_14567" => "⡹", 862 | "braille_dots_145678" => "⣹", 863 | "braille_dots_14568" => "⢹", 864 | "braille_dots_1457" => "⡙", 865 | "braille_dots_14578" => "⣙", 866 | "braille_dots_1458" => "⢙", 867 | "braille_dots_146" => "⠩", 868 | "braille_dots_1467" => "⡩", 869 | "braille_dots_14678" => "⣩", 870 | "braille_dots_1468" => "⢩", 871 | "braille_dots_147" => "⡉", 872 | "braille_dots_1478" => "⣉", 873 | "braille_dots_148" => "⢉", 874 | "braille_dots_15" => "⠑", 875 | "braille_dots_156" => "⠱", 876 | "braille_dots_1567" => "⡱", 877 | "braille_dots_15678" => "⣱", 878 | "braille_dots_1568" => "⢱", 879 | "braille_dots_157" => "⡑", 880 | "braille_dots_1578" => "⣑", 881 | "braille_dots_158" => "⢑", 882 | "braille_dots_16" => "⠡", 883 | "braille_dots_167" => "⡡", 884 | "braille_dots_1678" => "⣡", 885 | "braille_dots_168" => "⢡", 886 | "braille_dots_17" => "⡁", 887 | "braille_dots_178" => "⣁", 888 | "braille_dots_18" => "⢁", 889 | "braille_dots_2" => "⠂", 890 | "braille_dots_23" => "⠆", 891 | "braille_dots_234" => "⠎", 892 | "braille_dots_2345" => "⠞", 893 | "braille_dots_23456" => "⠾", 894 | "braille_dots_234567" => "⡾", 895 | "braille_dots_2345678" => "⣾", 896 | "braille_dots_234568" => "⢾", 897 | "braille_dots_23457" => "⡞", 898 | "braille_dots_234578" => "⣞", 899 | "braille_dots_23458" => "⢞", 900 | "braille_dots_2346" => "⠮", 901 | "braille_dots_23467" => "⡮", 902 | "braille_dots_234678" => "⣮", 903 | "braille_dots_23468" => "⢮", 904 | "braille_dots_2347" => "⡎", 905 | "braille_dots_23478" => "⣎", 906 | "braille_dots_2348" => "⢎", 907 | "braille_dots_235" => "⠖", 908 | "braille_dots_2356" => "⠶", 909 | "braille_dots_23567" => "⡶", 910 | "braille_dots_235678" => "⣶", 911 | "braille_dots_23568" => "⢶", 912 | "braille_dots_2357" => "⡖", 913 | "braille_dots_23578" => "⣖", 914 | "braille_dots_2358" => "⢖", 915 | "braille_dots_236" => "⠦", 916 | "braille_dots_2367" => "⡦", 917 | "braille_dots_23678" => "⣦", 918 | "braille_dots_2368" => "⢦", 919 | "braille_dots_237" => "⡆", 920 | "braille_dots_2378" => "⣆", 921 | "braille_dots_238" => "⢆", 922 | "braille_dots_24" => "⠊", 923 | "braille_dots_245" => "⠚", 924 | "braille_dots_2456" => "⠺", 925 | "braille_dots_24567" => "⡺", 926 | "braille_dots_245678" => "⣺", 927 | "braille_dots_24568" => "⢺", 928 | "braille_dots_2457" => "⡚", 929 | "braille_dots_24578" => "⣚", 930 | "braille_dots_2458" => "⢚", 931 | "braille_dots_246" => "⠪", 932 | "braille_dots_2467" => "⡪", 933 | "braille_dots_24678" => "⣪", 934 | "braille_dots_2468" => "⢪", 935 | "braille_dots_247" => "⡊", 936 | "braille_dots_2478" => "⣊", 937 | "braille_dots_248" => "⢊", 938 | "braille_dots_25" => "⠒", 939 | "braille_dots_256" => "⠲", 940 | "braille_dots_2567" => "⡲", 941 | "braille_dots_25678" => "⣲", 942 | "braille_dots_2568" => "⢲", 943 | "braille_dots_257" => "⡒", 944 | "braille_dots_2578" => "⣒", 945 | "braille_dots_258" => "⢒", 946 | "braille_dots_26" => "⠢", 947 | "braille_dots_267" => "⡢", 948 | "braille_dots_2678" => "⣢", 949 | "braille_dots_268" => "⢢", 950 | "braille_dots_27" => "⡂", 951 | "braille_dots_278" => "⣂", 952 | "braille_dots_28" => "⢂", 953 | "braille_dots_3" => "⠄", 954 | "braille_dots_34" => "⠌", 955 | "braille_dots_345" => "⠜", 956 | "braille_dots_3456" => "⠼", 957 | "braille_dots_34567" => "⡼", 958 | "braille_dots_345678" => "⣼", 959 | "braille_dots_34568" => "⢼", 960 | "braille_dots_3457" => "⡜", 961 | "braille_dots_34578" => "⣜", 962 | "braille_dots_3458" => "⢜", 963 | "braille_dots_346" => "⠬", 964 | "braille_dots_3467" => "⡬", 965 | "braille_dots_34678" => "⣬", 966 | "braille_dots_3468" => "⢬", 967 | "braille_dots_347" => "⡌", 968 | "braille_dots_3478" => "⣌", 969 | "braille_dots_348" => "⢌", 970 | "braille_dots_35" => "⠔", 971 | "braille_dots_356" => "⠴", 972 | "braille_dots_3567" => "⡴", 973 | "braille_dots_35678" => "⣴", 974 | "braille_dots_3568" => "⢴", 975 | "braille_dots_357" => "⡔", 976 | "braille_dots_3578" => "⣔", 977 | "braille_dots_358" => "⢔", 978 | "braille_dots_36" => "⠤", 979 | "braille_dots_367" => "⡤", 980 | "braille_dots_3678" => "⣤", 981 | "braille_dots_368" => "⢤", 982 | "braille_dots_37" => "⡄", 983 | "braille_dots_378" => "⣄", 984 | "braille_dots_38" => "⢄", 985 | "braille_dots_4" => "⠈", 986 | "braille_dots_45" => "⠘", 987 | "braille_dots_456" => "⠸", 988 | "braille_dots_4567" => "⡸", 989 | "braille_dots_45678" => "⣸", 990 | "braille_dots_4568" => "⢸", 991 | "braille_dots_457" => "⡘", 992 | "braille_dots_4578" => "⣘", 993 | "braille_dots_458" => "⢘", 994 | "braille_dots_46" => "⠨", 995 | "braille_dots_467" => "⡨", 996 | "braille_dots_4678" => "⣨", 997 | "braille_dots_468" => "⢨", 998 | "braille_dots_47" => "⡈", 999 | "braille_dots_478" => "⣈", 1000 | "braille_dots_48" => "⢈", 1001 | "braille_dots_5" => "⠐", 1002 | "braille_dots_56" => "⠰", 1003 | "braille_dots_567" => "⡰", 1004 | "braille_dots_5678" => "⣰", 1005 | "braille_dots_568" => "⢰", 1006 | "braille_dots_57" => "⡐", 1007 | "braille_dots_578" => "⣐", 1008 | "braille_dots_58" => "⢐", 1009 | "braille_dots_6" => "⠠", 1010 | "braille_dots_67" => "⡠", 1011 | "braille_dots_678" => "⣠", 1012 | "braille_dots_68" => "⢠", 1013 | "braille_dots_7" => "⡀", 1014 | "braille_dots_78" => "⣀", 1015 | "braille_dots_8" => "⢀", 1016 | "breve" => "˘", 1017 | "brokenbar" => "¦", 1018 | "c" => "c", 1019 | "cabovedot" => "ċ", 1020 | "cacute" => "ć", 1021 | "careof" => "℅", 1022 | "caret" => "‸", 1023 | "caron" => "ˇ", 1024 | "ccaron" => "č", 1025 | "ccedilla" => "ç", 1026 | "ccircumflex" => "ĉ", 1027 | "cedilla" => "¸", 1028 | "cent" => "¢", 1029 | "checkerboard" => "▒", 1030 | "checkmark" => "✓", 1031 | "circle" => "○", 1032 | "club" => "♣", 1033 | "colon" => ":", 1034 | "comma" => ",", 1035 | "containsas" => "∋", 1036 | "copyright" => "©", 1037 | "cr" => "␍", 1038 | "crossinglines" => "┼", 1039 | "cuberoot" => "∛", 1040 | "currency" => "¤", 1041 | "d" => "d", 1042 | "dabovedot" => "ḋ", 1043 | "dagger" => "†", 1044 | "dcaron" => "ď", 1045 | "decimalpoint" => ".", 1046 | "degree" => "°", 1047 | "diaeresis" => "¨", 1048 | "diamond" => "♦", 1049 | "digitspace" => " ", 1050 | "dintegral" => "∬", 1051 | "division" => "÷", 1052 | "dollar" => "$", 1053 | "doubbaselinedot" => "‥", 1054 | "doubleacute" => "˝", 1055 | "doubledagger" => "‡", 1056 | "doublelowquotemark" => "„", 1057 | "downarrow" => "↓", 1058 | "downcaret" => "∨", 1059 | "downshoe" => "∪", 1060 | "downstile" => "⌊", 1061 | "downtack" => "⊤", 1062 | "dstroke" => "đ", 1063 | "e" => "e", 1064 | "eabovedot" => "ė", 1065 | "eacute" => "é", 1066 | "ebelowdot" => "ẹ", 1067 | "ecaron" => "ě", 1068 | "ecircumflex" => "ê", 1069 | "ecircumflexacute" => "ế", 1070 | "ecircumflexbelowdot" => "ệ", 1071 | "ecircumflexgrave" => "ề", 1072 | "ecircumflexhook" => "ể", 1073 | "ecircumflextilde" => "ễ", 1074 | "ediaeresis" => "ë", 1075 | "egrave" => "è", 1076 | "ehook" => "ẻ", 1077 | "eightsubscript" => "₈", 1078 | "eightsuperior" => "⁸", 1079 | "elementof" => "∈", 1080 | "ellipsis" => "…", 1081 | "em3space" => " ", 1082 | "em4space" => " ", 1083 | "emacron" => "ē", 1084 | "emdash" => "—", 1085 | "emfilledcircle" => "●", 1086 | "emfilledrect" => "▮", 1087 | "emopencircle" => "○", 1088 | "emopenrectangle" => "▯", 1089 | "emptyset" => "∅", 1090 | "emspace" => " ", 1091 | "endash" => "–", 1092 | "enfilledcircbullet" => "•", 1093 | "enfilledsqbullet" => "▪", 1094 | "eng" => "ŋ", 1095 | "enopencircbullet" => "◦", 1096 | "enopensquarebullet" => "▫", 1097 | "enspace" => " ", 1098 | "eogonek" => "ę", 1099 | "equal" => "=", 1100 | "eth" => "ð", 1101 | "etilde" => "ẽ", 1102 | "exclam" => "!", 1103 | "exclamdown" => "¡", 1104 | "f" => "f", 1105 | "fabovedot" => "ḟ", 1106 | "femalesymbol" => "♀", 1107 | "ff" => "␌", 1108 | "figdash" => "‒", 1109 | "filledlefttribullet" => "◀", 1110 | "filledrectbullet" => "▬", 1111 | "filledrighttribullet" => "▶", 1112 | "filledtribulletdown" => "▼", 1113 | "filledtribulletup" => "▲", 1114 | "fiveeighths" => "⅝", 1115 | "fivesixths" => "⅚", 1116 | "fivesubscript" => "₅", 1117 | "fivesuperior" => "⁵", 1118 | "fourfifths" => "⅘", 1119 | "foursubscript" => "₄", 1120 | "foursuperior" => "⁴", 1121 | "fourthroot" => "∜", 1122 | "function" => "ƒ", 1123 | "g" => "g", 1124 | "gabovedot" => "ġ", 1125 | "gbreve" => "ğ", 1126 | "gcaron" => "ǧ", 1127 | "gcedilla" => "ģ", 1128 | "gcircumflex" => "ĝ", 1129 | "grave" => "`", 1130 | "greater" => ">", 1131 | "greaterthanequal" => "≥", 1132 | "guillemotleft" => "«", 1133 | "guillemotright" => "»", 1134 | "h" => "h", 1135 | "hairspace" => " ", 1136 | "hcircumflex" => "ĥ", 1137 | "heart" => "♥", 1138 | "hebrew_aleph" => "א", 1139 | "hebrew_ayin" => "ע", 1140 | "hebrew_bet" => "ב", 1141 | "hebrew_chet" => "ח", 1142 | "hebrew_dalet" => "ד", 1143 | "hebrew_doublelowline" => "‗", 1144 | "hebrew_finalkaph" => "ך", 1145 | "hebrew_finalmem" => "ם", 1146 | "hebrew_finalnun" => "ן", 1147 | "hebrew_finalpe" => "ף", 1148 | "hebrew_finalzade" => "ץ", 1149 | "hebrew_gimel" => "ג", 1150 | "hebrew_he" => "ה", 1151 | "hebrew_kaph" => "כ", 1152 | "hebrew_lamed" => "ל", 1153 | "hebrew_mem" => "מ", 1154 | "hebrew_nun" => "נ", 1155 | "hebrew_pe" => "פ", 1156 | "hebrew_qoph" => "ק", 1157 | "hebrew_resh" => "ר", 1158 | "hebrew_samech" => "ס", 1159 | "hebrew_shin" => "ש", 1160 | "hebrew_taw" => "ת", 1161 | "hebrew_tet" => "ט", 1162 | "hebrew_waw" => "ו", 1163 | "hebrew_yod" => "י", 1164 | "hebrew_zade" => "צ", 1165 | "hebrew_zain" => "ז", 1166 | "horizconnector" => "─", 1167 | "horizlinescan1" => "⎺", 1168 | "horizlinescan3" => "⎻", 1169 | "horizlinescan5" => "─", 1170 | "horizlinescan7" => "⎼", 1171 | "horizlinescan9" => "⎽", 1172 | "hstroke" => "ħ", 1173 | "ht" => "␉", 1174 | "hyphen" => "­", 1175 | "i" => "i", 1176 | "iacute" => "í", 1177 | "ibelowdot" => "ị", 1178 | "ibreve" => "ĭ", 1179 | "icircumflex" => "î", 1180 | "identical" => "≡", 1181 | "idiaeresis" => "ï", 1182 | "idotless" => "ı", 1183 | "ifonlyif" => "⇔", 1184 | "igrave" => "ì", 1185 | "ihook" => "ỉ", 1186 | "imacron" => "ī", 1187 | "implies" => "⇒", 1188 | "includedin" => "⊂", 1189 | "includes" => "⊃", 1190 | "infinity" => "∞", 1191 | "integral" => "∫", 1192 | "intersection" => "∩", 1193 | "iogonek" => "į", 1194 | "itilde" => "ĩ", 1195 | "j" => "j", 1196 | "jcircumflex" => "ĵ", 1197 | "jot" => "∘", 1198 | "k" => "k", 1199 | "kana_A" => "ア", 1200 | "kana_CHI" => "チ", 1201 | "kana_E" => "エ", 1202 | "kana_FU" => "フ", 1203 | "kana_HA" => "ハ", 1204 | "kana_HE" => "ヘ", 1205 | "kana_HI" => "ヒ", 1206 | "kana_HO" => "ホ", 1207 | "kana_I" => "イ", 1208 | "kana_KA" => "カ", 1209 | "kana_KE" => "ケ", 1210 | "kana_KI" => "キ", 1211 | "kana_KO" => "コ", 1212 | "kana_KU" => "ク", 1213 | "kana_MA" => "マ", 1214 | "kana_ME" => "メ", 1215 | "kana_MI" => "ミ", 1216 | "kana_MO" => "モ", 1217 | "kana_MU" => "ム", 1218 | "kana_N" => "ン", 1219 | "kana_NA" => "ナ", 1220 | "kana_NE" => "ネ", 1221 | "kana_NI" => "ニ", 1222 | "kana_NO" => "ノ", 1223 | "kana_NU" => "ヌ", 1224 | "kana_O" => "オ", 1225 | "kana_RA" => "ラ", 1226 | "kana_RE" => "レ", 1227 | "kana_RI" => "リ", 1228 | "kana_RO" => "ロ", 1229 | "kana_RU" => "ル", 1230 | "kana_SA" => "サ", 1231 | "kana_SE" => "セ", 1232 | "kana_SHI" => "シ", 1233 | "kana_SO" => "ソ", 1234 | "kana_SU" => "ス", 1235 | "kana_TA" => "タ", 1236 | "kana_TE" => "テ", 1237 | "kana_TO" => "ト", 1238 | "kana_TSU" => "ツ", 1239 | "kana_U" => "ウ", 1240 | "kana_WA" => "ワ", 1241 | "kana_WO" => "ヲ", 1242 | "kana_YA" => "ヤ", 1243 | "kana_YO" => "ヨ", 1244 | "kana_YU" => "ユ", 1245 | "kana_a" => "ァ", 1246 | "kana_closingbracket" => "」", 1247 | "kana_comma" => "、", 1248 | "kana_conjunctive" => "・", 1249 | "kana_e" => "ェ", 1250 | "kana_fullstop" => "。", 1251 | "kana_i" => "ィ", 1252 | "kana_o" => "ォ", 1253 | "kana_openingbracket" => "「", 1254 | "kana_tsu" => "ッ", 1255 | "kana_u" => "ゥ", 1256 | "kana_ya" => "ャ", 1257 | "kana_yo" => "ョ", 1258 | "kana_yu" => "ュ", 1259 | "kcedilla" => "ķ", 1260 | "kra" => "ĸ", 1261 | "l" => "l", 1262 | "lacute" => "ĺ", 1263 | "latincross" => "✝", 1264 | "lbelowdot" => "ḷ", 1265 | "lcaron" => "ľ", 1266 | "lcedilla" => "ļ", 1267 | "leftanglebracket" => "⟨", 1268 | "leftarrow" => "←", 1269 | "leftcaret" => "<", 1270 | "leftdoublequotemark" => "“", 1271 | "leftmiddlecurlybrace" => "⎨", 1272 | "leftopentriangle" => "◁", 1273 | "leftpointer" => "☜", 1274 | "leftradical" => "⎷", 1275 | "leftshoe" => "⊂", 1276 | "leftsinglequotemark" => "‘", 1277 | "leftt" => "├", 1278 | "lefttack" => "⊣", 1279 | "less" => "<", 1280 | "lessthanequal" => "≤", 1281 | "lf" => "␊", 1282 | "logicaland" => "∧", 1283 | "logicalor" => "∨", 1284 | "lowleftcorner" => "└", 1285 | "lowrightcorner" => "┘", 1286 | "lstroke" => "ł", 1287 | "m" => "m", 1288 | "mabovedot" => "ṁ", 1289 | "macron" => "¯", 1290 | "malesymbol" => "♂", 1291 | "maltesecross" => "✠", 1292 | "masculine" => "º", 1293 | "minus" => "-", 1294 | "minutes" => "′", 1295 | "mu" => "µ", 1296 | "multiply" => "×", 1297 | "musicalflat" => "♭", 1298 | "musicalsharp" => "♯", 1299 | "n" => "n", 1300 | "nabla" => "∇", 1301 | "nacute" => "ń", 1302 | "ncaron" => "ň", 1303 | "ncedilla" => "ņ", 1304 | "ninesubscript" => "₉", 1305 | "ninesuperior" => "⁹", 1306 | "nl" => "␤", 1307 | "nobreakspace" => " ", 1308 | "notapproxeq" => "≇", 1309 | "notelementof" => "∉", 1310 | "notequal" => "≠", 1311 | "notidentical" => "≢", 1312 | "notsign" => "¬", 1313 | "ntilde" => "ñ", 1314 | "numbersign" => "#", 1315 | "numerosign" => "№", 1316 | "o" => "o", 1317 | "oacute" => "ó", 1318 | "obarred" => "ɵ", 1319 | "obelowdot" => "ọ", 1320 | "ocaron" => "ǒ", 1321 | "ocircumflex" => "ô", 1322 | "ocircumflexacute" => "ố", 1323 | "ocircumflexbelowdot" => "ộ", 1324 | "ocircumflexgrave" => "ồ", 1325 | "ocircumflexhook" => "ổ", 1326 | "ocircumflextilde" => "ỗ", 1327 | "odiaeresis" => "ö", 1328 | "odoubleacute" => "ő", 1329 | "oe" => "œ", 1330 | "ogonek" => "˛", 1331 | "ograve" => "ò", 1332 | "ohook" => "ỏ", 1333 | "ohorn" => "ơ", 1334 | "ohornacute" => "ớ", 1335 | "ohornbelowdot" => "ợ", 1336 | "ohorngrave" => "ờ", 1337 | "ohornhook" => "ở", 1338 | "ohorntilde" => "ỡ", 1339 | "omacron" => "ō", 1340 | "oneeighth" => "⅛", 1341 | "onefifth" => "⅕", 1342 | "onehalf" => "½", 1343 | "onequarter" => "¼", 1344 | "onesixth" => "⅙", 1345 | "onesubscript" => "₁", 1346 | "onesuperior" => "¹", 1347 | "onethird" => "⅓", 1348 | "ooblique" => "ø", 1349 | "openrectbullet" => "▭", 1350 | "openstar" => "☆", 1351 | "opentribulletdown" => "▽", 1352 | "opentribulletup" => "△", 1353 | "ordfeminine" => "ª", 1354 | "oslash" => "ø", 1355 | "otilde" => "õ", 1356 | "overbar" => "¯", 1357 | "overline" => "‾", 1358 | "p" => "p", 1359 | "pabovedot" => "ṗ", 1360 | "paragraph" => "¶", 1361 | "parenleft" => "(", 1362 | "parenright" => ")", 1363 | "partdifferential" => "∂", 1364 | "partialderivative" => "∂", 1365 | "percent" => "%", 1366 | "period" => ".", 1367 | "periodcentered" => "·", 1368 | "phonographcopyright" => "℗", 1369 | "plus" => "+", 1370 | "plusminus" => "±", 1371 | "prescription" => "℞", 1372 | "prolongedsound" => "ー", 1373 | "punctspace" => " ", 1374 | "q" => "q", 1375 | "quad" => "⎕", 1376 | "question" => "?", 1377 | "questiondown" => "¿", 1378 | "quotedbl" => "\"", 1379 | "r" => "r", 1380 | "racute" => "ŕ", 1381 | "radical" => "√", 1382 | "rcaron" => "ř", 1383 | "rcedilla" => "ŗ", 1384 | "registered" => "®", 1385 | "rightanglebracket" => "⟩", 1386 | "rightarrow" => "→", 1387 | "rightcaret" => ">", 1388 | "rightdoublequotemark" => "”", 1389 | "rightmiddlecurlybrace" => "⎬", 1390 | "rightopentriangle" => "▷", 1391 | "rightpointer" => "☞", 1392 | "rightshoe" => "⊃", 1393 | "rightsinglequotemark" => "’", 1394 | "rightt" => "┤", 1395 | "righttack" => "⊢", 1396 | "s" => "s", 1397 | "sabovedot" => "ṡ", 1398 | "sacute" => "ś", 1399 | "scaron" => "š", 1400 | "scedilla" => "ş", 1401 | "schwa" => "ə", 1402 | "scircumflex" => "ŝ", 1403 | "seconds" => "″", 1404 | "section" => "§", 1405 | "semicolon" => ";", 1406 | "semivoicedsound" => "゜", 1407 | "seveneighths" => "⅞", 1408 | "sevensubscript" => "₇", 1409 | "sevensuperior" => "⁷", 1410 | "signaturemark" => "☓", 1411 | "signifblank" => "␣", 1412 | "similarequal" => "≃", 1413 | "singlelowquotemark" => "‚", 1414 | "sixsubscript" => "₆", 1415 | "sixsuperior" => "⁶", 1416 | "slash" => "/", 1417 | "soliddiamond" => "◆", 1418 | "space" => " ", 1419 | "squareroot" => "√", 1420 | "ssharp" => "ß", 1421 | "sterling" => "£", 1422 | "stricteq" => "≣", 1423 | "t" => "t", 1424 | "tabovedot" => "ṫ", 1425 | "tcaron" => "ť", 1426 | "tcedilla" => "ţ", 1427 | "telephone" => "☎", 1428 | "telephonerecorder" => "⌕", 1429 | "therefore" => "∴", 1430 | "thinspace" => " ", 1431 | "thorn" => "þ", 1432 | "threeeighths" => "⅜", 1433 | "threefifths" => "⅗", 1434 | "threequarters" => "¾", 1435 | "threesubscript" => "₃", 1436 | "threesuperior" => "³", 1437 | "tintegral" => "∭", 1438 | "topintegral" => "⌠", 1439 | "topleftparens" => "⎛", 1440 | "topleftradical" => "┌", 1441 | "topleftsqbracket" => "⎡", 1442 | "toprightparens" => "⎞", 1443 | "toprightsqbracket" => "⎤", 1444 | "topt" => "┬", 1445 | "trademark" => "™", 1446 | "tslash" => "ŧ", 1447 | "twofifths" => "⅖", 1448 | "twosubscript" => "₂", 1449 | "twosuperior" => "²", 1450 | "twothirds" => "⅔", 1451 | "u" => "u", 1452 | "uacute" => "ú", 1453 | "ubelowdot" => "ụ", 1454 | "ubreve" => "ŭ", 1455 | "ucircumflex" => "û", 1456 | "udiaeresis" => "ü", 1457 | "udoubleacute" => "ű", 1458 | "ugrave" => "ù", 1459 | "uhook" => "ủ", 1460 | "uhorn" => "ư", 1461 | "uhornacute" => "ứ", 1462 | "uhornbelowdot" => "ự", 1463 | "uhorngrave" => "ừ", 1464 | "uhornhook" => "ử", 1465 | "uhorntilde" => "ữ", 1466 | "umacron" => "ū", 1467 | "underbar" => "_", 1468 | "underscore" => "_", 1469 | "union" => "∪", 1470 | "uogonek" => "ų", 1471 | "uparrow" => "↑", 1472 | "upcaret" => "∧", 1473 | "upleftcorner" => "┌", 1474 | "uprightcorner" => "┐", 1475 | "upshoe" => "∩", 1476 | "upstile" => "⌈", 1477 | "uptack" => "⊥", 1478 | "uring" => "ů", 1479 | "utilde" => "ũ", 1480 | "v" => "v", 1481 | "variation" => "∝", 1482 | "vertbar" => "│", 1483 | "vertconnector" => "│", 1484 | "voicedsound" => "゛", 1485 | "vt" => "␋", 1486 | "w" => "w", 1487 | "wacute" => "ẃ", 1488 | "wcircumflex" => "ŵ", 1489 | "wdiaeresis" => "ẅ", 1490 | "wgrave" => "ẁ", 1491 | "x" => "x", 1492 | "xabovedot" => "ẋ", 1493 | "y" => "y", 1494 | "yacute" => "ý", 1495 | "ybelowdot" => "ỵ", 1496 | "ycircumflex" => "ŷ", 1497 | "ydiaeresis" => "ÿ", 1498 | "yen" => "¥", 1499 | "ygrave" => "ỳ", 1500 | "yhook" => "ỷ", 1501 | "ytilde" => "ỹ", 1502 | "z" => "z", 1503 | "zabovedot" => "ż", 1504 | "zacute" => "ź", 1505 | "zcaron" => "ž", 1506 | "zerosubscript" => "₀", 1507 | "zerosuperior" => "⁰", 1508 | "zstroke" => "ƶ", 1509 | } 1510 | end 1511 | -------------------------------------------------------------------------------- /xcompose: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8; mode: conf -*- 2 | include "%L" 3 | 4 | # See also http://bleah.co.uk/~simon/stuff/XCompose 5 | # and http://dotfiles.org/~inky/.XCompose 6 | # and http://paste.lisp.org/display/73094 7 | # and https://tools.ietf.org/html/rfc1345 8 | 9 | # scan4dups.py will ignore conflicts marked INTENTIONAL CONFLICT 10 | 11 | # Arrows 12 | # ====== 13 | : "↔" U2194 # INTENTIONAL CONFLICT 14 | : "↑" U2191 15 | : "↑" U2191 16 | : "↓" U2193 17 | : "↓" U2193 18 | 19 | : "↚" U219A # LEFTWARDS ARROW WITH STROKE 20 | : "↛" U219B # RIGHTWARDS ARROW WITH STROKE 21 | : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE 22 | 23 | : "↵" U21B5 # DOWNWARDS ARROW WITH CORNER LEFTWARDS 24 | 25 | : "←" leftarrow # LEFTWARDS ARROW 26 | : "↑" uparrow # UPWARDS ARROW (INTENTIONAL CONFLICT) 27 | : "↓" downarrow # DOWNWARDS ARROW 28 | 29 | : "↕" U2195 # UP DOWN ARROW (kragen's) 30 | : "⇵" U21F5 # DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW 31 | : "⟲" U27F2 # ANTICLOCKWISE GAPPED CIRCLE ARROW 32 | : "⟳" U27F3 # CLOCKWISE GAPPED CIRCLE ARROW (INTENTIONAL CONFLICT) 33 | # FIXME: conflict 34 | # : "↺" U21BA # ANTICLOCKWISE OPEN CIRCLE ARROW 35 | : "↻" U21BB # CLOCKWISE OPEN CIRCLE ARROW 36 | : "⇜" U21DC # LEFTWARDS SQUIGGLE ARROW 37 | : "⇝" U21DD # RIGHTWARDS SQUIGGLE ARROW 38 | : "⇤" U21E4 # LEFTWARDS ARROW TO BAR 39 | : "⇥" U21E5 # RIGHTWARDS ARROW TO BAR 40 | : "⇠" U21E0 # LEFTWARDS DASHED ARROW 41 | : "⇡" U21E1 # UPWARDS DASHED ARROW (INTENTIONAL CONFLICT) 42 | : "⇢" U21E2 # RIGHTWARDS DASHED ARROW 43 | : "⇣" U21E3 # DOWNWARDS DASHED ARROW 44 | 45 | # Doubled arrows 46 | # ============== 47 | : "⇒" U21D2 # RIGHTWARDS DOUBLE ARROW 48 | : "⇐" U21D0 # LEFTWARDS DOUBLE ARROW 49 | # FIXME: a very useful character, but "iff" does not match other sequences; all combinations of <=> conflict 50 | : "⇔" U21D4 # LEFT RIGHT DOUBLE ARROW 51 | : "⇑" U21D1 # UPWARDS DOUBLE ARROW 52 | : "⇓" U21D3 # DOWNWARDS DOUBLE ARROW 53 | : "⇕" U21D5 # UP DOWN DOUBLE ARROW 54 | : "⏎" U23CE # RETURN SYMBOL 55 | 56 | 57 | # Asterisk is commonly used for bullets in ASCII. 58 | : "•" U2022 # BULLET 59 | : "◦" U25E6 # WHITE BULLET 60 | : "‣" U2023 # TRIANGULAR BULLET 61 | : "⁃" U2043 # HYPHEN BULLET 62 | : "⁌" U204C # LEFTWARDS BULLET 63 | : "⁍" U204D # RIGHTWARDS BULLET 64 | : "◘" U25D8 # INVERSE BULLET 65 | # Japanese tainome 66 | : "◉" U25C9 # FISHEYE 67 | 68 | 69 | # perhaps CJK input is better handled by CJK input methods. we try to 70 | # list here only characters that are not typically avaiable in those 71 | # (at least in my experience with Japanese IMs). 72 | 73 | # “nyoro” on JIMs 74 | # <>: "〜" U301C # WAVE DASH 75 | : "〰" U3030 # WAVY DASH (~~ is ≈) 76 | 77 | # FIXME: conflicts 78 | # : "゠" U30A0 # KATAKANA DOUBLE HYPHEN 79 | # : "゠" U30A0 # KATAKANA DOUBLE HYPHEN 80 | 81 | # “kome” IM. 82 | # 83 | # : "※" U203B # REFERENCE MARK 84 | 85 | # VERTICAL FORMS 86 | # ============== 87 | # correct vertical text uses font glyph substitution; the characters 88 | # below are deprecated. since almost no one supports vertical text 89 | # (not even XeTeX!), these my come in handy. 90 | 91 | # « », « » &c. taken 92 | <2> : "‼" U203C # DOUBLE EXCLAMATION MARK 93 | <2> : "⁇" U2047 # DOUBLE QUESTION MARK 94 | # ⁈ 95 | # ⁉ 96 | 97 | 98 | # A quick recap on hyphens and dashes: 99 | # 100 | # • U002D «-» is the ASCII hyphen‐minus. It is overloaded as hyphen, 101 | # dash, and minus sign at the command‐line, programming languages, 102 | # and in software that can’t handle Unicode well. 103 | # • U2010 «‐» is the true hyphen. Use it as the grammatical hyphen 104 | # when you feel typographical. 105 | # • U2011 «‑» is the non‐breaking hyphen. It is visually identical 106 | # to the true hyphen, but tells software they shouldn’t break a line 107 | # at this point. This is useful whenever you feel like an 108 | # hyphenated word musn’t be separated in different lines — for 109 | # example, when a broken hyphenated word could be mistaken by a 110 | # non‐hyphenated word (e.g. “re‑creation”, if broken, could be taken 111 | # as “recreation”). 112 | # • U2012 «‒» is the figure dash. “Figure” here refers to numbers, 113 | # and this dash is guaranteed to be the same width as a digit (in 114 | # fonts with equal‐width digits) so they line up. This dash 115 | # therefore is to be used with digits, as in telephone numbers or 116 | # postal codes. Don’t use it for mathematical operations (for which 117 | # there is the minus sign) or ranges (for which the en‐dash is 118 | # best). See also U2007, the figure space. 119 | # • U2013 «–» is the en‐dash — that is, a dash with roughly the 120 | # width of an uppercase N. It’s kind of a softer (and smaller) 121 | # version of the em‐dash. Its main uses are ranges (“2–10”, 122 | # “Jan–Mar”) and as a further separator for hyphenated words 123 | # (“un‐american–like”). In a pinch, some people use two ASCII 124 | # hyphen‐minuses to substitute it. 125 | # • U2014 «—» is the em‐dash — the dash that is roughly the width of 126 | # an uppercase M, which is usually the maximum type width. This is 127 | # the one used to make parenthetical remarks — like this — or 128 | # dangling clauses — like this. Use it a lot if you’re a beatnik. 129 | # In a pinch, many people use two or three ASCII hyphen‐minuses to 130 | # substitute it. Traditionally the em‐dash is used without 131 | # spaces—like this—but this looks bad in monospace fonts (only). 132 | # • U2015 «―» is the horizontal bar. It’s the official character to 133 | # use in dialogues. It’s identical to the em‐dash in most fonts, so 134 | # many just use the em‐dash instead. 135 | # • U2212 «−» is the true minus sign. It is more visible and 136 | # better‐spaced than the ASCII hyphen‐minus, particularly with 137 | # proportional fonts (generally its size and positioning will match 138 | # +, × and other mathematical operators). 139 | # 140 | # All of the above look basically the same in most monospaced fonts. 141 | # Their true typographical beauty shows up in real texts, not in 142 | # conffiles. 143 | # 144 | # • U00AD «­» is the soft hyphen. This is an invisible control 145 | # character in Unicode; its purpose is to mark what points of a word 146 | # can be broken for hyphenation and aid in automatic text layout. 147 | # However, it was visible in ISO-8859-1, where it served to mark 148 | # points where words _were_ broken by algorithms; thus some software 149 | # still render it as a regular hyphen. See 150 | # http://www.cs.tut.fi/~jkorpela/shy.html . 151 | # • U2053 «⁓» is the swung dash (not a tilde like «~» ascii tilde or 152 | # « ̃» combining tilde). A swung dash is often used to substitute 153 | # words, as in dictionaries. It overlaps with CJK wave dash U301C 154 | # «〜» and wavy dash U3030 «〰», which are probably better for 155 | # full-width contexts (see cjk.xcompose). Other CJK dashes are «゠» 156 | # and «-». 157 | # • U2027 «‧» is the hyphenation point. Also commonly seen in 158 | # dictionaries (dic‧tion‧ar‧ies). Not to be confused with the 159 | # middle dot U00B7 · nor the katakana middle dot (・). 160 | 161 | 162 | # Notice the X name refer to the ASCII hyphen‐minus, not the 163 | # true minus. 164 | : "‐" U2010 # hyhpen 165 | 166 | # Literally counter‐intuitive? Press Return when you don’t want line breaks. 167 | : "‑" U2011 # non‐breaking hyphen 168 | : "‒" U2012 # figure dash 169 | : "―" U2015 # horizontal bar 170 | 171 | : "‖" U2016 # DOUBLE VERTICAL LINE 172 | 173 | : "⁓" U2053 # SWUNG DASH 174 | # <>: "‧" U2027 # HYPHENATION POINT 175 | ## : "·" periodcentered # MIDDLE DOT 176 | 177 | 178 | : "✓" U2713 # CHECK MARK 179 | : "✗" U2717 # BALLOT X — taken by Xorg for multiply 180 | : "✔" U2714 # HEAVY CHECK MARK 181 | : "✘" U2718 # HEAVY BALLOT X 182 | 183 | 184 | # X already includes mappings of the form: 185 | ## <0> : "⓪" U24EA # CIRCLED DIGIT ZERO 186 | 187 | # Since X uses () for circled, we use [] for parenthesised…is this a good solution? 188 | # 189 | <1> : "⑴" U2474 # PARENTHESIZED DIGIT ONE 190 | <2> : "⑵" U2475 # PARENTHESIZED DIGIT TWO 191 | <3> : "⑶" U2476 # PARENTHESIZED DIGIT THREE 192 | <4> : "⑷" U2477 # ⋮ 193 | <5> : "⑸" U2478 194 | <6> : "⑹" U2479 195 | <7> : "⑺" U247A 196 | <8> : "⑻" U247B 197 | <9> : "⑼" U247C 198 | <1> <0> : "⑽" U247D 199 | <1> <1> : "⑾" U247E 200 | <1> <2> : "⑿" U247F 201 | <1> <3> : "⒀" U2480 202 | <1> <4> : "⒁" U2481 203 | <1> <5> : "⒂" U2482 204 | <1> <6> : "⒃" U2483 205 | <1> <7> : "⒄" U2484 206 | <1> <8> : "⒅" U2485 207 | <1> <9> : "⒆" U2486 208 | <2> <0> : "⒇" U2487 209 | 210 | : "⒜" U249C # PARENTHESIZED LATIN SMALL LETTER A 211 | : "⒝" U249D # PARENTHESIZED LATIN SMALL LETTER B 212 | : "⒞" U249E # ⋮ 213 | : "⒟" U249F 214 | : "⒠" U24A0 215 | : "⒡" U24A1 216 | : "⒢" U24A2 217 | : "⒣" U24A3 218 | : "⒤" U24A4 219 | : "⒥" U24A5 220 | : "⒦" U24A6 221 | : "⒧" U24A7 222 | : "⒨" U24A8 223 | : "⒩" U24A9 224 | : "⒪" U24AA 225 |

: "⒫" U24AB 226 | : "⒬" U24AC 227 | : "⒭" U24AD 228 | : "⒮" U24AE 229 | : "⒯" U24AF 230 | : "⒰" U24B0 231 | : "⒱" U24B1 232 | : "⒲" U24B2 233 | : "⒳" U24B3 234 | : "⒴" U24B4 235 | : "⒵" U24B5 236 | 237 | <1> : "⒈" U2488 # DIGIT ONE FULL STOP 238 | <2> : "⒉" U2489 # DIGIT TWO FULL STOP 239 | <3> : "⒊" U248A # ⋮ 240 | <4> : "⒋" U248B 241 | <5> : "⒌" U248C 242 | <6> : "⒍" U248D 243 | <7> : "⒎" U248E 244 | <8> : "⒏" U248F 245 | <9> : "⒐" U2490 246 | <1> <0> : "⒑" U2491 247 | # Various of those two‐digit period forms have prefix‐conflicts with X 248 | # sequences for fractions. 249 | # <1> <1> : "⒒" U2492 250 | # <1> <2> : "⒓" U2493 251 | # <1> <3> : "⒔" U2494 252 | # <1> <4> : "⒕" U2495 253 | # <1> <5> : "⒖" U2496 254 | # <1> <6> : "⒗" U2497 255 | # <1> <7> : "⒘" U2498 256 | # <1> <8> : "⒙" U2499 257 | # <1> <9> : "⒚" U249A 258 | # <2> <0> : "⒛" U249B 259 | 260 | 261 | # The idea here is that “!” = “not” = inverted. Despite being called 262 | # “negative” they are not negative numbers, so no minus sign. 263 | # 264 | # Unicode only has negative numbers for 0 and 11–20; 1–10 are dingbats. 265 | <0> : "⓿" U24FF # NEGATIVE CIRCLED DIGIT ZERO 266 | <1> : "❶" U2776 # DINGBAT NEGATIVE CIRCLED DIGIT ONE 267 | <2> : "❷" U2777 # DINGBAT NEGATIVE CIRCLED DIGIT TWO 268 | <3> : "❸" U2778 # ⋮ 269 | <4> : "❹" U2779 270 | <5> : "❺" U277A 271 | <6> : "❻" U277B 272 | <7> : "❼" U277C 273 | <8> : "❽" U277D 274 | <9> : "❾" U277E 275 | <1> <0> : "❿" U277F # DINGBAT NEGATIVE CIRCLED NUMBER TEN 276 | <1> <1> : "⓫" U24EB # NEGATIVE CIRCLED NUMBER ELEVEN 277 | <1> <2> : "⓬" U24EC # ⋮ 278 | <1> <3> : "⓭" U24ED 279 | <1> <4> : "⓮" U24EE 280 | <1> <5> : "⓯" U24EF 281 | <1> <6> : "⓰" U24F0 282 | <1> <7> : "⓱" U24F1 283 | <1> <8> : "⓲" U24F2 284 | <1> <9> : "⓳" U24F3 285 | <2> <0> : "⓴" U24F4 286 | 287 | 288 | # X has all these without slash. 289 | 290 | <1> <4>: "¼" onequarter # VULGAR FRACTION ONE QUARTER 291 | <1> <2>: "½" onehalf # VULGAR FRACTION ONE HALF 292 | <3> <4>: "¾" threequarters # VULGAR FRACTION THREE QUARTERS 293 | <1> <3>: "⅓" U2153 # VULGAR FRACTION ONE THIRD 294 | <2> <3>: "⅔" U2154 # VULGAR FRACTION TWO THIRDS 295 | <1> <5>: "⅕" U2155 # VULGAR FRACTION ONE FIFTH 296 | <2> <5>: "⅖" U2156 # VULGAR FRACTION TWO FIFTHS 297 | <3> <5>: "⅗" U2157 # VULGAR FRACTION THREE FIFTHS 298 | <4> <5>: "⅘" U2158 # VULGAR FRACTION FOUR FIFTHS 299 | <1> <6>: "⅙" U2159 # VULGAR FRACTION ONE SIXTH 300 | <5> <6>: "⅚" U215A # VULGAR FRACTION FIVE SIXTHS 301 | <1> <8>: "⅛" U215B # VULGAR FRACTION ONE EIGHTH 302 | <3> <8>: "⅜" U215C # VULGAR FRACTION THREE EIGHTHS 303 | <5> <8>: "⅝" U215D # VULGAR FRACTION FIVE EIGHTHS 304 | <7> <8>: "⅞" U215E # VULGAR FRACTION SEVEN EIGHTHS 305 | 306 | 307 | # these two are the latin letters, not the runic wynn ᚹ U16B9 308 | : "Ƿ" U01F7 # Wynn 309 | : "ƿ" U01BF # wynn 310 | 311 | : "Ȝ" U021C # Yogh 312 | : "ȝ" U021D # yogh 313 | 314 | 315 | # Macrons are more convenient with (shift‐less) hyphen than X default 316 | # (shift‐full) underscore. Notice the X name refers to the 317 | # ASCII hyphen‐minus, not to the true minus character. 318 | # 319 | # It would be cool if we could do this using : 320 | # dead_macron, but doesn’t work due to conflict. 321 | # 322 | 323 | # FIXME: The following fixes https://bugs.freedesktop.org/show_bug.cgi?id=74116 324 | : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON (INTENTIONAL CONFLICT) 325 | : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON (INTENTIONAL CONFLICT) 326 | 327 | # FIXME: Submit the following to freedesktop.org, as they're consistent with existing shortcuts 328 | : "Ǣ" U01E2 # LATIN CAPITAL LETTER AE WITH MACRON 329 | : "ǣ" U01E3 # LATIN SMALL LETTER AE WITH MACRON 330 | : "Ȳ" U0232 # LATIN CAPITAL LETTER Y WITH MACRON (INTENTIONAL CONFLICT) 331 | : "ȳ" U0233 # LATIN SMALL LETTER Y WITH MACRON (INTENTIONAL CONFLICT) 332 | : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON 333 | : "ḡ" U1E21 # LATIN SMALL LETTER G WITH MACRON 334 | 335 | : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON 336 | : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON 337 | : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON 338 | : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON 339 | : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON 340 | : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON 341 | 342 | : "Ӣ" U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON 343 | : "ӣ" U04E3 # CYRILLIC SMALL LETTER I WITH MACRON 344 | : "Ӯ" U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON 345 | : "ӯ" U04EF # CYRILLIC SMALL LETTER U WITH MACRON 346 | 347 | 348 | # Spaces 349 | # ====== 350 | 351 | # Used like the regular space, except it tells layout software not to 352 | # break lines at its position. Also the preferred character to 353 | # display combining marks in isolation (example:  ̧́) 354 | ## : " " nobreakspace # NO-BREAK SPACE 355 | # common abbreviation 356 |

: " " nobreakspace # NO-BREAK SPACE 357 | 358 | # The following are used for manual spacing, for example in math. 359 | 360 | # Nut; the width of capital N (half an em‐space) 361 | : " " U2002 # EN SPACE 362 | # Mutton; the width of capital M ≅ type width 363 | : " " U2003 # EM SPACE 364 | # aka thick space 365 | <3>: " " U2004 # THREE-PER-EM SPACE 366 | # aka mid space 367 | <4>: " " U2005 # FOUR-PER-EM SPACE 368 | <6>: " " U2006 # SIX-PER-EM SPACE 369 | 370 | # 4/18 of an em 371 | # <>: " " U205F # MEDIUM MATHEMATICAL SPACE 372 | 373 | # tabular space = the width of a digit if font is fixed‐digit 374 | : " " U2007 # FIGURE SPACE 375 | 376 | : " " U2009 # THIN SPACE 377 | : " " U200A # HAIR SPACE 378 | # bar = a strand of hair? 379 | : " " U200A # HAIR SPACE 380 | 381 | 382 | # Control 383 | # ======= 384 | 385 | # A space so thin, it’s invisible. Used to separate words in scripts 386 | # that don’t separate words such as Thai, Kmer, and Japanese. Since 387 | # it’s invisible, ZWSP is actually not a space at all; but it might 388 | # get expanded in automatic paragraph justification. 389 | <0>: "​" U200B # ZERO WIDTH SPACE 390 | # common abbreviation 391 | : "‌" U200C # ZERO WIDTH NON-JOINER 392 | : "‍" U200D # ZERO WIDTH JOINER 393 | 394 | # The proper zero‐width no‐break space. 395 | : "⁠" U2060 # WORD JOINER 396 | 397 | # The following fine‐tune the bidirectional algorithm. In fact they 398 | # might mess up the display of this file =) The sequences are the 399 | # official abbreviations and widely used. 400 | # 401 | # The “marks” are useful for overriding the default behavior of the 402 | # bidi algorithm, that considers a paragraph to be in the direction of 403 | # the first strongly‐directed letter. 404 | : "‎" U200E # LEFT TO RIGHT MARK 405 | : "‏" U200F # RIGHT TO LEFT MARK 406 | : "‪" U202A # LEFT TO RIGHT EMBEDDING 407 | : "‫" U202B # RIGHT TO LEFT EMBEDDING 408 |

: "‬" U202C # POP DIRECTIONAL FORMATTING 409 | # The overrides will force bidi to treat _any_ character as one of 410 | # that directionality. 411 | : "‭" U202D # LEFT TO RIGHT OVERRIDE 412 | : "‮" U202E # RIGHT TO LEFT OVERRIDE 413 | 414 | # a free pop just to be sure: ‬ 415 | 416 | 417 | ## Arithmetic operators 418 | # Notice the “” X name refers to the ASCII hyphen‐minus, not to 419 | # the true minus character. 420 | 421 | : "−" U2212 # MINUS SIGN 422 | : "−" U2212 # MINUS SIGN 423 | 424 | # 2215 is different from both the ASCII slash (which Unicode 425 | # confusingly call “solidus”) and the U2044 fraction slash ⁄, which 426 | # everyone _except_ unicode call “solidus”. Use U2215 as a math 427 | # operator, U2044 for fractions. 428 | 429 | # slash: "/" U002F # ASCII SLASH 430 | : "∕" U2215 # DIVISION SLASH (INTENTIONAL CONFLICT) 431 | : "⁄" U2044 # FRACTION SLASH 432 | 433 | ## Comparison 434 | # The order here is more intuitive for programmers than the X 435 | # versions. 436 | : "≠" U2260 # NOT EQUAL TO 437 | : "≅" U2245 # APPROXIMATELY EQUAL TO 438 | : "≮" U226E # NOT LESS THAN (INTENTIONAL CONFLICT) 439 | : "≯" U226F # NOT GREATER THAN 440 | : "≈" U2248 # ALMOST EQUAL TO 441 | 442 | 443 | ## Set operators 444 | : "∈" U2208 # ELEMENT OF 445 | : "∉" U2209 # NOT AN ELEMENT OF 446 | : "⊂" U2282 # SUBSET OF 447 | : "⊃" U2283 # SUPERSET OF 448 | : "⊄" U2284 # NOT A SUBSET OF 449 | : "⊆" U2286 # SUBSET OF OR EQUAL TO 450 | : "⊇" U2287 # SUPERSET OF OR EQUAL TO 451 | : "∩" U2229 # INTERSECTION 452 | : "∪" U222A # UNION 453 | 454 | : "∎" # END OF PROOF (INTENTIONAL CONFLICT) 455 | 456 | # % ÷ 100; can’t extend with due to XCompose substring issue 457 | # (<%> already used for per-mille) 458 | : "‱" U2031 # PER MYRIAD SIGN 459 | 460 | # Tell that adjacent symbols form a list, without a visible comma. 461 | : "⁣" U2063 # INVISIBLE COMMA (INTENTIONAL CONFLICT) 462 | 463 | : "❮" U276E # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT 464 | : "❯" U276F # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT 465 | 466 | # v = ↓ = vertical 467 | : "⋮" U22EE # VERTICAL ELLIPSIS 468 | # FIXME: prefix conflict 469 | # : "⋯" U22EF # MIDLINE HORIZONTAL ELLIPSIS 470 | : "⋰" U22F0 # UP RIGHT DIAGONAL ELLIPSIS 471 | # To avoid conflict with \. for combining dot 472 | : "⋱" U22F1 # DOWN RIGHT DIAGONAL ELLIPSIS 473 | 474 | # See also the other files (e.g. invisible.xcompose for spaces, &c.) 475 | 476 | # FIXME: 2. is ⒉ 477 | # <2> : "‥" U2025 # TWO DOT LEADER 478 | # This should not be needed. 479 | # <1> : "․" U2024 # ONE DOT LEADER 480 | # FIXME: ./. = ⋰ 481 | # : "⁒" U2052 # COMMERCIAL MINUS SIGN 482 | # Printable sign for space. But is \ too useful a key combo to use 483 | # for this? 484 | : "␣" U2423 # OPEN BOX 485 | 486 | # Mnemonics 487 | # ========= 488 | 489 | : "⸪" U2E2A # TWO DOTS OVER ONE DOT 490 | #FIXME: conflicts 491 | # : "⸫" U2E2B # ONE DOT OVER TWO DOTS 492 | # : "⸬" U2E2C # TWO DOTS OVER TWO DOTS 493 | : "⸭" U2E2D # FIVE DOTS MARK 494 | : "⸭" U2E2D # FIVE DOTS MARK 495 | 496 | : "†" U2020 # DAGGER 497 | : "‡" U2021 # DOUBLE DAGGER (INTENTIONAL CONFLICT) 498 | 499 | <3>: "⁂" U2042 # ASTERISM 500 | 501 | # One missing for Greek 502 | : "‟" U201F # DOUBLE HIGH-REVERSED-9 503 | : "‟" U201F # DOUBLE HIGH-REVERSED-9 504 | 505 | # In the Asian section, but it's general-purpose punctuation 506 | : "〃" U3003 # DITTO MARK (INTENTIONAL CONFLICT) 507 | 508 | # These versions make more sense with other mappings. 509 | : "›" U203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 510 | : "‹" U2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK 511 | 512 | : "⸎" U2E0E # EDITORIAL CORONIS 513 | 514 | # Alternative, convenient sequence for apostrophe (so common in English). 515 | # 516 | # The right single quotation mark is the official apostrophe in Unicode. 517 | : "’" U2019 # RIGHT SINGLE QUOTATION MARK (INTENTIONAL CONFLICT) 518 | 519 | # Some quotation styles around the world: 520 | # “American English.” “British English”. 521 | # “Dutch, English, Italian, Portuguese, Spanish, Turkish” 522 | # ”Danish, Finnish, Norwegian, Swedish” (but »Swedish books») 523 | # „Czech, German, Slovak“ (opening low-9 is Gänsefüßchen „little goose feet“) 524 | # „Hungarian, Polish” 525 | # « French » # no-break space or 3∕M or (3∕M+WJ) better than regular 526 | # spaces 527 | # «Greek, Russian» 528 | # ‟Greek, second level” (opening high-reversed-9) 529 | # »Slovenian« 530 | # 〝CJK〞, 「CJK」, 『CJK』,【CJK】,《CJK》,〔CJK〕 &c. &c. 531 | 532 | # Spelled out 533 | # =========== 534 | : "§" U00A7 # SECTION SIGN 535 | : "′" 536 | # ≠ prime quotation mark above 537 | : "″" 538 | : "∞" 539 | 540 | # Not a dingbat —“General Punctuation”, used as separator. 541 |

: "⸙" U2E19 # PALM BRANCH 542 | 543 | # Used in Indic scripts. 544 | # FIXME: conflict 545 | #

: "⁕" U2055 # FLOWER PUNCTUATION MARK 546 | 547 | : "☚" U261A # BLACK LEFT POINTING INDEX 548 | : "☛" U261B # BLACK RIGHT POINTING INDEX 549 | : "☜" U261C # WHITE LEFT POINTING INDEX 550 | : "☝" U261D # WHITE UP POINTING INDEX 551 | : "☞" U261E # WHITE RIGHT POINTING INDEX 552 | : "☟" U261F # WHITE DOWN POINTING INDEX 553 | # FIXME: f v is WHITE DOWN POINTING INDEX 554 | # : "✌" U270C # VICTORY HAND 555 | : "✍" U270D # WRITING HAND 556 |

: "✎" U270E # LOWER RIGHT PENCIL 557 |

: "✏" U270F # PENCIL 558 |

: "✐" U2710 # UPPER RIGHT PENCIL 559 | 560 | 561 | ## Ligatures 562 | : "st" UFB06 # LATIN SMALL LIGATURE ST 563 | : "ſt" UFB05 # LATIN SMALL LIGATURE LONG S T 564 | 565 | 566 | ## Latin Extended-B 567 | : "Ǝ" U018E # LATIN CAPITAL LETTER REVERSED E (INTENTIONAL CONFLICT) 568 | 569 | 570 | ## IPA Extensions 571 | : "ɘ" U0258 # LATIN SMALL LETTER REVERSED E (INTENTIONAL CONFLICT) 572 | 573 | 574 | ## Latin-D 575 | : "ꝏ" UA74F # LATIN SMALL LETTER OO 576 | : "Ꝏ" UA74E # LATIN CAPITAL LETTER OO 577 | # FIXME: fill in the following 578 | # :"Ꜳ" UA7 # LATIN LETTER 579 | # :"ꜳ" UA7 # LATIN LETTER 580 | # :"Ꜵ" UA7 # LATIN LETTER 581 | # :"ꜵ" UA7 # LATIN LETTER 582 | # :"Ꜷ" UA7 # LATIN LETTER 583 | # :"ꜷ" UA7 # LATIN LETTER 584 | # :"Ꜹ" UA7 # LATIN LETTER 585 | # :"ꜹ" UA7 # LATIN LETTER 586 | # :"Ꜽ" UA7 # LATIN LETTER 587 | # :"ꜽ" UA7 # LATIN LETTER 588 | # :"Ꝓ" UA7 # LATIN LETTER 589 | # :"ꝓ" UA7 # LATIN LETTER 590 | # :"Ꝕ" UA7 # LATIN LETTER 591 | # :"ꝕ" UA7 # LATIN LETTER 592 | # :"Ꝛ" UA7 # LATIN LETTER 593 | # :"ꝛ" UA7 # LATIN LETTER 594 | # :"Ꝝ" UA7 # LATIN LETTER 595 | # :"ꝝ" UA7 # LATIN LETTER 596 | # :"Ꝡ" UA7 # LATIN LETTER 597 | # :"ꝡ" UA7 # LATIN LETTER 598 | # :"ꝸ" UA7 # LATIN LETTER 599 | : "Ꝫ" UA76A # LATIN CAPITAL LETTER ET 600 | : "ꝫ" UA76B # LATIN SMALL LETTER ET 601 | 602 | # Ancient Roman epigraphic letters 603 | # FIXME: conflict 604 | # : "ꟻ" UA7FB # LATIN EPIGRAPHIC LETTER REVERSED F 605 |

: "ꟼ" UA7FC # LATIN EPIGRAPHIC LETTER REVERSED P 606 | : "ꟽ" UA7FD # LATIN EPIGRAPHIC LETTER INVERTED M 607 | : "ꟾ" UA7FE # LATIN EPIGRAPHIC LETTER I LONGA 608 | : "ꟿ" UA7FF # LATIN EPIGRAPHIC LETTER ARCHAIC M 609 | 610 | 611 | # Custom additions: Mathematical symbols 612 | : "≸" U2278 # NEITHER LESS-THAN NOR GREATER-THAN 613 | : "≪" U226A # MUCH LESS-THAN 614 | : "≫" U226B # MUCH GREATER-THAN 615 | # Avoid conflict with the standard plus plus → # 616 | <3> : "⋙" U22D9 # VERY MUCH GREATER-THAN 617 | <3> : "⋘" U22D8 # VERY MUCH LESS-THAN 618 | : "∋" U220B # CONTAINS AS MEMBER (I hope this doesn't conflict) 619 | : "∌" U220C # DOES NOT CONTAIN AS MEMBER 620 | # would conflict, with for N WITH DOT BELOW, etc. 621 | : "≟" U225f # QUESTIONED EQUAL TO 622 | # FIXME: conflict 623 | # : "≝" U225D # EQUAL TO BY DEFINITION 624 | : "≡" U2261 # IDENTICAL TO 625 | : "≔" U2254 # COLON EQUALS 626 | : "≕" U2255 # EQUALS COLON 627 | # Using would conflict 628 | : "≢" U2262 # NOT IDENTICAL TO 629 | # We already have ± 630 | : "∓" U2213 # MINUS OR PLUS SIGN (INTENTIONAL CONFLICT) 631 | : "√" U221A # SQUARE ROOT 632 | <3> : "∛" U221B # CUBE ROOT 633 | <4> : "∜" U221C # FOURTH ROOT 634 | : "∧" U2227 # LOGICAL AND 635 | : "∨" U2228 # LOGICAL OR 636 | : "⊻" U22BB # XOR 637 | # FIXME: conflict 638 | # : "∘" U2218 # RING OPERATOR (function composition) 639 | : "⨯" U2A2F # CROSS PRODUCT 640 | : "⋅" U22C5 # DOT OPERATOR (dot product) 641 | <0> : "∅" U2205 # EMPTY SET 642 | <0> : "∅" U2205 # EMPTY SET 643 | : "∃" U2203 # THERE EXISTS (INTENTIONAL CONFLICT) 644 | : "∄" U2204 # THERE DOES NOT EXIST 645 | : "∀" U2200 # FOR ALL (INTENTIONAL CONFLICT) 646 | : "∎" U220E # END OF PROOF 647 | : "ℵ" U2135 # ALEF SYMBOL 648 | : "∗" U2217 # ASTERISK OPERATOR 649 | : "⊕" U2295 # CIRCLED PLUS 650 | # FIXME: prefix conflict 651 | # : "⊖" U2296 # CIRCLED MINUS 652 | : "⊗" U2297 # CIRCLED TIMES 653 | : "⊘" U2298 # CIRCLED DIVISION SLASH 654 | # FIXME: conflict 655 | # : "⊛" U229B # CIRCLED ASTERISK OPERATOR 656 | # )- conflicts with system for }. 657 | : "⟌" U27CC # LONG DIVISION 658 | : "∴" U2234 # THEREFORE 659 | : "∵" U2235 # BECAUSE 660 | # Ordinal indicators, for feminine and masculine, used in Romance languages 661 | : "ª" U00AA # FEMININE ORDINAL INDICATOR (INTENTIONAL CONFLICT) 662 | : "º" U00BA # MASCULINE ORDINAL INDICATOR (INTENTIONAL CONFLICT) 663 | 664 | : "∑" U2211 # N-ARY SUMMATION 665 | : "∫" U222B # INTEGRAL 666 | : "⨛" U2A1B # UPPER INTEGRAL 667 | : "⨜" U2A1C # LOWER INTEGRAL 668 | : "∬" U222C # DOUBLE INTEGRAL 669 | : "∭" U222D # TRIPLE INTEGRAL 670 | # : "⨌" U2A0C # QUADRUPLE INTEGRAL 671 | : "∮" U222E # CONTOUR INTEGRAL 672 |

: "⨕" U2a15 # SEMICIRCULAR POLE INTEGRAL 673 |

: "⨓" U2A13 # INTEGRAL AROUND POINT 674 | : "∯" U222F # SURFACE INTEGRAL 675 | # : "∰" U2230 # VOLUME INTEGRAL 676 | : "⨘" U2A18 # GEOMETRIC INTEGRAL 677 | : "⨋" U2A0B # SUM/INTEGRAL 678 | : "∇" U2207 # NABLA 679 |

: "∂" U2202 # PARTIAL DIFFERENTIAL 680 | # FIXME: prefix is already used 681 | # : "∂" U2202 # PARTIAL DIFFERENTIAL 682 | # Would we prefer 20D1 COMBINING RIGHT HARPOON ABOVE? 683 | : "⃗" U20D7 # COMBINING RIGHT ARROW ABOVE (vector) 684 | # TODO: There's a whole passel of these guys starting at U+1D538 but I have no fonts for those. 685 | : "ℂ" U2102 # DOUBLE-STRUCK CAPITAL C (set of complex numbers) (INTENTIONAL CONFLICT) 686 | : "ℕ" U2115 # DOUBLE-STRUCK CAPITAL N (natural number) 687 |

: "ℙ" U2119 # DOUBLE-STRUCK CAPITAL P 688 | : "ℚ" U211A # DOUBLE-STRUCK CAPITAL Q (set of rational numbers) 689 | : "ℝ" U211D # DOUBLE-STRUCK CAPITAL R (set of real numbers) 690 | : "ℤ" U2124 # DOUBLE-STRUCK CAPITAL Z (set of integers) 691 | : "ℍ" U210D # DOUBLE-STRUCK CAPITAL H 692 | : "ⅇ" U2147 # DOUBLE-STRUCK ITALIC SMALL E 693 | : "ⅈ" U2148 # DOUBLE-STRUCK ITALIC SMALL I 694 | : "ⅉ" U2149 # DOUBLE-STRUCK ITALIC SMALL J 695 |

: "ℼ" U213C # DOUBLE-STRUCK SMALL PI 696 | : "ℼ" U213C # DOUBLE-STRUCK SMALL PI 697 |

: "ℿ" U213F # DOUBLE-STRUCK CAPITAL PI 698 | : "ℿ" U213F # DOUBLE-STRUCK CAPITAL PI 699 | : "⅀" U2140 # DOUBLE-STRUCK N-ARY SUMMATION 700 | : "⅀" U2140 # DOUBLE-STRUCK N-ARY SUMMATION 701 | 702 | ## Brackets 703 | # TODO: There are lots more brackets to consider: 704 | # ⦅⦆ ⦇⦈ ⦉⦊ ⟪⟫ ⟬⟭ ⟮⟯ ⦑⦒ ⦓⦔ ⦕⦖ ⦗⦘ ⧼⧽ ⧘⧙ ⧚⧛ 「」 『』 705 | # Consider <7> / for ⸂⸃ maybe? and for ⸉⸊⸌⸍ ...? 706 | # FIXME: is a conflict 707 | # : "﴾" UFD3E # ORNATE LEFT PARENTHESIS 708 | # : "﴿" UFD3F # ORNATE RIGHT PARENTHESIS 709 | # The following *look* double-struck. 710 | : "⦃" U2983 # LEFT WHITE CURLY BRACKET 711 | : "⦄" U2984 # RIGHT WHITE CURLY BRACKET 712 | : "⟅" U27C5 # LEFT S-SHAPED BAG DELIMITER 713 | : "⟆" U27C6 # RIGHT S-SHAPED BAG DELIMITER 714 | # FIXME: Are the Mathematical versions ⟨⟩ preferable? And there are more at 3008 and 3009 715 | : "〈" U2329 # LEFT-POINTING ANGLE BRACKET 716 | : "〉" U232A # RIGHT-POINTING ANGLE BRACKET 717 | : "⸨" U2E28 # LEFT DOUBLE PARENTHESIS 718 | : "⸩" U2E29 # RIGHT DOUBLE PARENTHESIS 719 | <2> : "⸨" U2E28 # LEFT DOUBLE PARENTHESIS 720 | <2> : "⸩" U2E29 # RIGHT DOUBLE PARENTHESIS 721 | : "༼" U0F3C # TIBETAN MARK ANG KHANG GYON 722 | : "༽" U0F3D # TIBETAN MARK ANG KHANG GYAS 723 | : "⌊" U230A # LEFT FLOOR 724 | : "⌋" U230B # RIGHT FLOOR 725 | <7> : "⌈" U2308 # LEFT CEILING 726 | <7> : "⌉" U2309 # RIGHT CEILING 727 | # The following use the pattern from FLOOR/CEILING 728 | <7> : "⸢" U2E22 # TOP LEFT HALF BRACKET 729 | <7> : "⸣" U2E23 # TOP RIGHT HALF BRACKET 730 | : "⸤" U2E24 # BOTTOM LEFT HALF BRACKET 731 | : "⸥" U2E25 # BOTTOM RIGHT HALF BRACKET 732 | 733 | 734 | : "⊏" U228F # SQUARE IMAGE OF 735 | : "⊑" U2291 # SQUARE IMAGE OF OR EQUAL TO 736 | : "⊑" U2291 # SQUARE IMAGE OF OR EQUAL TO 737 | : "⊐" U2290 # SQUARE ORIGINAL OF 738 | : "⊒" U2292 # SQUARE ORIGINAL OF OR EQUAL TO 739 | : "⊒" U2292 # SQUARE ORIGINAL OF OR EQUAL TO 740 | 741 | : "ℓ" U2113 # SCRIPT SMALL L 742 | : "⊥" U22A5 # UP TACK (bottom) or should we use U27C2 PERPENDICULAR? 743 | 744 | 745 | ## Subscript letters 746 | : "ᵢ" U1D62 # LATIN SUBSCRIPT SMALL LETTER I (INTENTIONAL CONFLICT) 747 | : "ᵤ" U1D64 # LATIN SUBSCRIPT SMALL LETTER U (INTENTIONAL CONFLICT) 748 | : "ₒ" U2092 # LATIN SUBSCRIPT SMALL LETTER O (INTENTIONAL CONFLICT) 749 | : "ₓ" U2093 # LATIN SUBSCRIPT SMALL LETTER X 750 | : "ⱼ" U2C7C # LATIN SUBSCRIPT SMALL LETTER J 751 | : "ₖ" U2096 # LATIN SUBSCRIPT SMALL LETTER K 752 | : "ₘ" U2098 # LATIN SUBSCRIPT SMALL LETTER M 753 | : "ₙ" U2099 # LATIN SUBSCRIPT SMALL LETTER N 754 | : "₋" U208B # SUBSCRIPT MINUS 755 | 756 | # Some archaic Greek. (For modern Greek, use a Greek keyboard layout.) 757 | # FIXME: is already used 758 | # # "period" will indicate a sort of variant of some kind; asterisk is still the "greek" marker 759 | #

: "ϖ" U03D6 # GREEK PI SYMBOL 760 | # # Reserving .f in case we want PHI SYMBOL. Digamma was "w" sound anyway. 761 | # : "ϝ" U03DD # GREEK SMALL LETTER DIGAMMA 762 | # : "Ϝ" U03DC # GREEK CAPITAL LETTER DIGAMMA 763 | # : "Ϟ" U03DE # GREEK LETTER QOPPA 764 | # : "ϟ" U03DF # GREEK SMALL LETTER QOPPA 765 | # : "Ϙ" U03D8 # GREEK LETTER ARCHAIC QOPPA 766 | # : "ϙ" U03D9 # GREEK SMALL LETTER ARCHAIC QOPPA 767 | # : "ϗ" U03D7 # GREEK KAI SYMBOL 768 | # : "Ϡ" U03E0 # GREEK LETTER SAMPI 769 | # : "ϡ" U03E1 # GREEK SMALL LETTER SAMPI 770 | # : "Ͳ" U0372 # GREEK CAPITAL LETTER ARCHAIC SAMPI 771 | # : "ͳ" U0373 # GREEK SMALL LETTER ARCHAIC SAMPI 772 | # # Sorry, couldn't think of better ones for these. Might want .s for SAN. 773 | # : "Ϛ" U03DA # GREEK LETTER STIGMA 774 | # : "ϛ" U03DB # GREEK SMALL LETTER STIGMA 775 | # : "ʹ" U02B9 # MODIFIER LETTER PRIME, canonically equivalent to U0374 GREEK NUMERAL SIGN 776 | # # While we're at it... 777 | # : "′" U2032 # PRIME 778 | # : "″" U2033 # DOUBLE PRIME 779 | # : "͵" U0375 # GREEK LOWER NUMERAL SIGN (for thousands) 780 | # # Do we want BETA SYMBOL, RHO SYMBOL, KAPPA SYMBOL, PHI SYMBOL, THETA SYMBOL? 781 | # # The format makes them obvious enough I guess. PI SYMBOL is different enough 782 | # # that there's no question, and it is separate from these. 783 | # : "ϐ" U03D0 # GREEK BETA SYMBOL 784 | # : "ϑ" U03D1 # GREEK THETA SYMBOL 785 | # : "ϒ" U03D2 # GREEK UPSILON WITH HOOK SYMBOL 786 | # : "ϕ" U03D5 # GREEK PHI SYMBOL 787 | # : "ϰ" U03F0 # GREEK KAPPA SYMBOL 788 | # : "ϱ" U03F1 # GREEK RHO SYMBOL 789 | # : "ϴ" U03F4 # GREEK CAPITAL THETA SYMBOL 790 | # : "ϵ" U03F5 # GREEK LUNATE EPSILON SYMBOL 791 | # # TODO: Lunate sigmas and dotted versions thereof... What about SAN, which is at least a letter? 792 | 793 | # Roman numerals 794 | # Percent for numerical mnemonic 795 | <1> : "ⅰ" U2170 # SMALL ROMAN NUMERAL ONE 796 | <2> : "ⅱ" U2171 # SMALL ROMAN NUMERAL TWO 797 | <3> : "ⅲ" U2172 # SMALL ROMAN NUMERAL THREE 798 | <4> : "ⅳ" U2173 # SMALL ROMAN NUMERAL FOUR 799 | <5> : "ⅴ" U2174 # SMALL ROMAN NUMERAL FIVE 800 | <6> : "ⅵ" U2175 # SMALL ROMAN NUMERAL SIX 801 | <7> : "ⅶ" U2176 # SMALL ROMAN NUMERAL SEVEN 802 | <8> : "ⅷ" U2177 # SMALL ROMAN NUMERAL EIGHT 803 | <9> : "ⅸ" U2178 # SMALL ROMAN NUMERAL NINE 804 | : "ⅹ" U2179 # SMALL ROMAN NUMERAL TEN 805 | <1> : "ⅺ" U217A # SMALL ROMAN NUMERAL ELEVEN 806 | <2> : "ⅻ" U217B # SMALL ROMAN NUMERAL TWELVE 807 | : "ⅼ" U217C # SMALL ROMAN NUMERAL FIFTY 808 | : "ⅽ" U217D # SMALL ROMAN NUMERAL ONE HUNDRED 809 | : "ⅾ" U217E # SMALL ROMAN NUMERAL FIVE HUNDRED 810 | : "ⅿ" U217F # SMALL ROMAN NUMERAL ONE THOUSAND 811 | <0> <1> : "Ⅰ" U2160 # ROMAN NUMERAL ONE 812 | <0> <2> : "Ⅱ" U2161 # ROMAN NUMERAL TWO 813 | <0> <3> : "Ⅲ" U2162 # ROMAN NUMERAL THREE 814 | <0> <4> : "Ⅳ" U2163 # ROMAN NUMERAL FOUR 815 | <0> <5> : "Ⅴ" U2164 # ROMAN NUMERAL FIVE 816 | <0> <6> : "Ⅵ" U2165 # ROMAN NUMERAL SIX 817 | <0> <7> : "Ⅶ" U2166 # ROMAN NUMERAL SEVEN 818 | <0> <8> : "Ⅷ" U2167 # ROMAN NUMERAL EIGHT 819 | <0> <9> : "Ⅸ" U2168 # ROMAN NUMERAL NINE 820 | <0> : "Ⅹ" U2169 # ROMAN NUMERAL TEN 821 | <0> <1> : "Ⅺ" U216A # ROMAN NUMERAL ELEVEL 822 | <0> <2> : "Ⅻ" U216B # ROMAN NUMERAL TWELVE 823 | <0> : "Ⅼ" U216C # ROMAN NUMERAL FIFTY 824 | <0> : "Ⅽ" U216D # ROMAN NUMERAL ONE HUNDRED 825 | <0> : "Ⅾ" U216E # ROMAN NUMERAL FIVE HUNDRED 826 | <0> : "Ⅿ" U216F # ROMAN NUMERAL ONE THOUSAND 827 | : "Ⅹ" U2169 # ROMAN NUMERAL TEN 828 | : "Ⅼ" U216C # ROMAN NUMERAL FIFTY 829 | : "Ⅽ" U216D # ROMAN NUMERAL ONE HUNDRED 830 | : "Ⅾ" U216E # ROMAN NUMERAL FIVE HUNDRED 831 | : "Ⅿ" U216F # ROMAN NUMERAL ONE THOUSAND 832 | 833 | # Custom additions: for chat (kragen) 834 | : "☻" U263B # BLACK SMILING FACE 835 | : "⍨" U2368 # APL FUNCTIONAL SYMBOL TILDE DIAERESIS 836 | : "⸚" U2E1A # HYPHEN WITH DIAERESIS 837 | # Those are archaic Cyrillic letters... but look so _perfect_ for use 838 | # in chat. And about the last, the "multiocular O"... Well, I don't 839 | # know what it can be used for, but given the description, how could I 840 | # leave it out‽ 841 | # (I guess using U+1F440 EYES would be more straightforward, but not as funny?) 842 | : "Ꙭ" UA66C # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O * used in the dual of words based on the root for 'eye' 843 | : "ꙭ" UA66D # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O 844 | : "Ꙫ" UA66A # CYRILLIC CAPITAL LETTER BINOCULAR O * used in the dual of words based on the root for 'eye' 845 | : "ꙫ" UA66B # CYRILLIC SMALL LETTER BINOCULAR O 846 | : "ꙮ" UA66E # CYRILLIC LETTER MULTIOCULAR O * used in the epithet 'many-eyed' 847 | # While we're doing stacks of circles with dots. 848 | <3> : "߷" U07F7 # NKO SYMBOL GBAKURUNEN 849 | : "⸮" U2E2E # REVERSED QUESTION MARK 850 | : "⁈" U2048 # QUESTION EXCLAMATION MARK 851 | : "⁉" U2049 # EXCLAMATION QUESTION MARK 852 | <2> : "∷" U2237 # PROPORTION -- not strictly 2 times COLON 853 | : "⁏" U204F # REVERSED SEMICOLON 854 | # Keep looking into big hunks of Latin Extended-D, A720- et seq. 855 | <3> <3> : "♣" U2663 # BLACK CLUB SUIT 856 | : "♢" U2662 # WHITE DIAMOND SUIT (<> is ↔) 857 | <3> : "♠" U2660 # BLACK SPADE SUIT 858 | : "♡" U2661 # WHITE HEART SUIT (INTENTIONAL CONFLICT) 859 | # "shamrock" is too long; there IS a limit to these! 860 | # FIXME: conflict 861 | # : "☘" U2618 # SHAMROCK 862 |

: "☮" U262E # PEACE SYMBOL 863 | # FIXME: conflict 864 | # : "☯" U262F # YIN YANG 865 | # And now that we are into hearts... 866 | # FIXME: clash with system Compose file 867 | # <3> : "❥" U2765 # ROTATED HEAVY BLACK HEART BULLET 868 | <3> : "❣" U2763 # HEAVY HEART EXCLAMATION MARK ORNAMENT 869 | <3> : "❦" U2766 # FLORAL HEART 870 | <3> : "❧" U2767 # ROTATED FLORAL HEART BULLET 871 | <3> : "☙" U2619 # REVERSED ROTATED FLORAL HEART BULLET 872 | # For some reason, I don't really like these word-based mnemonics. But until we have something better... -clsn 873 | # are the ampersand versions better? -kragen 874 | : "☎" U260E # BLACK TELEPHONE 875 | : "☕" U2615 # HOT BEVERAGE 876 | # These last two bother me less, though they can still be improved. 877 | # Other possibly useful symbols: 878 | # 2668 HOT SPRINGS (for chat, for running off to shower?) 879 | # I want 2713-2714 and 2717-2718 880 | # We need a Dingbats prefix, for ❛❜❝❞❢ 881 | : "☐" U2610 # BALLOT BOX 882 | # FIXME: Better keystrokes anyone? This one breaks the pattern. [c]? [v]? [y]? [/]? 883 | # : "☑" U2611 # BALLOT BOX WITH CHECK 884 | # FIXME: conflict 885 | # : "☒" U2612 # BALLOT BOX WITH X 886 | # How about dice? 887 | # FIXME: conflicts 888 | # <1> : "⚀" U2680 # DIE FACE-1 889 | # <2> : "⚁" U2681 # DIE FACE-2 890 | # <3> : "⚂" U2682 # DIE FACE-3 891 | # <4> : "⚃" U2683 # DIE FACE-4 892 | # <5> : "⚄" U2684 # DIE FACE-5 893 | # <6> : "⚅" U2685 # DIE FACE-6 894 | # 267B BLACK UNIVERSAL RECYCLING SYMBOL 895 | 896 | # Keystrokes okay? 897 | : "⚜" U269C # FLEUR-DE-LIS 898 | : "⚛" U269B # ATOM SYMBOL 899 | : "⚠" U26A0 # WARNING SIGN 900 | : "⚠" U26A0 # WARNING SIGN (INTENTIONAL CONFLICT) 901 |

: "⚡" U26A1 # HIGH VOLTAGE SIGN 902 | # Shouldn't use just because it's too likely to be a prefix for 903 | # a useful word. 904 | : "☢" U2622 # RADIOACTIVE SIGN 905 | : "☣" U2623 # BIOHAZARD SIGN 906 | # Changing this from ⚝ 907 | # FIXME: conflict 908 | # : "⛤" U26E4 # PENTAGRAM (pentalpha, get it?) 909 |

: "✈" U2708 # AIRPLANE 910 | : "✉" U2709 # ENVELOPE 911 | : "♿" U267F # WHEELCHAIR SYMBOL 912 | : "☤" U2624 # CADEUCEUS 913 | # Something different for STAFF OF AESCULAPIUS? 914 | <1> : "⚕" U2695 # STAFF OF AESCULAPIUS 915 | # Maybe something different that isn't lousy. 916 | # 26B0 COFFIN ? 917 | # One of the SNOWFLAKEs? 918 | # SNOWMAN? COMET? ANCHOR? 919 | # Maybe if we go with having a "word" symbol and spelling out lots and 920 | # lots of whole words, we can have all the planets. 921 | # "Word Symbol" Notion: 922 | # Have a semi-reserved symbol reserved for this. Probably ampersand. 923 | # Something that isn't already used for much. Then you can happily make 924 | # all the &-j-u-p-i-t-e-r and &-a-r-i-e-s combos you want without worrying 925 | # that you'll run into a combination already used, like "ca"=ǎ or something. 926 | # (unless you have whole words that are prefixes). Worth doing? 927 | # I think so. -Kragen 928 | # 929 | # I already have STAR OF DAVID on another map. 930 | # 231A, 231B -- WATCH and HOURGLASS -- one should be &-w-a-i-t 931 | # 23D4 METRICAL LONG OVER TWO SHORTS a.k.a. METRICAL BOOBS 932 | # 0950 DEVANAGARI OM? 933 | # 214C PER SIGN? 934 | # 212E ESTIMATED SYMBOL? 935 | # 2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS a.k.a. NOT AMUSED 936 | 937 | # FIXME: prefix conflict 938 | # : "♀" U2640 # FEMALE SIGN 939 | # : "♂" U2642 # MALE SIGN 940 | # : "⚣" U26A3 # DOUBLED MALE SIGN 941 | # : "⚢" U26A2 # DOUBLED FEMALE SIGN 942 | # : "⚤" U26A4 # INTERLOCKED FEMALE AND MALE SIGN 943 | # : "⚥" U26A5 # MALE AND FEMALE SIGN 944 | # : "⚧" U26A7 # MALE WITH STROKE AND MALE AND FEMALE SIGN 945 | 946 | 947 | : "☠" U2620 # SKULL AND CROSSBONES (INTENTIONAL CONFLICT) 948 | : "⌨" U2328 # KEYBOARD 949 | # Can we get better keycodes for these? 950 | : "☞" U261E # WHITE RIGHT POINTING INDEX 951 | : "☜" U261C # WHITE LEFT POINTING INDEX 952 | # FIXME: conflict 953 | # :"★" U2605 # BLACK STAR 954 | <0> :"☆" U2606 # WHITE STAR (INTENTIONAL CONFLICT) 955 | # FIXME: conflict 956 | # :"✪" U272A # CIRCLED WHITE STAR 957 | <2> :"⁑" U2051 # TWO ASTERISKS ALIGNED VERTICALLY 958 | <4> :"✢" U2722 # FOUR TEARDROP-SPOKED ASTERISK 959 | <6> :"✡" U2721 # STAR OF DAVID 960 | :"✯" U272F # PINWHEEL STAR 961 | :"✱" U2731 # HEAVY ASTERISK 962 | : "⌘" U2318 # PLACE OF INTEREST SIGN 963 | # Using backslash-minus-slash etc. conflicts with combining accents(? or APL, in US layout). 964 | : "⚞" U269E # THREE LINES CONVERGING RIGHT 965 | : "⚟" U269F # THREE LINES CONVERGING LEFT 966 | # FIXME: prefix conflict 967 | # : "⍾" U237E # BELL SYMBOL (or ALIENS LANDING) -- &-a-l-i-e-n ? 968 | # Other monstery characters... ѪꙚ (alien abductions?) 969 | # ඏൠഋ & others from Kannada et al...? 970 | # Can't use -^- for this; conflicts with -^ for ↑, and getting those arrows 971 | # workable was complicated enough. How about this? 972 | # FIXME: prefix conflict 973 | # : "⌤" U2324 # UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS; aka ENTER KEY, aka NOT AMUSED. 974 | : "⌛" U231B # HOURGLASS 975 | : "⌚" U231A # WATCH 976 | : "◌" U25CC # DOTTED CIRCLE 977 | # FIXME: conflict 978 | # : "⬚" U2B1A # DOTTED SQUARE 979 | : "ʘ" U0298 # LATIN LETTER BILABIAL CLICK (kiss sound) 980 | 981 | #SUPERSCRIPTS: 982 | #To avoid namespace clashes, is doubled (will I regret that?) 983 | : "ⁱ" U2071 # SUPERSCRIPT I 984 | : "ⁿ" U207F # SUPERSCRIPT N 985 | #Maybe add: ˀˁ˃˂ Need to be able to talk about ʔˁ... 986 | : "ˀ" U02C0 # MODIFIER LETTER GLOTTAL STOP 987 | : "ˁ" U02C1 # MODIFIER LETTER REVERSED GLOTTAL STOP 988 | 989 | : "ʃ" U0283 # LATIN SMALL LETTER ESH 990 | : "ʒ" U0292 # LATIN SMALL LETTER EZH 991 | : "ɬ" U026C # LATIN SMALL LETTER L WITH BELT 992 | <3> : "ɮ" U026E # LATIN SMALL LETTER LEZH 993 | : "ʔ" U0294 # LATIN LETTER GLOTTAL STOP 994 | : "ʕ" U0295 # LATIN LETTER PHARYNGEAL VOICED FRICATIVE 995 | # Not great keystrokes... 996 | : "ʖ" U0296 # LATIN LETTER INVERTED GLOTTAL STOP 997 | : "ʡ" U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE 998 | : "ʢ" U02A2 # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE 999 | # How about ɸ? φ isn’t the IPA glyph. 1000 |

: "ɸ" U0278 # LATIN SMALL LETTER PHI 1001 | : "ɪ" U026A # LATIN LETTER SMALL CAPITAL I 1002 | : "ʊ" U028A # LATIN SMALL LETTER UPSILON 1003 | : "ɑ" U0251 # LATIN SMALL LETTER ALPHA 1004 | : "ɚ" U025A # LATIN SMALL LETTER SCHWA WITH HOOK 1005 | :"ɔ" U0254 # LATIN SMALL LETTER OPEN O 1006 | :"Ɔ" U0186 # LATIN CAPITAL LETTER OPEN O 1007 | : "ɛ" U025B # LATIN SMALL LETTER OPEN E 1008 | # Have to put the at the beginning for these. 1009 | # FIXME: prefix conflicts 1010 | # : "ɜ" U025C # LATIN SMALL LETTER REVERSED OPEN E 1011 | # : "ɝ" U025D # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK 1012 | # How are these keystrokes? 1013 | : "ˈ" U02C8 # MODIFIER LETTER VERTICAL LINE 1014 | : "ˌ" U02CC # MODIFIER LETTER LOW VERTICAL LINE 1015 | : "̩" U0329 # COMBINING VERTICAL LINE BELOW 1016 | # Harmonize with other combiners. 1017 | : "̩" U0329 # COMBINING VERTICAL LINE BELOW 1018 | : "ɹ" U0279 # LATIN SMALL LETTER TURNED R: voiced alveolar approximant (American English (at least) R) 1019 | : "ɾ" U027E # LATIN SMALL LETTER R WITH FISHHOOK: voiced alveolar flap or tap (American English intervocalic allophone of d, or Spanish r) 1020 | # FIXME: conflicts 1021 | # : "ʌ" U028C # LATIN SMALL LETTER TURNED V 1022 | # : "ɯ" U026F # LATIN SMALL LETTER TURNED M 1023 | # doubling a letter seems to be mostly used for turning 1024 | # FIXME: conflict 1025 | # : "ʍ" U028D # LATIN SMALL LETTER TURNED W 1026 | : "ɐ" U0250 # LATIN SMALL LETTER TURNED A (INTENTIONAL CONFLICT) 1027 | # I'll use capitals for a different double 1028 | # FIXME: conflict 1029 | # : "ʬ" U02AC # LATIN LETTER BILABIAL PERCUSSIVE 1030 | # FIXME: conflict 1031 | # : "ː" U02D0 # MODIFIER LETTER TRIANGULAR COLON 1032 | # Also handy for writing urls: http://ʬw.omniglot.com/ 1033 | # ɣ? ᴥ? Important enough to add? ᴥ is cool just as a "latin" letter. 1034 | : "ɣ" U0263 # LATIN SMALL LETTER GAMMA 1035 | : "ᴥ" U1D25 # LATIN LETTER AIN 1036 | # Sometimes it's a "tail", sometimes a "hook", and sometimes a "retroflex hook" 1037 | # These conflict with system definitions for letters with cedilla, but those can be obtained by typing the comma first 1038 | : "ɖ" U0256 # LATIN SMALL LETTER D WITH TAIL (INTENTIONAL CONFLICT) 1039 | : "ɭ" U026D # LATIN SMALL LETTER L WITH RETROFLEX HOOK (INTENTIONAL CONFLICT) 1040 | : "ɳ" U0273 # LATIN SMALL LETTER N WITH RETROFLEX HOOK (INTENTIONAL CONFLICT) 1041 | : "ʂ" U0282 # LATIN SMALL LETTER S WITH HOOK (INTENTIONAL CONFLICT) 1042 | : "ʈ" U0288 # LATIN SMALL LETTER T WITH RETROFLEX HOOK (INTENTIONAL CONFLICT) 1043 | : "ʐ" U0290 # LATIN SMALL LETTER Z WITH RETROFLEX HOOK 1044 | # This is used for functions, folders, etc. Yeah, the hook's facing wrong. 1045 | : "ƒ" U0192 # LATIN SMALL LETTER F WITH HOOK 1046 | # Sigh, might as well do implosives. Which is also sometimes a hook. 1047 | : "ɓ" U0253 # LATIN SMALL LETTER B WITH HOOK 1048 | : "ɗ" U0257 # LATIN SMALL LETTER D WITH HOOK 1049 | : "ɠ" U0260 # LATIN SMALL LETTER G WITH HOOK 1050 | : "ɡ" U0261 # LATIN SMALL LETTER SCRIPT G 1051 | # The h looks the same... 1052 | : "ɦ" U0266 # LATIN SMALL LETTER H WITH HOOK 1053 | : "ʛ" U029B # LATIN LETTER SMALL CAPITAL G WITH HOOK 1054 | : "℞" U211E # PRESCRIPTION TAKE 1055 | : "℥" U2125 # OUNCE SIGN 1056 | # FIXME: conflict 1057 | # : "℈" U2108 # SCRUPLE 1058 | # There are all kinds of awesome combining characters in the U+0300 page. 1059 | # There are a bunch of other awesome combining characters like U+20E0 1060 | # FIXME: conflict 1061 | # : "๛" U0E5B # THAI CHARACTER KHOMUT (end of chapter) 1062 | 1063 | 1064 | ## Music. # is the music mnemonic. 1065 | : "𝄞" U0001d11e # MUSICAL SYMBOL G CLEF 1066 | : "𝄢" U0001d122 # MUSICAL SYMBOL F CLEF 1067 | : "𝄡" U0001d121 # MUSICAL SYMBOL C CLEF 1068 | : "♭" U266D # MUSIC FLAT SIGN 1069 | : "♯" U266F # MUSIC SHARP SIGN 1070 | 1071 | 1072 | ## Astrological signs 1073 | 1074 | # Planets 1075 | #FIXME: Improve these 1076 | # : "☉" U2609 # SUN (Sunday) 1077 | # : "☽" U263D # FIRST QUARTER MOON (Monday) 1078 | # : "☿" U263F # MERCURY (Wednesday) 1079 | # : "♀" U2640 # FEMALE SIGN 1080 | #

: "♃" U2643 # JUPITER (Thursday) 1081 | # : "♄" U2644 # SATURN (Saturday) 1082 | # : "♅" U2645 # URANUS (FIXME: or ⛢ U26E2?) 1083 | #

: "♆" U2646 # NEPTUNE 1084 | #

: "♇" U2647 # PLUTO (ok, it isn't a planet anymore, but we still love it.) 1085 | 1086 | # Minor planets 1087 | #FIXME: Improve these 1088 | # : "⚳" U26B3 # CERES 1089 | #

: "⚴" U26B4 # PALLAS 1090 | # : "⚵" U26B5 # JUNO 1091 | # : "⚶" U26B6 # VESTA 1092 | # : "⚷" U26B7 # CHIRON 1093 | # : "⚸" U26B8 # BLACK MOON LILITH 1094 | 1095 | # Zodiac signs 1096 | #FIXME: Improve these 1097 | # : "♈" U2648 # ARIES 1098 | # : "♉" U2649 # TAURUS 1099 | # : "♊" U264A # GEMINI 1100 | # : "♋" U264B # CANCER 1101 | # : "♌" U264C # LEO 1102 | # : "♍" U264D # VIRGO 1103 | # : "♎" U264E # LIBRA 1104 | #

: "♏" U264F # SCORPIUS 1105 | # : "♐" U2650 # SAGITTARIUS 1106 | #

: "♑" U2651 # CAPRICORN 1107 | # : "♒" U2652 # AQUARIUS 1108 | #

: "♓" U2653 # PISCES 1109 | # # Really, this should be SERPENTARIUS. All the other signs are in Latin. 1110 | #

: "⛎" U26CE # OPHIUCHUS 1111 | 1112 | 1113 | ## Games 1114 | 1115 | # Playing Cards 1116 | # The convention is more or less established, except for the Knight. I'm 1117 | # using N for that, like in Chess, since K would conflict with King of course. 1118 | : "🂡" U1F0A1 # PLAYING CARD ACE OF SPADES 1119 | <2> : "🂢" U1F0A2 # PLAYING CARD TWO OF SPADES 1120 | <3> : "🂣" U1F0A3 # PLAYING CARD THREE OF SPADES 1121 | <4> : "🂤" U1F0A4 # PLAYING CARD FOUR OF SPADES 1122 | <5> : "🂥" U1F0A5 # PLAYING CARD FIVE OF SPADES 1123 | <6> : "🂦" U1F0A6 # PLAYING CARD SIX OF SPADES 1124 | <7> : "🂧" U1F0A7 # PLAYING CARD SEVEN OF SPADES 1125 | <8> : "🂨" U1F0A8 # PLAYING CARD EIGHT OF SPADES 1126 | <9> : "🂩" U1F0A9 # PLAYING CARD NINE OF SPADES 1127 | : "🂪" U1F0AA # PLAYING CARD TEN OF SPADES 1128 | : "🂫" U1F0AB # PLAYING CARD JACK OF SPADES 1129 | : "🂬" U1F0AC # PLAYING CARD KNIGHT OF SPADES 1130 | : "🂭" U1F0AD # PLAYING CARD QUEEN OF SPADES 1131 | : "🂮" U1F0AE # PLAYING CARD KING OF SPADES 1132 | 1133 | : "🂱" U1F0B1 # PLAYING CARD ACE OF HEARTS 1134 | <2> : "🂲" U1F0B2 # PLAYING CARD TWO OF HEARTS 1135 | <3> : "🂳" U1F0B3 # PLAYING CARD THREE OF HEARTS 1136 | <4> : "🂴" U1F0B4 # PLAYING CARD FOUR OF HEARTS 1137 | <5> : "🂵" U1F0B5 # PLAYING CARD FIVE OF HEARTS 1138 | <6> : "🂶" U1F0B6 # PLAYING CARD SIX OF HEARTS 1139 | <7> : "🂷" U1F0B7 # PLAYING CARD SEVEN OF HEARTS 1140 | <8> : "🂸" U1F0B8 # PLAYING CARD EIGHT OF HEARTS 1141 | <9> : "🂹" U1F0B9 # PLAYING CARD NINE OF HEARTS 1142 | : "🂺" U1F0BA # PLAYING CARD TEN OF HEARTS 1143 | : "🂻" U1F0BB # PLAYING CARD JACK OF HEARTS 1144 | : "🂼" U1F0BC # PLAYING CARD KNIGHT OF HEARTS 1145 | : "🂽" U1F0BD # PLAYING CARD QUEEN OF HEARTS 1146 | : "🂾" U1F0BE # PLAYING CARD KING OF HEARTS 1147 | 1148 | : "🃁" U1F0C1 # PLAYING CARD ACE OF DIAMONDS 1149 | <2> : "🃂" U1F0C2 # PLAYING CARD TWO OF DIAMONDS 1150 | <3> : "🃃" U1F0C3 # PLAYING CARD THREE OF DIAMONDS 1151 | <4> : "🃄" U1F0C4 # PLAYING CARD FOUR OF DIAMONDS 1152 | <5> : "🃅" U1F0C5 # PLAYING CARD FIVE OF DIAMONDS 1153 | <6> : "🃆" U1F0C6 # PLAYING CARD SIX OF DIAMONDS 1154 | <7> : "🃇" U1F0C7 # PLAYING CARD SEVEN OF DIAMONDS 1155 | <8> : "🃈" U1F0C8 # PLAYING CARD EIGHT OF DIAMONDS 1156 | <9> : "🃉" U1F0C9 # PLAYING CARD NINE OF DIAMONDS 1157 | : "🃊" U1F0CA # PLAYING CARD TEN OF DIAMONDS 1158 | : "🃋" U1F0CB # PLAYING CARD JACK OF DIAMONDS 1159 | : "🃌" U1F0CC # PLAYING CARD KNIGHT OF DIAMONDS 1160 | : "🃍" U1F0CD # PLAYING CARD QUEEN OF DIAMONDS 1161 | : "🃎" U1F0CE # PLAYING CARD KING OF DIAMONDS 1162 | 1163 | : "🃑" U1F0D1 # PLAYING CARD ACE OF CLUBS 1164 | <2> : "🃒" U1F0D2 # PLAYING CARD TWO OF CLUBS 1165 | <3> : "🃓" U1F0D3 # PLAYING CARD THREE OF CLUBS 1166 | <4> : "🃔" U1F0D4 # PLAYING CARD FOUR OF CLUBS 1167 | <5> : "🃕" U1F0D5 # PLAYING CARD FIVE OF CLUBS 1168 | <6> : "🃖" U1F0D6 # PLAYING CARD SIX OF CLUBS 1169 | <7> : "🃗" U1F0D7 # PLAYING CARD SEVEN OF CLUBS 1170 | <8> : "🃘" U1F0D8 # PLAYING CARD EIGHT OF CLUBS 1171 | <9> : "🃙" U1F0D9 # PLAYING CARD NINE OF CLUBS 1172 | : "🃚" U1F0DA # PLAYING CARD TEN OF CLUBS 1173 | : "🃛" U1F0DB # PLAYING CARD JACK OF CLUBS 1174 | : "🃜" U1F0DC # PLAYING CARD KNIGHT OF CLUBS 1175 | : "🃝" U1F0DD # PLAYING CARD QUEEN OF CLUBS 1176 | : "🃞" U1F0DE # PLAYING CARD KING OF CLUBS 1177 | 1178 | : "🂠" U1F0A0 # PLAYING CARD BACK 1179 | : "🃏" U1F0CF # PLAYING CARD BLACK JOKER 1180 | : "🃟" U1F0DF # PLAYING CARD WHITE JOKER 1181 | 1182 | # TODO: Dominoes 1183 | # I'm thinking [ 1 1 ], etc, maybe use ] 1 1 [ for vertical 1184 | 1185 | # Chess 1186 | # FIXME: will be an issue when we want double-struck W or B... replace with ? 1187 | : "♔" U2654 # WHITE CHESS KING 1188 | : "♕" U2655 # WHITE CHESS QUEEN 1189 | : "♖" U2656 # WHITE CHESS ROOK 1190 | : "♗" U2657 # WHITE CHESS BISHOP 1191 | : "♘" U2658 # WHITE CHESS KNIGHT 1192 |

: "♙" U2659 # WHITE CHESS PAWN 1193 | : "♚" U265A # BLACK CHESS KING 1194 | : "♛" U265B # BLACK CHESS QUEEN 1195 | : "♜" U265C # BLACK CHESS ROOK 1196 | : "♝" U265D # BLACK CHESS BISHOP 1197 | : "♞" U265E # BLACK CHESS KNIGHT 1198 |

: "♟" U265F # BLACK CHESS PAWN 1199 | 1200 | # Checkers/Draughts 1201 | : "⛀" U26C0 # WHITE DRAUGHTS MAN 1202 | : "⛁" U26C1 # WHITE DRAUGHTS KING 1203 | : "⛂" U26C2 # BLACK DRAUGHTS MAN 1204 | : "⛃" U26C3 # BLACK DRAUGHTS KING 1205 | 1206 | # Shogi 1207 | : "☖" U2616 # WHITE SHOGI PIECE 1208 | : "☗" U2617 # BLACK SHOGI PIECE 1209 | : "⛉" U26C9 # TURNED WHITE SHOGI PIECE 1210 | : "⛊" U26CA # TURNED BLACK SHOGI PIECE 1211 | 1212 | 1213 | ## Temperature 1214 | : "℃" U2103 # DEGREE CELSIUS 1215 | : "℉" U2109 # DEGREE FAHRENHEIT 1216 | 1217 | 1218 | ## Emoji 1219 | : "💡" U1F4A1 # ELECTRIC LIGHT BULB 1220 | : "💢" U1F4A2 # ANGER SYMBOL 1221 | # FIXME: conflict 1222 | # : "💣" U1F4A3 # BOMB 1223 | : "💤" U1F4A4 # SLEEPING SYMBOL 1224 |

: "💥" U1F4A5 # COLLISION SYMBOL 1225 | : "💦" U1F4A6 # SPLASHING SWEAT SYMBOL 1226 |

: "💧" U1F4A7 # DROPLET 1227 |

: "💨" U1F4A8 # DASH SYMBOL 1228 |

: "💩" U1F4A9 # PILE OF POO 1229 | # FIXME: prefix conflict 1230 | # : "💫" U1F4AB # DIZZY SYMBOL 1231 | : "💰" U1F4B0 # MONEY BAG 1232 | # FIXME: prefix conflict 1233 | # : "🍰" U1F370 # SHORTCAKE 1234 | : "🎂" U1F382 # BIRTHDAY CAKE 1235 | : "👌" U1F44C # OK HAND SIGN 1236 | # FIXME: Next is conflict, second needs to be fixed in the same way 1237 | #

: "👍" U1F44D # THUMBS UP SIGN 1238 | # : "👎" U1F44E # THUMBS DOWN SIGN 1239 | : "💋" U1F48B # KISS MARK 1240 | 1241 | 1242 | ## Clock faces 1243 | # <1> <0> <0> : "🕐" U1F550 # CLOCK FACE ONE OCLOCK 1244 | # <2> <0> <0> : "🕑" U1F551 # CLOCK FACE TWO OCLOCK 1245 | # <3> <0> <0> : "🕒" U1F552 # CLOCK FACE THREE OCLOCK 1246 | # <4> <0> <0> : "🕓" U1F553 # CLOCK FACE FOUR OCLOCK 1247 | # <5> <0> <0> : "🕔" U1F554 # CLOCK FACE FIVE OCLOCK 1248 | # <6> <0> <0> : "🕕" U1F555 # CLOCK FACE SIX OCLOCK 1249 | # <7> <0> <0> : "🕖" U1F556 # CLOCK FACE SEVEN OCLOCK 1250 | # <8> <0> <0> : "🕗" U1F557 # CLOCK FACE EIGHT OCLOCK 1251 | # <9> <0> <0> : "🕘" U1F558 # CLOCK FACE NINE OCLOCK 1252 | # <1> <0> <0> <0> : "🕙" U1F559 # CLOCK FACE TEN OCLOCK 1253 | # <1> <1> <0> <0> : "🕚" U1F55A # CLOCK FACE ELEVEN OCLOCK 1254 | # <1> <2> <0> <0> : "🕛" U1F55B # CLOCK FACE TWELVE OCLOCK 1255 | 1256 | # <1> <3> <0> : "🕜" U1F55C # CLOCK FACE ONE-THIRTY 1257 | # <2> <3> <0> : "🕝" U1F55D # CLOCK FACE TWO-THIRTY 1258 | # <3> <3> <0> : "🕞" U1F55E # CLOCK FACE THREE-THIRTY 1259 | # <4> <3> <0> : "🕟" U1F55F # CLOCK FACE FOUR-THIRTY 1260 | # <5> <3> <0> : "🕠" U1F560 # CLOCK FACE FIVE-THIRTY 1261 | # <6> <3> <0> : "🕡" U1F561 # CLOCK FACE SIX-THIRTY 1262 | # <7> <3> <0> : "🕢" U1F562 # CLOCK FACE SEVEN-THIRTY 1263 | # <8> <3> <0> : "🕣" U1F563 # CLOCK FACE EIGHT-THIRTY 1264 | # <9> <3> <0> : "🕤" U1F564 # CLOCK FACE NINE-THIRTY 1265 | # <1> <0> <3> <0> : "🕥" U1F565 # CLOCK FACE TEN-THIRTY 1266 | # <1> <1> <3> <0> : "🕦" U1F566 # CLOCK FACE ELEVEN-THIRTY 1267 | # <1> <2> <3> <0> : "🕧" U1F567 # CLOCK FACE TWELVE-THIRTY 1268 | 1269 | 1270 | ## TODO: Emoticons (U+1F600 et seq) 1271 | 1272 | # Lozenge (for Pollen http://pollenpub.com) 1273 | : "◊" U25ca # INTENTIONAL CONFLICT 1274 | --------------------------------------------------------------------------------