packages feed

yi-keymap-vim 0.14.1 → 0.15.0

raw patch · 33 files changed

+1573/−185 lines, 33 filesdep −semigroups

Dependencies removed: semigroups

Files

src/Yi/Keymap/Vim.hs view
@@ -26,7 +26,7 @@ import Data.List                              (find) import Data.Monoid                            ((<>)) import Data.Prototype                         (Proto (Proto), extractValue)-import Yi.Buffer.Adjusted                     (commitUpdateTransactionB, startUpdateTransactionB)+import Yi.Buffer                              (commitUpdateTransactionB, startUpdateTransactionB) import Yi.Editor import Yi.Event                               (Event (..), Key (KASCII), Modifier (MCtrl, MMeta)) import Yi.Keymap                              (Keymap, KeymapM, KeymapSet, YiM, modelessKeymapSet, write)
src/Yi/Keymap/Vim/Common.hs view
@@ -25,6 +25,7 @@     , EventString(..), unEv     , OperatorName(..), unOp     , RegisterName+    , Substitution(..)     , module Yi.Keymap.Vim.MatchResult     , lookupBestMatch, matchesString     ) where@@ -41,7 +42,7 @@ import qualified Data.Text                 as T (Text, isPrefixOf, pack) import qualified Data.Text.Encoding        as E (decodeUtf8, encodeUtf8) import           Data.Typeable             (Typeable)-import           Yi.Buffer.Adjusted        (Direction, Point, RegionStyle)+import           Yi.Buffer                 (Direction, Point, RegionStyle) import           Yi.Editor                 (EditorM) import           Yi.Keymap                 (YiM) import           Yi.Keymap.Vim.MatchResult (MatchResult (..))@@ -131,9 +132,10 @@     , vsOngoingInsertEvents   :: !EventString     , vsLastGotoCharCommand   :: !(Maybe GotoCharCommand)     , vsBindingAccumulator    :: !EventString-    , vsSecondaryCursors      :: ![Point]+    , vsSecondaryCursors      :: ![Point] -- TODO: these should live in a buffer, just as the main cursor does     , vsPaste                 :: !Bool -- ^ like vim's :help paste     , vsCurrentMacroRecording :: !(Maybe (MacroName, EventString))+    , vsLastSubstitution      :: !(Maybe Substitution)     } deriving (Typeable, Generic)  instance Binary RepeatableAction@@ -161,6 +163,7 @@             mempty -- secondary cursors             False -- :set paste             Nothing -- current macro recording+            Nothing -- last substitution  instance Binary VimState @@ -184,3 +187,13 @@ data VimBinding     = VimBindingY (EventString -> VimState -> MatchResult (YiM RepeatToken))     | VimBindingE (EventString -> VimState -> MatchResult (EditorM RepeatToken))++data Substitution = Substitution+    { subsFrom :: YiString+    , subsTo :: YiString+    , subsFlagGlobal :: !Bool+    , subsFlagCaseInsensitive :: !Bool+    , subsFlagConfirm :: !Bool+    } deriving (Generic)++instance Binary Substitution
src/Yi/Keymap/Vim/Digraph.hs view
@@ -11,59 +11,1302 @@  defDigraphs :: [(String, Char)] defDigraphs =-    [ ("ae",  'æ')-    , ("a'",  'á')-    , ("e'",  'é')-    , ("e`",  'è')-    , ("o\"", 'ő')-    , ("o:",  'ö')-    , ("a:",  'ä')-    , ("e:",  'ë')-    , ("u:",  'ü')-    , ("AE",  'Æ')-    , ("Ae",  'Æ')-    , ("A'",  'Á')-    , ("E'",  'É')-    , ("E`",  'È')-    , ("O\"", 'Ő')-    , ("O:",  'Ö')-    , ("A:",  'Ä')-    , ("E:",  'Ë')-    , ("U:",  'Ü')-    , ("=e",  '€')-    , ("Cu",  '¤')-    , ("+-",  '±')-    , ("-+",  '∓')-    , ("^1",  '¹')-    , ("^2",  '²')-    , ("^3",  '³')-    , ("^4",  '⁴')-    , ("^5",  '⁵')-    , ("^6",  '⁶')-    , ("^7",  '⁷')-    , ("^8",  '⁸')-    , ("^9",  '⁹')-    , ("0S",  '⁰')-    , ("1S",  '¹')-    , ("2S",  '²')-    , ("3S",  '³')-    , ("4S",  '⁴')-    , ("5S",  '⁵')-    , ("6S",  '⁶')-    , ("7S",  '⁷')-    , ("8S",  '⁸')-    , ("9S",  '⁹')-    , ("0S",  '⁰')-    , ("0s",  '₀')-    , ("1s",  '₁')-    , ("2s",  '₂')-    , ("3s",  '₃')-    , ("4s",  '₄')-    , ("5s",  '₅')-    , ("6s",  '₆')-    , ("7s",  '₇')-    , ("8s",  '₈')-    , ("9s",  '₉')-    , ("0s",  '₀')-    , ("'0",  '˚')+    [ ("SH", '\x0001') -- START OF HEADING (SOH)+    , ("SX", '\x0002') -- START OF TEXT (STX)+    , ("EX", '\x0003') -- END OF TEXT (ETX)+    , ("ET", '\x0004') -- END OF TRANSMISSION (EOT)+    , ("EQ", '\x0005') -- ENQUIRY (ENQ)+    , ("AK", '\x0006') -- ACKNOWLEDGE (ACK)+    , ("BL", '\x0007') -- BELL (BEL)+    , ("BS", '\x0008') -- BACKSPACE (BS)+    , ("HT", '\x0009') -- CHARACTER TABULATION (HT)+    , ("VT", '\x000B') -- LINE TABULATION (VT)+    , ("FF", '\x000C') -- FORM FEED (FF)+    , ("SO", '\x000E') -- SHIFT OUT (SO)+    , ("SI", '\x000F') -- SHIFT IN (SI)+    , ("DL", '\x0010') -- DATALINK ESCAPE (DLE)+    , ("D1", '\x0011') -- DEVICE CONTROL ONE (DC1)+    , ("D2", '\x0012') -- DEVICE CONTROL TWO (DC2)+    , ("D3", '\x0013') -- DEVICE CONTROL THREE (DC3)+    , ("D4", '\x0014') -- DEVICE CONTROL FOUR (DC4)+    , ("NK", '\x0015') -- NEGATIVE ACKNOWLEDGE (NAK)+    , ("SY", '\x0016') -- SYNCHRONOUS IDLE (SYN)+    , ("EB", '\x0017') -- END OF TRANSMISSION BLOCK (ETB)+    , ("CN", '\x0018') -- CANCEL (CAN)+    , ("EM", '\x0019') -- END OF MEDIUM (EM)+    , ("SB", '\x001A') -- SUBSTITUTE (SUB)+    , ("EC", '\x001B') -- ESCAPE (ESC)+    , ("FS", '\x001C') -- FILE SEPARATOR (IS4)+    , ("GS", '\x001D') -- GROUP SEPARATOR (IS3)+    , ("RS", '\x001E') -- RECORD SEPARATOR (IS2)+    , ("US", '\x001F') -- UNIT SEPARATOR (IS1)+    , ("SP", '\x0020') -- SPACE+    , ("Nb", '\x0023') -- NUMBER SIGN+    , ("DO", '\x0024') -- DOLLAR SIGN+    , ("At", '\x0040') -- COMMERCIAL AT+    , ("<(", '\x005B') -- LEFT SQUARE BRACKET+    , ("//", '\x005C') -- REVERSE SOLIDUS+    , (")>", '\x005D') -- RIGHT SQUARE BRACKET+    , ("'>", '\x005E') -- CIRCUMFLEX ACCENT+    , ("'!", '\x0060') -- GRAVE ACCENT+    , ("(!", '\x007B') -- LEFT CURLY BRACKET+    , ("!!", '\x007C') -- VERTICAL LINE+    , ("!)", '\x007D') -- RIGHT CURLY BRACKET+    , ("'?", '\x007E') -- TILDE+    , ("DT", '\x007F') -- DELETE (DEL)+    , ("PA", '\x0080') -- PADDING CHARACTER (PAD)+    , ("HO", '\x0081') -- HIGH OCTET PRESET (HOP)+    , ("BH", '\x0082') -- BREAK PERMITTED HERE (BPH)+    , ("NH", '\x0083') -- NO BREAK HERE (NBH)+    , ("IN", '\x0084') -- INDEX (IND)+    , ("NL", '\x0085') -- NEXT LINE (NEL)+    , ("SA", '\x0086') -- START OF SELECTED AREA (SSA)+    , ("ES", '\x0087') -- END OF SELECTED AREA (ESA)+    , ("HS", '\x0088') -- CHARACTER TABULATION SET (HTS)+    , ("HJ", '\x0089') -- CHARACTER TABULATION WITH JUSTIFICATION (HTJ)+    , ("VS", '\x008A') -- LINE TABULATION SET (VTS)+    , ("PD", '\x008B') -- PARTIAL LINE FORWARD (PLD)+    , ("PU", '\x008C') -- PARTIAL LINE BACKWARD (PLU)+    , ("RI", '\x008D') -- REVERSE LINE FEED (RI)+    , ("S2", '\x008E') -- SINGLE-SHIFT TWO (SS2)+    , ("S3", '\x008F') -- SINGLE-SHIFT THREE (SS3)+    , ("DC", '\x0090') -- DEVICE CONTROL STRING (DCS)+    , ("P1", '\x0091') -- PRIVATE USE ONE (PU1)+    , ("P2", '\x0092') -- PRIVATE USE TWO (PU2)+    , ("TS", '\x0093') -- SET TRANSMIT STATE (STS)+    , ("CC", '\x0094') -- CANCEL CHARACTER (CCH)+    , ("MW", '\x0095') -- MESSAGE WAITING (MW)+    , ("SG", '\x0096') -- START OF GUARDED AREA (SPA)+    , ("EG", '\x0097') -- END OF GUARDED AREA (EPA)+    , ("SS", '\x0098') -- START OF STRING (SOS)+    , ("GC", '\x0099') -- SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)+    , ("SC", '\x009A') -- SINGLE CHARACTER INTRODUCER (SCI)+    , ("CI", '\x009B') -- CONTROL SEQUENCE INTRODUCER (CSI)+    , ("ST", '\x009C') -- STRING TERMINATOR (ST)+    , ("OC", '\x009D') -- OPERATING SYSTEM COMMAND (OSC)+    , ("PM", '\x009E') -- PRIVACY MESSAGE (PM)+    , ("AC", '\x009F') -- APPLICATION PROGRAM COMMAND (APC)+    , ("NS", '\x00A0') -- NO-BREAK SPACE+    , ("!I", '\x00A1') -- INVERTED EXCLAMATION MARK+    , ("Ct", '\x00A2') -- CENT SIGN+    , ("Pd", '\x00A3') -- POUND SIGN+    , ("Cu", '\x00A4') -- CURRENCY SIGN+    , ("Ye", '\x00A5') -- YEN SIGN+    , ("BB", '\x00A6') -- BROKEN BAR+    , ("SE", '\x00A7') -- SECTION SIGN+    , ("':", '\x00A8') -- DIAERESIS+    , ("Co", '\x00A9') -- COPYRIGHT SIGN+    , ("-a", '\x00AA') -- FEMININE ORDINAL INDICATOR+    , ("<<", '\x00AB') -- LEFT-POINTING DOUBLE ANGLE QUOTATION MARK+    , ("NO", '\x00AC') -- NOT SIGN+    , ("--", '\x00AD') -- SOFT HYPHEN+    , ("Rg", '\x00AE') -- REGISTERED SIGN+    , ("'m", '\x00AF') -- MACRON+    , ("DG", '\x00B0') -- DEGREE SIGN+    , ("+-", '\x00B1') -- PLUS-MINUS SIGN+    , ("2S", '\x00B2') -- SUPERSCRIPT TWO+    , ("3S", '\x00B3') -- SUPERSCRIPT THREE+    , ("''", '\x00B4') -- ACUTE ACCENT+    , ("My", '\x00B5') -- MICRO SIGN+    , ("PI", '\x00B6') -- PILCROW SIGN+    , (".M", '\x00B7') -- MIDDLE DOT+    , ("',", '\x00B8') -- CEDILLA+    , ("1S", '\x00B9') -- SUPERSCRIPT ONE+    , ("-o", '\x00BA') -- MASCULINE ORDINAL INDICATOR+    , (">>", '\x00BB') -- RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK+    , ("14", '\x00BC') -- VULGAR FRACTION ONE QUARTER+    , ("12", '\x00BD') -- VULGAR FRACTION ONE HALF+    , ("34", '\x00BE') -- VULGAR FRACTION THREE QUARTERS+    , ("?I", '\x00BF') -- INVERTED QUESTION MARK+    , ("A!", '\x00C0') -- LATIN CAPITAL LETTER A WITH GRAVE+    , ("A'", '\x00C1') -- LATIN CAPITAL LETTER A WITH ACUTE+    , ("A>", '\x00C2') -- LATIN CAPITAL LETTER A WITH CIRCUMFLEX+    , ("A?", '\x00C3') -- LATIN CAPITAL LETTER A WITH TILDE+    , ("A:", '\x00C4') -- LATIN CAPITAL LETTER A WITH DIAERESIS+    , ("AA", '\x00C5') -- LATIN CAPITAL LETTER A WITH RING ABOVE+    , ("AE", '\x00C6') -- LATIN CAPITAL LETTER AE+    , ("C,", '\x00C7') -- LATIN CAPITAL LETTER C WITH CEDILLA+    , ("E!", '\x00C8') -- LATIN CAPITAL LETTER E WITH GRAVE+    , ("E'", '\x00C9') -- LATIN CAPITAL LETTER E WITH ACUTE+    , ("E>", '\x00CA') -- LATIN CAPITAL LETTER E WITH CIRCUMFLEX+    , ("E:", '\x00CB') -- LATIN CAPITAL LETTER E WITH DIAERESIS+    , ("I!", '\x00CC') -- LATIN CAPITAL LETTER I WITH GRAVE+    , ("I'", '\x00CD') -- LATIN CAPITAL LETTER I WITH ACUTE+    , ("I>", '\x00CE') -- LATIN CAPITAL LETTER I WITH CIRCUMFLEX+    , ("I:", '\x00CF') -- LATIN CAPITAL LETTER I WITH DIAERESIS+    , ("D-", '\x00D0') -- LATIN CAPITAL LETTER ETH (Icelandic)+    , ("N?", '\x00D1') -- LATIN CAPITAL LETTER N WITH TILDE+    , ("O!", '\x00D2') -- LATIN CAPITAL LETTER O WITH GRAVE+    , ("O'", '\x00D3') -- LATIN CAPITAL LETTER O WITH ACUTE+    , ("O>", '\x00D4') -- LATIN CAPITAL LETTER O WITH CIRCUMFLEX+    , ("O?", '\x00D5') -- LATIN CAPITAL LETTER O WITH TILDE+    , ("O:", '\x00D6') -- LATIN CAPITAL LETTER O WITH DIAERESIS+    , ("*X", '\x00D7') -- MULTIPLICATION SIGN+    , ("O/", '\x00D8') -- LATIN CAPITAL LETTER O WITH STROKE+    , ("U!", '\x00D9') -- LATIN CAPITAL LETTER U WITH GRAVE+    , ("U'", '\x00DA') -- LATIN CAPITAL LETTER U WITH ACUTE+    , ("U>", '\x00DB') -- LATIN CAPITAL LETTER U WITH CIRCUMFLEX+    , ("U:", '\x00DC') -- LATIN CAPITAL LETTER U WITH DIAERESIS+    , ("Y'", '\x00DD') -- LATIN CAPITAL LETTER Y WITH ACUTE+    , ("TH", '\x00DE') -- LATIN CAPITAL LETTER THORN (Icelandic)+    , ("ss", '\x00DF') -- LATIN SMALL LETTER SHARP S (German)+    , ("a!", '\x00E0') -- LATIN SMALL LETTER A WITH GRAVE+    , ("a'", '\x00E1') -- LATIN SMALL LETTER A WITH ACUTE+    , ("a>", '\x00E2') -- LATIN SMALL LETTER A WITH CIRCUMFLEX+    , ("a?", '\x00E3') -- LATIN SMALL LETTER A WITH TILDE+    , ("a:", '\x00E4') -- LATIN SMALL LETTER A WITH DIAERESIS+    , ("aa", '\x00E5') -- LATIN SMALL LETTER A WITH RING ABOVE+    , ("ae", '\x00E6') -- LATIN SMALL LETTER AE+    , ("c,", '\x00E7') -- LATIN SMALL LETTER C WITH CEDILLA+    , ("e!", '\x00E8') -- LATIN SMALL LETTER E WITH GRAVE+    , ("e'", '\x00E9') -- LATIN SMALL LETTER E WITH ACUTE+    , ("e>", '\x00EA') -- LATIN SMALL LETTER E WITH CIRCUMFLEX+    , ("e:", '\x00EB') -- LATIN SMALL LETTER E WITH DIAERESIS+    , ("i!", '\x00EC') -- LATIN SMALL LETTER I WITH GRAVE+    , ("i'", '\x00ED') -- LATIN SMALL LETTER I WITH ACUTE+    , ("i>", '\x00EE') -- LATIN SMALL LETTER I WITH CIRCUMFLEX+    , ("i:", '\x00EF') -- LATIN SMALL LETTER I WITH DIAERESIS+    , ("d-", '\x00F0') -- LATIN SMALL LETTER ETH (Icelandic)+    , ("n?", '\x00F1') -- LATIN SMALL LETTER N WITH TILDE+    , ("o!", '\x00F2') -- LATIN SMALL LETTER O WITH GRAVE+    , ("o'", '\x00F3') -- LATIN SMALL LETTER O WITH ACUTE+    , ("o>", '\x00F4') -- LATIN SMALL LETTER O WITH CIRCUMFLEX+    , ("o?", '\x00F5') -- LATIN SMALL LETTER O WITH TILDE+    , ("o:", '\x00F6') -- LATIN SMALL LETTER O WITH DIAERESIS+    , ("-:", '\x00F7') -- DIVISION SIGN+    , ("o/", '\x00F8') -- LATIN SMALL LETTER O WITH STROKE+    , ("u!", '\x00F9') -- LATIN SMALL LETTER U WITH GRAVE+    , ("u'", '\x00FA') -- LATIN SMALL LETTER U WITH ACUTE+    , ("u>", '\x00FB') -- LATIN SMALL LETTER U WITH CIRCUMFLEX+    , ("u:", '\x00FC') -- LATIN SMALL LETTER U WITH DIAERESIS+    , ("y'", '\x00FD') -- LATIN SMALL LETTER Y WITH ACUTE+    , ("th", '\x00FE') -- LATIN SMALL LETTER THORN (Icelandic)+    , ("y:", '\x00FF') -- LATIN SMALL LETTER Y WITH DIAERESIS+    , ("A-", '\x0100') -- LATIN CAPITAL LETTER A WITH MACRON+    , ("a-", '\x0101') -- LATIN SMALL LETTER A WITH MACRON+    , ("A(", '\x0102') -- LATIN CAPITAL LETTER A WITH BREVE+    , ("a(", '\x0103') -- LATIN SMALL LETTER A WITH BREVE+    , ("A;", '\x0104') -- LATIN CAPITAL LETTER A WITH OGONEK+    , ("a;", '\x0105') -- LATIN SMALL LETTER A WITH OGONEK+    , ("C'", '\x0106') -- LATIN CAPITAL LETTER C WITH ACUTE+    , ("c'", '\x0107') -- LATIN SMALL LETTER C WITH ACUTE+    , ("C>", '\x0108') -- LATIN CAPITAL LETTER C WITH CIRCUMFLEX+    , ("c>", '\x0109') -- LATIN SMALL LETTER C WITH CIRCUMFLEX+    , ("C.", '\x010A') -- LATIN CAPITAL LETTER C WITH DOT ABOVE+    , ("c.", '\x010B') -- LATIN SMALL LETTER C WITH DOT ABOVE+    , ("C<", '\x010C') -- LATIN CAPITAL LETTER C WITH CARON+    , ("c<", '\x010D') -- LATIN SMALL LETTER C WITH CARON+    , ("D<", '\x010E') -- LATIN CAPITAL LETTER D WITH CARON+    , ("d<", '\x010F') -- LATIN SMALL LETTER D WITH CARON+    , ("D/", '\x0110') -- LATIN CAPITAL LETTER D WITH STROKE+    , ("d/", '\x0111') -- LATIN SMALL LETTER D WITH STROKE+    , ("E-", '\x0112') -- LATIN CAPITAL LETTER E WITH MACRON+    , ("e-", '\x0113') -- LATIN SMALL LETTER E WITH MACRON+    , ("E(", '\x0114') -- LATIN CAPITAL LETTER E WITH BREVE+    , ("e(", '\x0115') -- LATIN SMALL LETTER E WITH BREVE+    , ("E.", '\x0116') -- LATIN CAPITAL LETTER E WITH DOT ABOVE+    , ("e.", '\x0117') -- LATIN SMALL LETTER E WITH DOT ABOVE+    , ("E;", '\x0118') -- LATIN CAPITAL LETTER E WITH OGONEK+    , ("e;", '\x0119') -- LATIN SMALL LETTER E WITH OGONEK+    , ("E<", '\x011A') -- LATIN CAPITAL LETTER E WITH CARON+    , ("e<", '\x011B') -- LATIN SMALL LETTER E WITH CARON+    , ("G>", '\x011C') -- LATIN CAPITAL LETTER G WITH CIRCUMFLEX+    , ("g>", '\x011D') -- LATIN SMALL LETTER G WITH CIRCUMFLEX+    , ("G(", '\x011E') -- LATIN CAPITAL LETTER G WITH BREVE+    , ("g(", '\x011F') -- LATIN SMALL LETTER G WITH BREVE+    , ("G.", '\x0120') -- LATIN CAPITAL LETTER G WITH DOT ABOVE+    , ("g.", '\x0121') -- LATIN SMALL LETTER G WITH DOT ABOVE+    , ("G,", '\x0122') -- LATIN CAPITAL LETTER G WITH CEDILLA+    , ("g,", '\x0123') -- LATIN SMALL LETTER G WITH CEDILLA+    , ("H>", '\x0124') -- LATIN CAPITAL LETTER H WITH CIRCUMFLEX+    , ("h>", '\x0125') -- LATIN SMALL LETTER H WITH CIRCUMFLEX+    , ("H/", '\x0126') -- LATIN CAPITAL LETTER H WITH STROKE+    , ("h/", '\x0127') -- LATIN SMALL LETTER H WITH STROKE+    , ("I?", '\x0128') -- LATIN CAPITAL LETTER I WITH TILDE+    , ("i?", '\x0129') -- LATIN SMALL LETTER I WITH TILDE+    , ("I-", '\x012A') -- LATIN CAPITAL LETTER I WITH MACRON+    , ("i-", '\x012B') -- LATIN SMALL LETTER I WITH MACRON+    , ("I(", '\x012C') -- LATIN CAPITAL LETTER I WITH BREVE+    , ("i(", '\x012D') -- LATIN SMALL LETTER I WITH BREVE+    , ("I;", '\x012E') -- LATIN CAPITAL LETTER I WITH OGONEK+    , ("i;", '\x012F') -- LATIN SMALL LETTER I WITH OGONEK+    , ("I.", '\x0130') -- LATIN CAPITAL LETTER I WITH DOT ABOVE+    , ("i.", '\x0131') -- LATIN SMALL LETTER DOTLESS I+    , ("IJ", '\x0132') -- LATIN CAPITAL LIGATURE IJ+    , ("ij", '\x0133') -- LATIN SMALL LIGATURE IJ+    , ("J>", '\x0134') -- LATIN CAPITAL LETTER J WITH CIRCUMFLEX+    , ("j>", '\x0135') -- LATIN SMALL LETTER J WITH CIRCUMFLEX+    , ("K,", '\x0136') -- LATIN CAPITAL LETTER K WITH CEDILLA+    , ("k,", '\x0137') -- LATIN SMALL LETTER K WITH CEDILLA+    , ("kk", '\x0138') -- LATIN SMALL LETTER KRA+    , ("L'", '\x0139') -- LATIN CAPITAL LETTER L WITH ACUTE+    , ("l'", '\x013A') -- LATIN SMALL LETTER L WITH ACUTE+    , ("L,", '\x013B') -- LATIN CAPITAL LETTER L WITH CEDILLA+    , ("l,", '\x013C') -- LATIN SMALL LETTER L WITH CEDILLA+    , ("L<", '\x013D') -- LATIN CAPITAL LETTER L WITH CARON+    , ("l<", '\x013E') -- LATIN SMALL LETTER L WITH CARON+    , ("L.", '\x013F') -- LATIN CAPITAL LETTER L WITH MIDDLE DOT+    , ("l.", '\x0140') -- LATIN SMALL LETTER L WITH MIDDLE DOT+    , ("L/", '\x0141') -- LATIN CAPITAL LETTER L WITH STROKE+    , ("l/", '\x0142') -- LATIN SMALL LETTER L WITH STROKE+    , ("N'", '\x0143') -- LATIN CAPITAL LETTER N WITH ACUTE `+    , ("n'", '\x0144') -- LATIN SMALL LETTER N WITH ACUTE `+    , ("N,", '\x0145') -- LATIN CAPITAL LETTER N WITH CEDILLA `+    , ("n,", '\x0146') -- LATIN SMALL LETTER N WITH CEDILLA `+    , ("N<", '\x0147') -- LATIN CAPITAL LETTER N WITH CARON `+    , ("n<", '\x0148') -- LATIN SMALL LETTER N WITH CARON `+    , ("'n", '\x0149') -- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE `+    , ("NG", '\x014A') -- LATIN CAPITAL LETTER ENG+    , ("ng", '\x014B') -- LATIN SMALL LETTER ENG+    , ("O-", '\x014C') -- LATIN CAPITAL LETTER O WITH MACRON+    , ("o-", '\x014D') -- LATIN SMALL LETTER O WITH MACRON+    , ("O(", '\x014E') -- LATIN CAPITAL LETTER O WITH BREVE+    , ("o(", '\x014F') -- LATIN SMALL LETTER O WITH BREVE+    , ("O\"", '\x0150') -- LATIN CAPITAL LETTER O WITH DOUBLE ACUTE+    , ("o\"", '\x0151') -- LATIN SMALL LETTER O WITH DOUBLE ACUTE+    , ("OE", '\x0152') -- LATIN CAPITAL LIGATURE OE+    , ("oe", '\x0153') -- LATIN SMALL LIGATURE OE+    , ("R'", '\x0154') -- LATIN CAPITAL LETTER R WITH ACUTE+    , ("r'", '\x0155') -- LATIN SMALL LETTER R WITH ACUTE+    , ("R,", '\x0156') -- LATIN CAPITAL LETTER R WITH CEDILLA+    , ("r,", '\x0157') -- LATIN SMALL LETTER R WITH CEDILLA+    , ("R<", '\x0158') -- LATIN CAPITAL LETTER R WITH CARON+    , ("r<", '\x0159') -- LATIN SMALL LETTER R WITH CARON+    , ("S'", '\x015A') -- LATIN CAPITAL LETTER S WITH ACUTE+    , ("s'", '\x015B') -- LATIN SMALL LETTER S WITH ACUTE+    , ("S>", '\x015C') -- LATIN CAPITAL LETTER S WITH CIRCUMFLEX+    , ("s>", '\x015D') -- LATIN SMALL LETTER S WITH CIRCUMFLEX+    , ("S,", '\x015E') -- LATIN CAPITAL LETTER S WITH CEDILLA+    , ("s,", '\x015F') -- LATIN SMALL LETTER S WITH CEDILLA+    , ("S<", '\x0160') -- LATIN CAPITAL LETTER S WITH CARON+    , ("s<", '\x0161') -- LATIN SMALL LETTER S WITH CARON+    , ("T,", '\x0162') -- LATIN CAPITAL LETTER T WITH CEDILLA+    , ("t,", '\x0163') -- LATIN SMALL LETTER T WITH CEDILLA+    , ("T<", '\x0164') -- LATIN CAPITAL LETTER T WITH CARON+    , ("t<", '\x0165') -- LATIN SMALL LETTER T WITH CARON+    , ("T/", '\x0166') -- LATIN CAPITAL LETTER T WITH STROKE+    , ("t/", '\x0167') -- LATIN SMALL LETTER T WITH STROKE+    , ("U?", '\x0168') -- LATIN CAPITAL LETTER U WITH TILDE+    , ("u?", '\x0169') -- LATIN SMALL LETTER U WITH TILDE+    , ("U-", '\x016A') -- LATIN CAPITAL LETTER U WITH MACRON+    , ("u-", '\x016B') -- LATIN SMALL LETTER U WITH MACRON+    , ("U(", '\x016C') -- LATIN CAPITAL LETTER U WITH BREVE+    , ("u(", '\x016D') -- LATIN SMALL LETTER U WITH BREVE+    , ("U0", '\x016E') -- LATIN CAPITAL LETTER U WITH RING ABOVE+    , ("u0", '\x016F') -- LATIN SMALL LETTER U WITH RING ABOVE+    , ("U\"", '\x0170') -- LATIN CAPITAL LETTER U WITH DOUBLE ACUTE+    , ("u\"", '\x0171') -- LATIN SMALL LETTER U WITH DOUBLE ACUTE+    , ("U;", '\x0172') -- LATIN CAPITAL LETTER U WITH OGONEK+    , ("u;", '\x0173') -- LATIN SMALL LETTER U WITH OGONEK+    , ("W>", '\x0174') -- LATIN CAPITAL LETTER W WITH CIRCUMFLEX+    , ("w>", '\x0175') -- LATIN SMALL LETTER W WITH CIRCUMFLEX+    , ("Y>", '\x0176') -- LATIN CAPITAL LETTER Y WITH CIRCUMFLEX+    , ("y>", '\x0177') -- LATIN SMALL LETTER Y WITH CIRCUMFLEX+    , ("Y:", '\x0178') -- LATIN CAPITAL LETTER Y WITH DIAERESIS+    , ("Z'", '\x0179') -- LATIN CAPITAL LETTER Z WITH ACUTE+    , ("z'", '\x017A') -- LATIN SMALL LETTER Z WITH ACUTE+    , ("Z.", '\x017B') -- LATIN CAPITAL LETTER Z WITH DOT ABOVE+    , ("z.", '\x017C') -- LATIN SMALL LETTER Z WITH DOT ABOVE+    , ("Z<", '\x017D') -- LATIN CAPITAL LETTER Z WITH CARON+    , ("z<", '\x017E') -- LATIN SMALL LETTER Z WITH CARON+    , ("O9", '\x01A0') -- LATIN CAPITAL LETTER O WITH HORN+    , ("o9", '\x01A1') -- LATIN SMALL LETTER O WITH HORN+    , ("OI", '\x01A2') -- LATIN CAPITAL LETTER OI+    , ("oi", '\x01A3') -- LATIN SMALL LETTER OI+    , ("yr", '\x01A6') -- LATIN LETTER YR+    , ("U9", '\x01AF') -- LATIN CAPITAL LETTER U WITH HORN+    , ("u9", '\x01B0') -- LATIN SMALL LETTER U WITH HORN+    , ("Z/", '\x01B5') -- LATIN CAPITAL LETTER Z WITH STROKE+    , ("z/", '\x01B6') -- LATIN SMALL LETTER Z WITH STROKE+    , ("ED", '\x01B7') -- LATIN CAPITAL LETTER EZH+    , ("A<", '\x01CD') -- LATIN CAPITAL LETTER A WITH CARON+    , ("a<", '\x01CE') -- LATIN SMALL LETTER A WITH CARON+    , ("I<", '\x01CF') -- LATIN CAPITAL LETTER I WITH CARON+    , ("i<", '\x01D0') -- LATIN SMALL LETTER I WITH CARON+    , ("O<", '\x01D1') -- LATIN CAPITAL LETTER O WITH CARON+    , ("o<", '\x01D2') -- LATIN SMALL LETTER O WITH CARON+    , ("U<", '\x01D3') -- LATIN CAPITAL LETTER U WITH CARON+    , ("u<", '\x01D4') -- LATIN SMALL LETTER U WITH CARON+    , ("A1", '\x01DE') -- LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON+    , ("a1", '\x01DF') -- LATIN SMALL LETTER A WITH DIAERESIS AND MACRON+    , ("A7", '\x01E0') -- LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON+    , ("a7", '\x01E1') -- LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON+    , ("A3", '\x01E2') -- LATIN CAPITAL LETTER AE WITH MACRON+    , ("a3", '\x01E3') -- LATIN SMALL LETTER AE WITH MACRON+    , ("G/", '\x01E4') -- LATIN CAPITAL LETTER G WITH STROKE+    , ("g/", '\x01E5') -- LATIN SMALL LETTER G WITH STROKE+    , ("G<", '\x01E6') -- LATIN CAPITAL LETTER G WITH CARON+    , ("g<", '\x01E7') -- LATIN SMALL LETTER G WITH CARON+    , ("K<", '\x01E8') -- LATIN CAPITAL LETTER K WITH CARON+    , ("k<", '\x01E9') -- LATIN SMALL LETTER K WITH CARON+    , ("O;", '\x01EA') -- LATIN CAPITAL LETTER O WITH OGONEK+    , ("o;", '\x01EB') -- LATIN SMALL LETTER O WITH OGONEK+    , ("O1", '\x01EC') -- LATIN CAPITAL LETTER O WITH OGONEK AND MACRON+    , ("o1", '\x01ED') -- LATIN SMALL LETTER O WITH OGONEK AND MACRON+    , ("EZ", '\x01EE') -- LATIN CAPITAL LETTER EZH WITH CARON+    , ("ez", '\x01EF') -- LATIN SMALL LETTER EZH WITH CARON+    , ("j<", '\x01F0') -- LATIN SMALL LETTER J WITH CARON+    , ("G'", '\x01F4') -- LATIN CAPITAL LETTER G WITH ACUTE+    , ("g'", '\x01F5') -- LATIN SMALL LETTER G WITH ACUTE+    , (";S", '\x02BF') -- MODIFIER LETTER LEFT HALF RING+    , ("'<", '\x02C7') -- CARON+    , ("'(", '\x02D8') -- BREVE+    , ("'.", '\x02D9') -- DOT ABOVE+    , ("'0", '\x02DA') -- RING ABOVE+    , ("';", '\x02DB') -- OGONEK+    , ("'\"", '\x02DD') -- DOUBLE ACUTE ACCENT+    , ("A%", '\x0386') -- GREEK CAPITAL LETTER ALPHA WITH TONOS+    , ("E%", '\x0388') -- GREEK CAPITAL LETTER EPSILON WITH TONOS+    , ("Y%", '\x0389') -- GREEK CAPITAL LETTER ETA WITH TONOS+    , ("I%", '\x038A') -- GREEK CAPITAL LETTER IOTA WITH TONOS+    , ("O%", '\x038C') -- GREEK CAPITAL LETTER OMICRON WITH TONOS+    , ("U%", '\x038E') -- GREEK CAPITAL LETTER UPSILON WITH TONOS+    , ("W%", '\x038F') -- GREEK CAPITAL LETTER OMEGA WITH TONOS+    , ("i3", '\x0390') -- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS+    , ("A*", '\x0391') -- GREEK CAPITAL LETTER ALPHA+    , ("B*", '\x0392') -- GREEK CAPITAL LETTER BETA+    , ("G*", '\x0393') -- GREEK CAPITAL LETTER GAMMA+    , ("D*", '\x0394') -- GREEK CAPITAL LETTER DELTA+    , ("E*", '\x0395') -- GREEK CAPITAL LETTER EPSILON+    , ("Z*", '\x0396') -- GREEK CAPITAL LETTER ZETA+    , ("Y*", '\x0397') -- GREEK CAPITAL LETTER ETA+    , ("H*", '\x0398') -- GREEK CAPITAL LETTER THETA+    , ("I*", '\x0399') -- GREEK CAPITAL LETTER IOTA+    , ("K*", '\x039A') -- GREEK CAPITAL LETTER KAPPA+    , ("L*", '\x039B') -- GREEK CAPITAL LETTER LAMDA+    , ("M*", '\x039C') -- GREEK CAPITAL LETTER MU+    , ("N*", '\x039D') -- GREEK CAPITAL LETTER NU+    , ("C*", '\x039E') -- GREEK CAPITAL LETTER XI+    , ("O*", '\x039F') -- GREEK CAPITAL LETTER OMICRON+    , ("P*", '\x03A0') -- GREEK CAPITAL LETTER PI+    , ("R*", '\x03A1') -- GREEK CAPITAL LETTER RHO+    , ("S*", '\x03A3') -- GREEK CAPITAL LETTER SIGMA+    , ("T*", '\x03A4') -- GREEK CAPITAL LETTER TAU+    , ("U*", '\x03A5') -- GREEK CAPITAL LETTER UPSILON+    , ("F*", '\x03A6') -- GREEK CAPITAL LETTER PHI+    , ("X*", '\x03A7') -- GREEK CAPITAL LETTER CHI+    , ("Q*", '\x03A8') -- GREEK CAPITAL LETTER PSI+    , ("W*", '\x03A9') -- GREEK CAPITAL LETTER OMEGA+    , ("J*", '\x03AA') -- GREEK CAPITAL LETTER IOTA WITH DIALYTIKA+    , ("V*", '\x03AB') -- GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA+    , ("a%", '\x03AC') -- GREEK SMALL LETTER ALPHA WITH TONOS+    , ("e%", '\x03AD') -- GREEK SMALL LETTER EPSILON WITH TONOS+    , ("y%", '\x03AE') -- GREEK SMALL LETTER ETA WITH TONOS+    , ("i%", '\x03AF') -- GREEK SMALL LETTER IOTA WITH TONOS+    , ("u3", '\x03B0') -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS+    , ("a*", '\x03B1') -- GREEK SMALL LETTER ALPHA+    , ("b*", '\x03B2') -- GREEK SMALL LETTER BETA+    , ("g*", '\x03B3') -- GREEK SMALL LETTER GAMMA+    , ("d*", '\x03B4') -- GREEK SMALL LETTER DELTA+    , ("e*", '\x03B5') -- GREEK SMALL LETTER EPSILON+    , ("z*", '\x03B6') -- GREEK SMALL LETTER ZETA+    , ("y*", '\x03B7') -- GREEK SMALL LETTER ETA+    , ("h*", '\x03B8') -- GREEK SMALL LETTER THETA+    , ("i*", '\x03B9') -- GREEK SMALL LETTER IOTA+    , ("k*", '\x03BA') -- GREEK SMALL LETTER KAPPA+    , ("l*", '\x03BB') -- GREEK SMALL LETTER LAMDA+    , ("m*", '\x03BC') -- GREEK SMALL LETTER MU+    , ("n*", '\x03BD') -- GREEK SMALL LETTER NU+    , ("c*", '\x03BE') -- GREEK SMALL LETTER XI+    , ("o*", '\x03BF') -- GREEK SMALL LETTER OMICRON+    , ("p*", '\x03C0') -- GREEK SMALL LETTER PI+    , ("r*", '\x03C1') -- GREEK SMALL LETTER RHO+    , ("*s", '\x03C2') -- GREEK SMALL LETTER FINAL SIGMA+    , ("s*", '\x03C3') -- GREEK SMALL LETTER SIGMA+    , ("t*", '\x03C4') -- GREEK SMALL LETTER TAU+    , ("u*", '\x03C5') -- GREEK SMALL LETTER UPSILON+    , ("f*", '\x03C6') -- GREEK SMALL LETTER PHI+    , ("x*", '\x03C7') -- GREEK SMALL LETTER CHI+    , ("q*", '\x03C8') -- GREEK SMALL LETTER PSI+    , ("w*", '\x03C9') -- GREEK SMALL LETTER OMEGA+    , ("j*", '\x03CA') -- GREEK SMALL LETTER IOTA WITH DIALYTIKA+    , ("v*", '\x03CB') -- GREEK SMALL LETTER UPSILON WITH DIALYTIKA+    , ("o%", '\x03CC') -- GREEK SMALL LETTER OMICRON WITH TONOS+    , ("u%", '\x03CD') -- GREEK SMALL LETTER UPSILON WITH TONOS+    , ("w%", '\x03CE') -- GREEK SMALL LETTER OMEGA WITH TONOS+    , ("'G", '\x03D8') -- GREEK LETTER ARCHAIC KOPPA+    , (",G", '\x03D9') -- GREEK SMALL LETTER ARCHAIC KOPPA+    , ("T3", '\x03DA') -- GREEK LETTER STIGMA+    , ("t3", '\x03DB') -- GREEK SMALL LETTER STIGMA+    , ("M3", '\x03DC') -- GREEK LETTER DIGAMMA+    , ("m3", '\x03DD') -- GREEK SMALL LETTER DIGAMMA+    , ("K3", '\x03DE') -- GREEK LETTER KOPPA+    , ("k3", '\x03DF') -- GREEK SMALL LETTER KOPPA+    , ("P3", '\x03E0') -- GREEK LETTER SAMPI+    , ("p3", '\x03E1') -- GREEK SMALL LETTER SAMPI+    , ("'%", '\x03F4') -- GREEK CAPITAL THETA SYMBOL+    , ("j3", '\x03F5') -- GREEK LUNATE EPSILON SYMBOL+    , ("IO", '\x0401') -- CYRILLIC CAPITAL LETTER IO+    , ("D%", '\x0402') -- CYRILLIC CAPITAL LETTER DJE+    , ("G%", '\x0403') -- CYRILLIC CAPITAL LETTER GJE+    , ("IE", '\x0404') -- CYRILLIC CAPITAL LETTER UKRAINIAN IE+    , ("DS", '\x0405') -- CYRILLIC CAPITAL LETTER DZE+    , ("II", '\x0406') -- CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I+    , ("YI", '\x0407') -- CYRILLIC CAPITAL LETTER YI+    , ("J%", '\x0408') -- CYRILLIC CAPITAL LETTER JE+    , ("LJ", '\x0409') -- CYRILLIC CAPITAL LETTER LJE+    , ("NJ", '\x040A') -- CYRILLIC CAPITAL LETTER NJE+    , ("Ts", '\x040B') -- CYRILLIC CAPITAL LETTER TSHE+    , ("KJ", '\x040C') -- CYRILLIC CAPITAL LETTER KJE+    , ("V%", '\x040E') -- CYRILLIC CAPITAL LETTER SHORT U+    , ("DZ", '\x040F') -- CYRILLIC CAPITAL LETTER DZHE+    , ("A=", '\x0410') -- CYRILLIC CAPITAL LETTER A+    , ("B=", '\x0411') -- CYRILLIC CAPITAL LETTER BE+    , ("V=", '\x0412') -- CYRILLIC CAPITAL LETTER VE+    , ("G=", '\x0413') -- CYRILLIC CAPITAL LETTER GHE+    , ("D=", '\x0414') -- CYRILLIC CAPITAL LETTER DE+    , ("E=", '\x0415') -- CYRILLIC CAPITAL LETTER IE+    , ("Z%", '\x0416') -- CYRILLIC CAPITAL LETTER ZHE+    , ("Z=", '\x0417') -- CYRILLIC CAPITAL LETTER ZE+    , ("I=", '\x0418') -- CYRILLIC CAPITAL LETTER I+    , ("J=", '\x0419') -- CYRILLIC CAPITAL LETTER SHORT I+    , ("K=", '\x041A') -- CYRILLIC CAPITAL LETTER KA+    , ("L=", '\x041B') -- CYRILLIC CAPITAL LETTER EL+    , ("M=", '\x041C') -- CYRILLIC CAPITAL LETTER EM+    , ("N=", '\x041D') -- CYRILLIC CAPITAL LETTER EN+    , ("O=", '\x041E') -- CYRILLIC CAPITAL LETTER O+    , ("P=", '\x041F') -- CYRILLIC CAPITAL LETTER PE+    , ("R=", '\x0420') -- CYRILLIC CAPITAL LETTER ER+    , ("S=", '\x0421') -- CYRILLIC CAPITAL LETTER ES+    , ("T=", '\x0422') -- CYRILLIC CAPITAL LETTER TE+    , ("U=", '\x0423') -- CYRILLIC CAPITAL LETTER U+    , ("F=", '\x0424') -- CYRILLIC CAPITAL LETTER EF+    , ("H=", '\x0425') -- CYRILLIC CAPITAL LETTER HA+    , ("C=", '\x0426') -- CYRILLIC CAPITAL LETTER TSE+    , ("C%", '\x0427') -- CYRILLIC CAPITAL LETTER CHE+    , ("S%", '\x0428') -- CYRILLIC CAPITAL LETTER SHA+    , ("Sc", '\x0429') -- CYRILLIC CAPITAL LETTER SHCHA+    , ("='", '\x042A') -- CYRILLIC CAPITAL LETTER HARD SIGN+    , ("Y=", '\x042B') -- CYRILLIC CAPITAL LETTER YERU+    , ("%'", '\x042C') -- CYRILLIC CAPITAL LETTER SOFT SIGN+    , ("JE", '\x042D') -- CYRILLIC CAPITAL LETTER E+    , ("JU", '\x042E') -- CYRILLIC CAPITAL LETTER YU+    , ("JA", '\x042F') -- CYRILLIC CAPITAL LETTER YA+    , ("a=", '\x0430') -- CYRILLIC SMALL LETTER A+    , ("b=", '\x0431') -- CYRILLIC SMALL LETTER BE+    , ("v=", '\x0432') -- CYRILLIC SMALL LETTER VE+    , ("g=", '\x0433') -- CYRILLIC SMALL LETTER GHE+    , ("d=", '\x0434') -- CYRILLIC SMALL LETTER DE+    , ("e=", '\x0435') -- CYRILLIC SMALL LETTER IE+    , ("z%", '\x0436') -- CYRILLIC SMALL LETTER ZHE+    , ("z=", '\x0437') -- CYRILLIC SMALL LETTER ZE+    , ("i=", '\x0438') -- CYRILLIC SMALL LETTER I+    , ("j=", '\x0439') -- CYRILLIC SMALL LETTER SHORT I+    , ("k=", '\x043A') -- CYRILLIC SMALL LETTER KA+    , ("l=", '\x043B') -- CYRILLIC SMALL LETTER EL+    , ("m=", '\x043C') -- CYRILLIC SMALL LETTER EM+    , ("n=", '\x043D') -- CYRILLIC SMALL LETTER EN+    , ("o=", '\x043E') -- CYRILLIC SMALL LETTER O+    , ("p=", '\x043F') -- CYRILLIC SMALL LETTER PE+    , ("r=", '\x0440') -- CYRILLIC SMALL LETTER ER+    , ("s=", '\x0441') -- CYRILLIC SMALL LETTER ES+    , ("t=", '\x0442') -- CYRILLIC SMALL LETTER TE+    , ("u=", '\x0443') -- CYRILLIC SMALL LETTER U+    , ("f=", '\x0444') -- CYRILLIC SMALL LETTER EF+    , ("h=", '\x0445') -- CYRILLIC SMALL LETTER HA+    , ("c=", '\x0446') -- CYRILLIC SMALL LETTER TSE+    , ("c%", '\x0447') -- CYRILLIC SMALL LETTER CHE+    , ("s%", '\x0448') -- CYRILLIC SMALL LETTER SHA+    , ("sc", '\x0449') -- CYRILLIC SMALL LETTER SHCHA+    , ("='", '\x044A') -- CYRILLIC SMALL LETTER HARD SIGN+    , ("y=", '\x044B') -- CYRILLIC SMALL LETTER YERU+    , ("%'", '\x044C') -- CYRILLIC SMALL LETTER SOFT SIGN+    , ("je", '\x044D') -- CYRILLIC SMALL LETTER E+    , ("ju", '\x044E') -- CYRILLIC SMALL LETTER YU+    , ("ja", '\x044F') -- CYRILLIC SMALL LETTER YA+    , ("io", '\x0451') -- CYRILLIC SMALL LETTER IO+    , ("d%", '\x0452') -- CYRILLIC SMALL LETTER DJE+    , ("g%", '\x0453') -- CYRILLIC SMALL LETTER GJE+    , ("ie", '\x0454') -- CYRILLIC SMALL LETTER UKRAINIAN IE+    , ("ds", '\x0455') -- CYRILLIC SMALL LETTER DZE+    , ("ii", '\x0456') -- CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I+    , ("yi", '\x0457') -- CYRILLIC SMALL LETTER YI+    , ("j%", '\x0458') -- CYRILLIC SMALL LETTER JE+    , ("lj", '\x0459') -- CYRILLIC SMALL LETTER LJE+    , ("nj", '\x045A') -- CYRILLIC SMALL LETTER NJE+    , ("ts", '\x045B') -- CYRILLIC SMALL LETTER TSHE+    , ("kj", '\x045C') -- CYRILLIC SMALL LETTER KJE+    , ("v%", '\x045E') -- CYRILLIC SMALL LETTER SHORT U+    , ("dz", '\x045F') -- CYRILLIC SMALL LETTER DZHE+    , ("Y3", '\x0462') -- CYRILLIC CAPITAL LETTER YAT+    , ("y3", '\x0463') -- CYRILLIC SMALL LETTER YAT+    , ("O3", '\x046A') -- CYRILLIC CAPITAL LETTER BIG YUS+    , ("o3", '\x046B') -- CYRILLIC SMALL LETTER BIG YUS+    , ("F3", '\x0472') -- CYRILLIC CAPITAL LETTER FITA+    , ("f3", '\x0473') -- CYRILLIC SMALL LETTER FITA+    , ("V3", '\x0474') -- CYRILLIC CAPITAL LETTER IZHITSA+    , ("v3", '\x0475') -- CYRILLIC SMALL LETTER IZHITSA+    , ("C3", '\x0480') -- CYRILLIC CAPITAL LETTER KOPPA+    , ("c3", '\x0481') -- CYRILLIC SMALL LETTER KOPPA+    , ("G3", '\x0490') -- CYRILLIC CAPITAL LETTER GHE WITH UPTURN+    , ("g3", '\x0491') -- CYRILLIC SMALL LETTER GHE WITH UPTURN+    , ("A+", '\x05D0') -- HEBREW LETTER ALEF+    , ("B+", '\x05D1') -- HEBREW LETTER BET+    , ("G+", '\x05D2') -- HEBREW LETTER GIMEL+    , ("D+", '\x05D3') -- HEBREW LETTER DALET+    , ("H+", '\x05D4') -- HEBREW LETTER HE+    , ("W+", '\x05D5') -- HEBREW LETTER VAV+    , ("Z+", '\x05D6') -- HEBREW LETTER ZAYIN+    , ("X+", '\x05D7') -- HEBREW LETTER HET+    , ("Tj", '\x05D8') -- HEBREW LETTER TET+    , ("J+", '\x05D9') -- HEBREW LETTER YOD+    , ("K%", '\x05DA') -- HEBREW LETTER FINAL KAF+    , ("K+", '\x05DB') -- HEBREW LETTER KAF+    , ("L+", '\x05DC') -- HEBREW LETTER LAMED+    , ("M%", '\x05DD') -- HEBREW LETTER FINAL MEM+    , ("M+", '\x05DE') -- HEBREW LETTER MEM+    , ("N%", '\x05DF') -- HEBREW LETTER FINAL NUN `+    , ("N+", '\x05E0') -- HEBREW LETTER NUN `+    , ("S+", '\x05E1') -- HEBREW LETTER SAMEKH+    , ("E+", '\x05E2') -- HEBREW LETTER AYIN+    , ("P%", '\x05E3') -- HEBREW LETTER FINAL PE+    , ("P+", '\x05E4') -- HEBREW LETTER PE+    , ("Zj", '\x05E5') -- HEBREW LETTER FINAL TSADI+    , ("ZJ", '\x05E6') -- HEBREW LETTER TSADI+    , ("Q+", '\x05E7') -- HEBREW LETTER QOF+    , ("R+", '\x05E8') -- HEBREW LETTER RESH+    , ("Sh", '\x05E9') -- HEBREW LETTER SHIN+    , ("T+", '\x05EA') -- HEBREW LETTER TAV+    , (",+", '\x060C') -- ARABIC COMMA+    , (";+", '\x061B') -- ARABIC SEMICOLON+    , ("?+", '\x061F') -- ARABIC QUESTION MARK+    , ("H'", '\x0621') -- ARABIC LETTER HAMZA+    , ("aM", '\x0622') -- ARABIC LETTER ALEF WITH MADDA ABOVE+    , ("aH", '\x0623') -- ARABIC LETTER ALEF WITH HAMZA ABOVE+    , ("wH", '\x0624') -- ARABIC LETTER WAW WITH HAMZA ABOVE+    , ("ah", '\x0625') -- ARABIC LETTER ALEF WITH HAMZA BELOW+    , ("yH", '\x0626') -- ARABIC LETTER YEH WITH HAMZA ABOVE+    , ("a+", '\x0627') -- ARABIC LETTER ALEF+    , ("b+", '\x0628') -- ARABIC LETTER BEH+    , ("tm", '\x0629') -- ARABIC LETTER TEH MARBUTA+    , ("t+", '\x062A') -- ARABIC LETTER TEH+    , ("tk", '\x062B') -- ARABIC LETTER THEH+    , ("g+", '\x062C') -- ARABIC LETTER JEEM+    , ("hk", '\x062D') -- ARABIC LETTER HAH+    , ("x+", '\x062E') -- ARABIC LETTER KHAH+    , ("d+", '\x062F') -- ARABIC LETTER DAL+    , ("dk", '\x0630') -- ARABIC LETTER THAL+    , ("r+", '\x0631') -- ARABIC LETTER REH+    , ("z+", '\x0632') -- ARABIC LETTER ZAIN+    , ("s+", '\x0633') -- ARABIC LETTER SEEN+    , ("sn", '\x0634') -- ARABIC LETTER SHEEN+    , ("c+", '\x0635') -- ARABIC LETTER SAD+    , ("dd", '\x0636') -- ARABIC LETTER DAD+    , ("tj", '\x0637') -- ARABIC LETTER TAH+    , ("zH", '\x0638') -- ARABIC LETTER ZAH+    , ("e+", '\x0639') -- ARABIC LETTER AIN+    , ("i+", '\x063A') -- ARABIC LETTER GHAIN+    , ("++", '\x0640') -- ARABIC TATWEEL+    , ("f+", '\x0641') -- ARABIC LETTER FEH+    , ("q+", '\x0642') -- ARABIC LETTER QAF+    , ("k+", '\x0643') -- ARABIC LETTER KAF+    , ("l+", '\x0644') -- ARABIC LETTER LAM+    , ("m+", '\x0645') -- ARABIC LETTER MEEM+    , ("n+", '\x0646') -- ARABIC LETTER NOON+    , ("h+", '\x0647') -- ARABIC LETTER HEH+    , ("w+", '\x0648') -- ARABIC LETTER WAW+    , ("j+", '\x0649') -- ARABIC LETTER ALEF MAKSURA+    , ("y+", '\x064A') -- ARABIC LETTER YEH+    , (":+", '\x064B') -- ARABIC FATHATAN+    , ("\"+", '\x064C') -- ARABIC DAMMATAN+    , ("=+", '\x064D') -- ARABIC KASRATAN+    , ("/+", '\x064E') -- ARABIC FATHA+    , ("'+", '\x064F') -- ARABIC DAMMA+    , ("1+", '\x0650') -- ARABIC KASRA+    , ("3+", '\x0651') -- ARABIC SHADDA+    , ("0+", '\x0652') -- ARABIC SUKUN+    , ("aS", '\x0670') -- ARABIC LETTER SUPERSCRIPT ALEF+    , ("p+", '\x067E') -- ARABIC LETTER PEH+    , ("v+", '\x06A4') -- ARABIC LETTER VEH+    , ("gf", '\x06AF') -- ARABIC LETTER GAF+    , ("0a", '\x06F0') -- EXTENDED ARABIC-INDIC DIGIT ZERO+    , ("1a", '\x06F1') -- EXTENDED ARABIC-INDIC DIGIT ONE+    , ("2a", '\x06F2') -- EXTENDED ARABIC-INDIC DIGIT TWO+    , ("3a", '\x06F3') -- EXTENDED ARABIC-INDIC DIGIT THREE+    , ("4a", '\x06F4') -- EXTENDED ARABIC-INDIC DIGIT FOUR+    , ("5a", '\x06F5') -- EXTENDED ARABIC-INDIC DIGIT FIVE+    , ("6a", '\x06F6') -- EXTENDED ARABIC-INDIC DIGIT SIX+    , ("7a", '\x06F7') -- EXTENDED ARABIC-INDIC DIGIT SEVEN+    , ("8a", '\x06F8') -- EXTENDED ARABIC-INDIC DIGIT EIGHT+    , ("9a", '\x06F9') -- EXTENDED ARABIC-INDIC DIGIT NINE+    , ("B.", '\x1E02') -- LATIN CAPITAL LETTER B WITH DOT ABOVE+    , ("b.", '\x1E03') -- LATIN SMALL LETTER B WITH DOT ABOVE+    , ("B_", '\x1E06') -- LATIN CAPITAL LETTER B WITH LINE BELOW+    , ("b_", '\x1E07') -- LATIN SMALL LETTER B WITH LINE BELOW+    , ("D.", '\x1E0A') -- LATIN CAPITAL LETTER D WITH DOT ABOVE+    , ("d.", '\x1E0B') -- LATIN SMALL LETTER D WITH DOT ABOVE+    , ("D_", '\x1E0E') -- LATIN CAPITAL LETTER D WITH LINE BELOW+    , ("d_", '\x1E0F') -- LATIN SMALL LETTER D WITH LINE BELOW+    , ("D,", '\x1E10') -- LATIN CAPITAL LETTER D WITH CEDILLA+    , ("d,", '\x1E11') -- LATIN SMALL LETTER D WITH CEDILLA+    , ("F.", '\x1E1E') -- LATIN CAPITAL LETTER F WITH DOT ABOVE+    , ("f.", '\x1E1F') -- LATIN SMALL LETTER F WITH DOT ABOVE+    , ("G-", '\x1E20') -- LATIN CAPITAL LETTER G WITH MACRON+    , ("g-", '\x1E21') -- LATIN SMALL LETTER G WITH MACRON+    , ("H.", '\x1E22') -- LATIN CAPITAL LETTER H WITH DOT ABOVE+    , ("h.", '\x1E23') -- LATIN SMALL LETTER H WITH DOT ABOVE+    , ("H:", '\x1E26') -- LATIN CAPITAL LETTER H WITH DIAERESIS+    , ("h:", '\x1E27') -- LATIN SMALL LETTER H WITH DIAERESIS+    , ("H,", '\x1E28') -- LATIN CAPITAL LETTER H WITH CEDILLA+    , ("h,", '\x1E29') -- LATIN SMALL LETTER H WITH CEDILLA+    , ("K'", '\x1E30') -- LATIN CAPITAL LETTER K WITH ACUTE+    , ("k'", '\x1E31') -- LATIN SMALL LETTER K WITH ACUTE+    , ("K_", '\x1E34') -- LATIN CAPITAL LETTER K WITH LINE BELOW+    , ("k_", '\x1E35') -- LATIN SMALL LETTER K WITH LINE BELOW+    , ("L_", '\x1E3A') -- LATIN CAPITAL LETTER L WITH LINE BELOW+    , ("l_", '\x1E3B') -- LATIN SMALL LETTER L WITH LINE BELOW+    , ("M'", '\x1E3E') -- LATIN CAPITAL LETTER M WITH ACUTE+    , ("m'", '\x1E3F') -- LATIN SMALL LETTER M WITH ACUTE+    , ("M.", '\x1E40') -- LATIN CAPITAL LETTER M WITH DOT ABOVE+    , ("m.", '\x1E41') -- LATIN SMALL LETTER M WITH DOT ABOVE+    , ("N.", '\x1E44') -- LATIN CAPITAL LETTER N WITH DOT ABOVE `+    , ("n.", '\x1E45') -- LATIN SMALL LETTER N WITH DOT ABOVE `+    , ("N_", '\x1E48') -- LATIN CAPITAL LETTER N WITH LINE BELOW `+    , ("n_", '\x1E49') -- LATIN SMALL LETTER N WITH LINE BELOW `+    , ("P'", '\x1E54') -- LATIN CAPITAL LETTER P WITH ACUTE+    , ("p'", '\x1E55') -- LATIN SMALL LETTER P WITH ACUTE+    , ("P.", '\x1E56') -- LATIN CAPITAL LETTER P WITH DOT ABOVE+    , ("p.", '\x1E57') -- LATIN SMALL LETTER P WITH DOT ABOVE+    , ("R.", '\x1E58') -- LATIN CAPITAL LETTER R WITH DOT ABOVE+    , ("r.", '\x1E59') -- LATIN SMALL LETTER R WITH DOT ABOVE+    , ("R_", '\x1E5E') -- LATIN CAPITAL LETTER R WITH LINE BELOW+    , ("r_", '\x1E5F') -- LATIN SMALL LETTER R WITH LINE BELOW+    , ("S.", '\x1E60') -- LATIN CAPITAL LETTER S WITH DOT ABOVE+    , ("s.", '\x1E61') -- LATIN SMALL LETTER S WITH DOT ABOVE+    , ("T.", '\x1E6A') -- LATIN CAPITAL LETTER T WITH DOT ABOVE+    , ("t.", '\x1E6B') -- LATIN SMALL LETTER T WITH DOT ABOVE+    , ("T_", '\x1E6E') -- LATIN CAPITAL LETTER T WITH LINE BELOW+    , ("t_", '\x1E6F') -- LATIN SMALL LETTER T WITH LINE BELOW+    , ("V?", '\x1E7C') -- LATIN CAPITAL LETTER V WITH TILDE+    , ("v?", '\x1E7D') -- LATIN SMALL LETTER V WITH TILDE+    , ("W!", '\x1E80') -- LATIN CAPITAL LETTER W WITH GRAVE+    , ("w!", '\x1E81') -- LATIN SMALL LETTER W WITH GRAVE+    , ("W'", '\x1E82') -- LATIN CAPITAL LETTER W WITH ACUTE+    , ("w'", '\x1E83') -- LATIN SMALL LETTER W WITH ACUTE+    , ("W:", '\x1E84') -- LATIN CAPITAL LETTER W WITH DIAERESIS+    , ("w:", '\x1E85') -- LATIN SMALL LETTER W WITH DIAERESIS+    , ("W.", '\x1E86') -- LATIN CAPITAL LETTER W WITH DOT ABOVE+    , ("w.", '\x1E87') -- LATIN SMALL LETTER W WITH DOT ABOVE+    , ("X.", '\x1E8A') -- LATIN CAPITAL LETTER X WITH DOT ABOVE+    , ("x.", '\x1E8B') -- LATIN SMALL LETTER X WITH DOT ABOVE+    , ("X:", '\x1E8C') -- LATIN CAPITAL LETTER X WITH DIAERESIS+    , ("x:", '\x1E8D') -- LATIN SMALL LETTER X WITH DIAERESIS+    , ("Y.", '\x1E8E') -- LATIN CAPITAL LETTER Y WITH DOT ABOVE+    , ("y.", '\x1E8F') -- LATIN SMALL LETTER Y WITH DOT ABOVE+    , ("Z>", '\x1E90') -- LATIN CAPITAL LETTER Z WITH CIRCUMFLEX+    , ("z>", '\x1E91') -- LATIN SMALL LETTER Z WITH CIRCUMFLEX+    , ("Z_", '\x1E94') -- LATIN CAPITAL LETTER Z WITH LINE BELOW+    , ("z_", '\x1E95') -- LATIN SMALL LETTER Z WITH LINE BELOW+    , ("h_", '\x1E96') -- LATIN SMALL LETTER H WITH LINE BELOW+    , ("t:", '\x1E97') -- LATIN SMALL LETTER T WITH DIAERESIS+    , ("w0", '\x1E98') -- LATIN SMALL LETTER W WITH RING ABOVE+    , ("y0", '\x1E99') -- LATIN SMALL LETTER Y WITH RING ABOVE+    , ("A2", '\x1EA2') -- LATIN CAPITAL LETTER A WITH HOOK ABOVE+    , ("a2", '\x1EA3') -- LATIN SMALL LETTER A WITH HOOK ABOVE+    , ("E2", '\x1EBA') -- LATIN CAPITAL LETTER E WITH HOOK ABOVE+    , ("e2", '\x1EBB') -- LATIN SMALL LETTER E WITH HOOK ABOVE+    , ("E?", '\x1EBC') -- LATIN CAPITAL LETTER E WITH TILDE+    , ("e?", '\x1EBD') -- LATIN SMALL LETTER E WITH TILDE+    , ("I2", '\x1EC8') -- LATIN CAPITAL LETTER I WITH HOOK ABOVE+    , ("i2", '\x1EC9') -- LATIN SMALL LETTER I WITH HOOK ABOVE+    , ("O2", '\x1ECE') -- LATIN CAPITAL LETTER O WITH HOOK ABOVE+    , ("o2", '\x1ECF') -- LATIN SMALL LETTER O WITH HOOK ABOVE+    , ("U2", '\x1EE6') -- LATIN CAPITAL LETTER U WITH HOOK ABOVE+    , ("u2", '\x1EE7') -- LATIN SMALL LETTER U WITH HOOK ABOVE+    , ("Y!", '\x1EF2') -- LATIN CAPITAL LETTER Y WITH GRAVE+    , ("y!", '\x1EF3') -- LATIN SMALL LETTER Y WITH GRAVE+    , ("Y2", '\x1EF6') -- LATIN CAPITAL LETTER Y WITH HOOK ABOVE+    , ("y2", '\x1EF7') -- LATIN SMALL LETTER Y WITH HOOK ABOVE+    , ("Y?", '\x1EF8') -- LATIN CAPITAL LETTER Y WITH TILDE+    , ("y?", '\x1EF9') -- LATIN SMALL LETTER Y WITH TILDE+    , (";'", '\x1F00') -- GREEK SMALL LETTER ALPHA WITH PSILI+    , (",'", '\x1F01') -- GREEK SMALL LETTER ALPHA WITH DASIA+    , (";!", '\x1F02') -- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA+    , (",!", '\x1F03') -- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA+    , ("?;", '\x1F04') -- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA+    , ("?,", '\x1F05') -- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA+    , ("!:", '\x1F06') -- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI+    , ("?:", '\x1F07') -- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI+    , ("1N", '\x2002') -- EN SPACE+    , ("1M", '\x2003') -- EM SPACE+    , ("3M", '\x2004') -- THREE-PER-EM SPACE+    , ("4M", '\x2005') -- FOUR-PER-EM SPACE+    , ("6M", '\x2006') -- SIX-PER-EM SPACE+    , ("1T", '\x2009') -- THIN SPACE+    , ("1H", '\x200A') -- HAIR SPACE+    , ("-1", '\x2010') -- HYPHEN+    , ("-N", '\x2013') -- EN DASH `+    , ("-M", '\x2014') -- EM DASH+    , ("-3", '\x2015') -- HORIZONTAL BAR+    , ("!2", '\x2016') -- DOUBLE VERTICAL LINE+    , ("=2", '\x2017') -- DOUBLE LOW LINE+    , ("'6", '\x2018') -- LEFT SINGLE QUOTATION MARK+    , ("'9", '\x2019') -- RIGHT SINGLE QUOTATION MARK+    , (".9", '\x201A') -- SINGLE LOW-9 QUOTATION MARK+    , ("9'", '\x201B') -- SINGLE HIGH-REVERSED-9 QUOTATION MARK+    , ("\"6", '\x201C') -- LEFT DOUBLE QUOTATION MARK+    , ("\"9", '\x201D') -- RIGHT DOUBLE QUOTATION MARK+    , (":9", '\x201E') -- DOUBLE LOW-9 QUOTATION MARK+    , ("9\"", '\x201F') -- DOUBLE HIGH-REVERSED-9 QUOTATION MARK+    , ("/-", '\x2020') -- DAGGER+    , ("/=", '\x2021') -- DOUBLE DAGGER+    , ("..", '\x2025') -- TWO DOT LEADER+    , ("%0", '\x2030') -- PER MILLE SIGN+    , ("1'", '\x2032') -- PRIME+    , ("2'", '\x2033') -- DOUBLE PRIME+    , ("3'", '\x2034') -- TRIPLE PRIME+    , ("1\"", '\x2035') -- REVERSED PRIME+    , ("2\"", '\x2036') -- REVERSED DOUBLE PRIME+    , ("3\"", '\x2037') -- REVERSED TRIPLE PRIME+    , ("Ca", '\x2038') -- CARET+    , ("<1", '\x2039') -- SINGLE LEFT-POINTING ANGLE QUOTATION MARK+    , (">1", '\x203A') -- SINGLE RIGHT-POINTING ANGLE QUOTATION MARK+    , (":X", '\x203B') -- REFERENCE MARK+    , ("'-", '\x203E') -- OVERLINE+    , ("/f", '\x2044') -- FRACTION SLASH+    , ("0S", '\x2070') -- SUPERSCRIPT ZERO+    , ("4S", '\x2074') -- SUPERSCRIPT FOUR+    , ("5S", '\x2075') -- SUPERSCRIPT FIVE+    , ("6S", '\x2076') -- SUPERSCRIPT SIX+    , ("7S", '\x2077') -- SUPERSCRIPT SEVEN+    , ("8S", '\x2078') -- SUPERSCRIPT EIGHT+    , ("9S", '\x2079') -- SUPERSCRIPT NINE+    , ("+S", '\x207A') -- SUPERSCRIPT PLUS SIGN+    , ("-S", '\x207B') -- SUPERSCRIPT MINUS+    , ("=S", '\x207C') -- SUPERSCRIPT EQUALS SIGN+    , ("(S", '\x207D') -- SUPERSCRIPT LEFT PARENTHESIS+    , (")S", '\x207E') -- SUPERSCRIPT RIGHT PARENTHESIS+    , ("nS", '\x207F') -- SUPERSCRIPT LATIN SMALL LETTER N `+    , ("0s", '\x2080') -- SUBSCRIPT ZERO+    , ("1s", '\x2081') -- SUBSCRIPT ONE+    , ("2s", '\x2082') -- SUBSCRIPT TWO+    , ("3s", '\x2083') -- SUBSCRIPT THREE+    , ("4s", '\x2084') -- SUBSCRIPT FOUR+    , ("5s", '\x2085') -- SUBSCRIPT FIVE+    , ("6s", '\x2086') -- SUBSCRIPT SIX+    , ("7s", '\x2087') -- SUBSCRIPT SEVEN+    , ("8s", '\x2088') -- SUBSCRIPT EIGHT+    , ("9s", '\x2089') -- SUBSCRIPT NINE+    , ("+s", '\x208A') -- SUBSCRIPT PLUS SIGN+    , ("-s", '\x208B') -- SUBSCRIPT MINUS+    , ("=s", '\x208C') -- SUBSCRIPT EQUALS SIGN+    , ("(s", '\x208D') -- SUBSCRIPT LEFT PARENTHESIS+    , (")s", '\x208E') -- SUBSCRIPT RIGHT PARENTHESIS+    , ("Li", '\x20A4') -- LIRA SIGN+    , ("Pt", '\x20A7') -- PESETA SIGN+    , ("W=", '\x20A9') -- WON SIGN+    , ("Eu", '\x20AC') -- EURO SIGN+    , ("oC", '\x2103') -- DEGREE CELSIUS+    , ("co", '\x2105') -- CARE OF+    , ("oF", '\x2109') -- DEGREE FAHRENHEIT+    , ("N0", '\x2116') -- NUMERO SIGN+    , ("PO", '\x2117') -- SOUND RECORDING COPYRIGHT+    , ("Rx", '\x211E') -- PRESCRIPTION TAKE+    , ("SM", '\x2120') -- SERVICE MARK+    , ("TM", '\x2122') -- TRADE MARK SIGN+    , ("Om", '\x2126') -- OHM SIGN+    , ("AO", '\x212B') -- ANGSTROM SIGN+    , ("13", '\x2153') -- VULGAR FRACTION ONE THIRD+    , ("23", '\x2154') -- VULGAR FRACTION TWO THIRDS+    , ("15", '\x2155') -- VULGAR FRACTION ONE FIFTH+    , ("25", '\x2156') -- VULGAR FRACTION TWO FIFTHS+    , ("35", '\x2157') -- VULGAR FRACTION THREE FIFTHS+    , ("45", '\x2158') -- VULGAR FRACTION FOUR FIFTHS+    , ("16", '\x2159') -- VULGAR FRACTION ONE SIXTH+    , ("56", '\x215A') -- VULGAR FRACTION FIVE SIXTHS+    , ("18", '\x215B') -- VULGAR FRACTION ONE EIGHTH+    , ("38", '\x215C') -- VULGAR FRACTION THREE EIGHTHS+    , ("58", '\x215D') -- VULGAR FRACTION FIVE EIGHTHS+    , ("78", '\x215E') -- VULGAR FRACTION SEVEN EIGHTHS+    , ("1R", '\x2160') -- ROMAN NUMERAL ONE+    , ("2R", '\x2161') -- ROMAN NUMERAL TWO+    , ("3R", '\x2162') -- ROMAN NUMERAL THREE+    , ("4R", '\x2163') -- ROMAN NUMERAL FOUR+    , ("5R", '\x2164') -- ROMAN NUMERAL FIVE+    , ("6R", '\x2165') -- ROMAN NUMERAL SIX+    , ("7R", '\x2166') -- ROMAN NUMERAL SEVEN+    , ("8R", '\x2167') -- ROMAN NUMERAL EIGHT+    , ("9R", '\x2168') -- ROMAN NUMERAL NINE+    , ("aR", '\x2169') -- ROMAN NUMERAL TEN+    , ("bR", '\x216A') -- ROMAN NUMERAL ELEVEN+    , ("cR", '\x216B') -- ROMAN NUMERAL TWELVE+    , ("1r", '\x2170') -- SMALL ROMAN NUMERAL ONE+    , ("2r", '\x2171') -- SMALL ROMAN NUMERAL TWO+    , ("3r", '\x2172') -- SMALL ROMAN NUMERAL THREE+    , ("4r", '\x2173') -- SMALL ROMAN NUMERAL FOUR+    , ("5r", '\x2174') -- SMALL ROMAN NUMERAL FIVE+    , ("6r", '\x2175') -- SMALL ROMAN NUMERAL SIX+    , ("7r", '\x2176') -- SMALL ROMAN NUMERAL SEVEN+    , ("8r", '\x2177') -- SMALL ROMAN NUMERAL EIGHT+    , ("9r", '\x2178') -- SMALL ROMAN NUMERAL NINE+    , ("ar", '\x2179') -- SMALL ROMAN NUMERAL TEN+    , ("br", '\x217A') -- SMALL ROMAN NUMERAL ELEVEN+    , ("cr", '\x217B') -- SMALL ROMAN NUMERAL TWELVE+    , ("<-", '\x2190') -- LEFTWARDS ARROW+    , ("-!", '\x2191') -- UPWARDS ARROW+    , ("->", '\x2192') -- RIGHTWARDS ARROW+    , ("-v", '\x2193') -- DOWNWARDS ARROW+    , ("<>", '\x2194') -- LEFT RIGHT ARROW+    , ("UD", '\x2195') -- UP DOWN ARROW+    , ("<=", '\x21D0') -- LEFTWARDS DOUBLE ARROW+    , ("=>", '\x21D2') -- RIGHTWARDS DOUBLE ARROW+    , ("==", '\x21D4') -- LEFT RIGHT DOUBLE ARROW+    , ("FA", '\x2200') -- FOR ALL+    , ("dP", '\x2202') -- PARTIAL DIFFERENTIAL+    , ("TE", '\x2203') -- THERE EXISTS+    , ("/0", '\x2205') -- EMPTY SET+    , ("DE", '\x2206') -- INCREMENT+    , ("NB", '\x2207') -- NABLA+    , ("(-", '\x2208') -- ELEMENT OF+    , ("-)", '\x220B') -- CONTAINS AS MEMBER+    , ("*P", '\x220F') -- N-ARY PRODUCT `+    , ("+Z", '\x2211') -- N-ARY SUMMATION `+    , ("-2", '\x2212') -- MINUS SIGN+    , ("-+", '\x2213') -- MINUS-OR-PLUS SIGN+    , ("*-", '\x2217') -- ASTERISK OPERATOR+    , ("Ob", '\x2218') -- RING OPERATOR+    , ("Sb", '\x2219') -- BULLET OPERATOR+    , ("RT", '\x221A') -- SQUARE ROOT+    , ("0(", '\x221D') -- PROPORTIONAL TO+    , ("00", '\x221E') -- INFINITY+    , ("-L", '\x221F') -- RIGHT ANGLE+    , ("-V", '\x2220') -- ANGLE+    , ("PP", '\x2225') -- PARALLEL TO+    , ("AN", '\x2227') -- LOGICAL AND+    , ("OR", '\x2228') -- LOGICAL OR+    , ("(U", '\x2229') -- INTERSECTION+    , (")U", '\x222A') -- UNION+    , ("In", '\x222B') -- INTEGRAL+    , ("DI", '\x222C') -- DOUBLE INTEGRAL+    , ("Io", '\x222E') -- CONTOUR INTEGRAL+    , (".:", '\x2234') -- THEREFORE+    , (":.", '\x2235') -- BECAUSE+    , (":R", '\x2236') -- RATIO+    , ("::", '\x2237') -- PROPORTION+    , ("?1", '\x223C') -- TILDE OPERATOR+    , ("CG", '\x223E') -- INVERTED LAZY S+    , ("?-", '\x2243') -- ASYMPTOTICALLY EQUAL TO+    , ("?=", '\x2245') -- APPROXIMATELY EQUAL TO+    , ("?2", '\x2248') -- ALMOST EQUAL TO+    , ("=?", '\x224C') -- ALL EQUAL TO+    , ("HI", '\x2253') -- IMAGE OF OR APPROXIMATELY EQUAL TO+    , ("!=", '\x2260') -- NOT EQUAL TO+    , ("=3", '\x2261') -- IDENTICAL TO+    , ("=<", '\x2264') -- LESS-THAN OR EQUAL TO+    , (">=", '\x2265') -- GREATER-THAN OR EQUAL TO+    , ("<*", '\x226A') -- MUCH LESS-THAN+    , ("*>", '\x226B') -- MUCH GREATER-THAN+    , ("!<", '\x226E') -- NOT LESS-THAN+    , ("!>", '\x226F') -- NOT GREATER-THAN+    , ("(C", '\x2282') -- SUBSET OF+    , (")C", '\x2283') -- SUPERSET OF+    , ("(_", '\x2286') -- SUBSET OF OR EQUAL TO+    , (")_", '\x2287') -- SUPERSET OF OR EQUAL TO+    , ("0.", '\x2299') -- CIRCLED DOT OPERATOR+    , ("02", '\x229A') -- CIRCLED RING OPERATOR+    , ("-T", '\x22A5') -- UP TACK+    , (".P", '\x22C5') -- DOT OPERATOR+    , (":3", '\x22EE') -- VERTICAL ELLIPSIS+    , (".3", '\x22EF') -- MIDLINE HORIZONTAL ELLIPSIS+    , ("Eh", '\x2302') -- HOUSE+    , ("<7", '\x2308') -- LEFT CEILING+    , (">7", '\x2309') -- RIGHT CEILING+    , ("7<", '\x230A') -- LEFT FLOOR+    , ("7>", '\x230B') -- RIGHT FLOOR+    , ("NI", '\x2310') -- REVERSED NOT SIGN+    , ("(A", '\x2312') -- ARC+    , ("TR", '\x2315') -- TELEPHONE RECORDER+    , ("Iu", '\x2320') -- TOP HALF INTEGRAL+    , ("Il", '\x2321') -- BOTTOM HALF INTEGRAL+    , ("</", '\x2329') -- LEFT-POINTING ANGLE BRACKET+    , ("/>", '\x232A') -- RIGHT-POINTING ANGLE BRACKET+    , ("Vs", '\x2423') -- OPEN BOX+    , ("1h", '\x2440') -- OCR HOOK+    , ("3h", '\x2441') -- OCR CHAIR+    , ("2h", '\x2442') -- OCR FORK+    , ("4h", '\x2443') -- OCR INVERTED FORK+    , ("1j", '\x2446') -- OCR BRANCH BANK IDENTIFICATION+    , ("2j", '\x2447') -- OCR AMOUNT OF CHECK+    , ("3j", '\x2448') -- OCR DASH+    , ("4j", '\x2449') -- OCR CUSTOMER ACCOUNT NUMBER+    , ("1.", '\x2488') -- DIGIT ONE FULL STOP+    , ("2.", '\x2489') -- DIGIT TWO FULL STOP+    , ("3.", '\x248A') -- DIGIT THREE FULL STOP+    , ("4.", '\x248B') -- DIGIT FOUR FULL STOP+    , ("5.", '\x248C') -- DIGIT FIVE FULL STOP+    , ("6.", '\x248D') -- DIGIT SIX FULL STOP+    , ("7.", '\x248E') -- DIGIT SEVEN FULL STOP+    , ("8.", '\x248F') -- DIGIT EIGHT FULL STOP+    , ("9.", '\x2490') -- DIGIT NINE FULL STOP+    , ("hh", '\x2500') -- BOX DRAWINGS LIGHT HORIZONTAL+    , ("HH", '\x2501') -- BOX DRAWINGS HEAVY HORIZONTAL+    , ("vv", '\x2502') -- BOX DRAWINGS LIGHT VERTICAL+    , ("VV", '\x2503') -- BOX DRAWINGS HEAVY VERTICAL+    , ("3-", '\x2504') -- BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL+    , ("3_", '\x2505') -- BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL+    , ("3!", '\x2506') -- BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL+    , ("3/", '\x2507') -- BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL+    , ("4-", '\x2508') -- BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL+    , ("4_", '\x2509') -- BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL+    , ("4!", '\x250A') -- BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL+    , ("4/", '\x250B') -- BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL+    , ("dr", '\x250C') -- BOX DRAWINGS LIGHT DOWN AND RIGHT+    , ("dR", '\x250D') -- BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY+    , ("Dr", '\x250E') -- BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT+    , ("DR", '\x250F') -- BOX DRAWINGS HEAVY DOWN AND RIGHT+    , ("dl", '\x2510') -- BOX DRAWINGS LIGHT DOWN AND LEFT+    , ("dL", '\x2511') -- BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY+    , ("Dl", '\x2512') -- BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT+    , ("LD", '\x2513') -- BOX DRAWINGS HEAVY DOWN AND LEFT+    , ("ur", '\x2514') -- BOX DRAWINGS LIGHT UP AND RIGHT+    , ("uR", '\x2515') -- BOX DRAWINGS UP LIGHT AND RIGHT HEAVY+    , ("Ur", '\x2516') -- BOX DRAWINGS UP HEAVY AND RIGHT LIGHT+    , ("UR", '\x2517') -- BOX DRAWINGS HEAVY UP AND RIGHT+    , ("ul", '\x2518') -- BOX VOICED SOUND MARKDRAWINGS LIGHT UP AND LEFT+    , ("uL", '\x2519') -- BOX DRAWINGS UP LIGHT AND LEFT HEAVY+    , ("Ul", '\x251A') -- BOX DRAWINGS UP HEAVY AND LEFT LIGHT+    , ("UL", '\x251B') -- BOX DRAWINGS HEAVY UP AND LEFT+    , ("vr", '\x251C') -- BOX DRAWINGS LIGHT VERTICAL AND RIGHT+    , ("vR", '\x251D') -- BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY+    , ("Vr", '\x2520') -- BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT+    , ("VR", '\x2523') -- BOX DRAWINGS HEAVY VERTICAL AND RIGHT+    , ("vl", '\x2524') -- BOX DRAWINGS LIGHT VERTICAL AND LEFT+    , ("vL", '\x2525') -- BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY+    , ("Vl", '\x2528') -- BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT+    , ("VL", '\x252B') -- BOX DRAWINGS HEAVY VERTICAL AND LEFT+    , ("dh", '\x252C') -- BOX DRAWINGS LIGHT DOWN AND HORIZONTAL+    , ("dH", '\x252F') -- BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY+    , ("Dh", '\x2530') -- BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT+    , ("DH", '\x2533') -- BOX DRAWINGS HEAVY DOWN AND HORIZONTAL+    , ("uh", '\x2534') -- BOX DRAWINGS LIGHT UP AND HORIZONTAL+    , ("uH", '\x2537') -- BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY+    , ("Uh", '\x2538') -- BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT+    , ("UH", '\x253B') -- BOX DRAWINGS HEAVY UP AND HORIZONTAL+    , ("vh", '\x253C') -- BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL+    , ("vH", '\x253F') -- BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY+    , ("Vh", '\x2542') -- BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT+    , ("VH", '\x254B') -- BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL+    , ("FD", '\x2571') -- BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT+    , ("BD", '\x2572') -- BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT+    , ("TB", '\x2580') -- UPPER HALF BLOCK+    , ("LB", '\x2584') -- LOWER HALF BLOCK+    , ("FB", '\x2588') -- FULL BLOCK+    , ("lB", '\x258C') -- LEFT HALF BLOCK+    , ("RB", '\x2590') -- RIGHT HALF BLOCK+    , (".S", '\x2591') -- LIGHT SHADE+    , (":S", '\x2592') -- MEDIUM SHADE+    , ("?S", '\x2593') -- DARK SHADE+    , ("fS", '\x25A0') -- BLACK SQUARE+    , ("OS", '\x25A1') -- WHITE SQUARE+    , ("RO", '\x25A2') -- WHITE SQUARE WITH ROUNDED CORNERS+    , ("Rr", '\x25A3') -- WHITE SQUARE CONTAINING BLACK SMALL SQUARE+    , ("RF", '\x25A4') -- SQUARE WITH HORIZONTAL FILL+    , ("RY", '\x25A5') -- SQUARE WITH VERTICAL FILL+    , ("RH", '\x25A6') -- SQUARE WITH ORTHOGONAL CROSSHATCH FILL+    , ("RZ", '\x25A7') -- SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL+    , ("RK", '\x25A8') -- SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL+    , ("RX", '\x25A9') -- SQUARE WITH DIAGONAL CROSSHATCH FILL+    , ("sB", '\x25AA') -- BLACK SMALL SQUARE+    , ("SR", '\x25AC') -- BLACK RECTANGLE+    , ("Or", '\x25AD') -- WHITE RECTANGLE+    , ("UT", '\x25B2') -- BLACK UP-POINTING TRIANGLE+    , ("uT", '\x25B3') -- WHITE UP-POINTING TRIANGLE+    , ("PR", '\x25B6') -- BLACK RIGHT-POINTING TRIANGLE+    , ("Tr", '\x25B7') -- WHITE RIGHT-POINTING TRIANGLE+    , ("Dt", '\x25BC') -- BLACK DOWN-POINTING TRIANGLE+    , ("dT", '\x25BD') -- WHITE DOWN-POINTING TRIANGLE+    , ("PL", '\x25C0') -- BLACK LEFT-POINTING TRIANGLE+    , ("Tl", '\x25C1') -- WHITE LEFT-POINTING TRIANGLE+    , ("Db", '\x25C6') -- BLACK DIAMOND+    , ("Dw", '\x25C7') -- WHITE DIAMOND+    , ("LZ", '\x25CA') -- LOZENGE+    , ("0m", '\x25CB') -- WHITE CIRCLE+    , ("0o", '\x25CE') -- BULLSEYE+    , ("0M", '\x25CF') -- BLACK CIRCLE+    , ("0L", '\x25D0') -- CIRCLE WITH LEFT HALF BLACK+    , ("0R", '\x25D1') -- CIRCLE WITH RIGHT HALF BLACK+    , ("Sn", '\x25D8') -- INVERSE BULLET+    , ("Ic", '\x25D9') -- INVERSE WHITE CIRCLE+    , ("Fd", '\x25E2') -- BLACK LOWER RIGHT TRIANGLE+    , ("Bd", '\x25E3') -- BLACK LOWER LEFT TRIANGLE+    , ("*2", '\x2605') -- BLACK STAR+    , ("*1", '\x2606') -- WHITE STAR+    , ("<H", '\x261C') -- WHITE LEFT POINTING INDEX+    , (">H", '\x261E') -- WHITE RIGHT POINTING INDEX+    , ("0u", '\x263A') -- WHITE SMILING FACE+    , ("0U", '\x263B') -- BLACK SMILING FACE+    , ("SU", '\x263C') -- WHITE SUN WITH RAYS+    , ("Fm", '\x2640') -- FEMALE SIGN+    , ("Ml", '\x2642') -- MALE SIGN+    , ("cS", '\x2660') -- BLACK SPADE SUIT+    , ("cH", '\x2661') -- WHITE HEART SUIT+    , ("cD", '\x2662') -- WHITE DIAMOND SUIT+    , ("cC", '\x2663') -- BLACK CLUB SUIT+    , ("Md", '\x2669') -- QUARTER NOTE `+    , ("M8", '\x266A') -- EIGHTH NOTE `+    , ("M2", '\x266B') -- BEAMED EIGHTH NOTES+    , ("Mb", '\x266D') -- MUSIC FLAT SIGN+    , ("Mx", '\x266E') -- MUSIC NATURAL SIGN+    , ("MX", '\x266F') -- MUSIC SHARP SIGN+    , ("OK", '\x2713') -- CHECK MARK+    , ("XX", '\x2717') -- BALLOT X+    , ("-X", '\x2720') -- MALTESE CROSS+    , ("IS", '\x3000') -- IDEOGRAPHIC SPACE+    , (",_", '\x3001') -- IDEOGRAPHIC COMMA+    , ("._", '\x3002') -- IDEOGRAPHIC FULL STOP+    , ("+\"", '\x3003') -- DITTO MARK+    , ("+_", '\x3004') -- JAPANESE INDUSTRIAL STANDARD SYMBOL+    , ("*_", '\x3005') -- IDEOGRAPHIC ITERATION MARK+    , (";_", '\x3006') -- IDEOGRAPHIC CLOSING MARK+    , ("0_", '\x3007') -- IDEOGRAPHIC NUMBER ZERO+    , ("<+", '\x300A') -- LEFT DOUBLE ANGLE BRACKET+    , (">+", '\x300B') -- RIGHT DOUBLE ANGLE BRACKET+    , ("<'", '\x300C') -- LEFT CORNER BRACKET+    , (">'", '\x300D') -- RIGHT CORNER BRACKET+    , ("<\"", '\x300E') -- LEFT WHITE CORNER BRACKET+    , (">\"", '\x300F') -- RIGHT WHITE CORNER BRACKET+    , ("(\"", '\x3010') -- LEFT BLACK LENTICULAR BRACKET+    , (")\"", '\x3011') -- RIGHT BLACK LENTICULAR BRACKET+    , ("=T", '\x3012') -- POSTAL MARK+    , ("=_", '\x3013') -- GETA MARK+    , ("('", '\x3014') -- LEFT TORTOISE SHELL BRACKET+    , (")'", '\x3015') -- RIGHT TORTOISE SHELL BRACKET+    , ("(I", '\x3016') -- LEFT WHITE LENTICULAR BRACKET+    , (")I", '\x3017') -- RIGHT WHITE LENTICULAR BRACKET+    , ("-?", '\x301C') -- WAVE DASH+    , ("A5", '\x3041') -- HIRAGANA LETTER SMALL A+    , ("a5", '\x3042') -- HIRAGANA LETTER A+    , ("I5", '\x3043') -- HIRAGANA LETTER SMALL I+    , ("i5", '\x3044') -- HIRAGANA LETTER I+    , ("U5", '\x3045') -- HIRAGANA LETTER SMALL U+    , ("u5", '\x3046') -- HIRAGANA LETTER U+    , ("E5", '\x3047') -- HIRAGANA LETTER SMALL E+    , ("e5", '\x3048') -- HIRAGANA LETTER E+    , ("O5", '\x3049') -- HIRAGANA LETTER SMALL O+    , ("o5", '\x304A') -- HIRAGANA LETTER O+    , ("ka", '\x304B') -- HIRAGANA LETTER KA+    , ("ga", '\x304C') -- HIRAGANA LETTER GA+    , ("ki", '\x304D') -- HIRAGANA LETTER KI+    , ("gi", '\x304E') -- HIRAGANA LETTER GI+    , ("ku", '\x304F') -- HIRAGANA LETTER KU+    , ("gu", '\x3050') -- HIRAGANA LETTER GU+    , ("ke", '\x3051') -- HIRAGANA LETTER KE+    , ("ge", '\x3052') -- HIRAGANA LETTER GE+    , ("ko", '\x3053') -- HIRAGANA LETTER KO+    , ("go", '\x3054') -- HIRAGANA LETTER GO+    , ("sa", '\x3055') -- HIRAGANA LETTER SA+    , ("za", '\x3056') -- HIRAGANA LETTER ZA+    , ("si", '\x3057') -- HIRAGANA LETTER SI+    , ("zi", '\x3058') -- HIRAGANA LETTER ZI+    , ("su", '\x3059') -- HIRAGANA LETTER SU+    , ("zu", '\x305A') -- HIRAGANA LETTER ZU+    , ("se", '\x305B') -- HIRAGANA LETTER SE+    , ("ze", '\x305C') -- HIRAGANA LETTER ZE+    , ("so", '\x305D') -- HIRAGANA LETTER SO+    , ("zo", '\x305E') -- HIRAGANA LETTER ZO+    , ("ta", '\x305F') -- HIRAGANA LETTER TA+    , ("da", '\x3060') -- HIRAGANA LETTER DA+    , ("ti", '\x3061') -- HIRAGANA LETTER TI+    , ("di", '\x3062') -- HIRAGANA LETTER DI+    , ("tU", '\x3063') -- HIRAGANA LETTER SMALL TU+    , ("tu", '\x3064') -- HIRAGANA LETTER TU+    , ("du", '\x3065') -- HIRAGANA LETTER DU+    , ("te", '\x3066') -- HIRAGANA LETTER TE+    , ("de", '\x3067') -- HIRAGANA LETTER DE+    , ("to", '\x3068') -- HIRAGANA LETTER TO+    , ("do", '\x3069') -- HIRAGANA LETTER DO+    , ("na", '\x306A') -- HIRAGANA LETTER NA+    , ("ni", '\x306B') -- HIRAGANA LETTER NI+    , ("nu", '\x306C') -- HIRAGANA LETTER NU+    , ("ne", '\x306D') -- HIRAGANA LETTER NE+    , ("no", '\x306E') -- HIRAGANA LETTER NO+    , ("ha", '\x306F') -- HIRAGANA LETTER HA+    , ("ba", '\x3070') -- HIRAGANA LETTER BA+    , ("pa", '\x3071') -- HIRAGANA LETTER PA+    , ("hi", '\x3072') -- HIRAGANA LETTER HI+    , ("bi", '\x3073') -- HIRAGANA LETTER BI+    , ("pi", '\x3074') -- HIRAGANA LETTER PI+    , ("hu", '\x3075') -- HIRAGANA LETTER HU+    , ("bu", '\x3076') -- HIRAGANA LETTER BU+    , ("pu", '\x3077') -- HIRAGANA LETTER PU+    , ("he", '\x3078') -- HIRAGANA LETTER HE+    , ("be", '\x3079') -- HIRAGANA LETTER BE+    , ("pe", '\x307A') -- HIRAGANA LETTER PE+    , ("ho", '\x307B') -- HIRAGANA LETTER HO+    , ("bo", '\x307C') -- HIRAGANA LETTER BO+    , ("po", '\x307D') -- HIRAGANA LETTER PO+    , ("ma", '\x307E') -- HIRAGANA LETTER MA+    , ("mi", '\x307F') -- HIRAGANA LETTER MI+    , ("mu", '\x3080') -- HIRAGANA LETTER MU+    , ("me", '\x3081') -- HIRAGANA LETTER ME+    , ("mo", '\x3082') -- HIRAGANA LETTER MO+    , ("yA", '\x3083') -- HIRAGANA LETTER SMALL YA+    , ("ya", '\x3084') -- HIRAGANA LETTER YA+    , ("yU", '\x3085') -- HIRAGANA LETTER SMALL YU+    , ("yu", '\x3086') -- HIRAGANA LETTER YU+    , ("yO", '\x3087') -- HIRAGANA LETTER SMALL YO+    , ("yo", '\x3088') -- HIRAGANA LETTER YO+    , ("ra", '\x3089') -- HIRAGANA LETTER RA+    , ("ri", '\x308A') -- HIRAGANA LETTER RI+    , ("ru", '\x308B') -- HIRAGANA LETTER RU+    , ("re", '\x308C') -- HIRAGANA LETTER RE+    , ("ro", '\x308D') -- HIRAGANA LETTER RO+    , ("wA", '\x308E') -- HIRAGANA LETTER SMALL WA+    , ("wa", '\x308F') -- HIRAGANA LETTER WA+    , ("wi", '\x3090') -- HIRAGANA LETTER WI+    , ("we", '\x3091') -- HIRAGANA LETTER WE+    , ("wo", '\x3092') -- HIRAGANA LETTER WO+    , ("n5", '\x3093') -- HIRAGANA LETTER N `+    , ("vu", '\x3094') -- HIRAGANA LETTER VU+    , ("\"5", '\x309B') -- KATAKANA-HIRAGANA VOICED SOUND MARK+    , ("05", '\x309C') -- KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK+    , ("*5", '\x309D') -- HIRAGANA ITERATION MARK+    , ("+5", '\x309E') -- HIRAGANA VOICED ITERATION MARK+    , ("a6", '\x30A1') -- KATAKANA LETTER SMALL A+    , ("A6", '\x30A2') -- KATAKANA LETTER A+    , ("i6", '\x30A3') -- KATAKANA LETTER SMALL I+    , ("I6", '\x30A4') -- KATAKANA LETTER I+    , ("u6", '\x30A5') -- KATAKANA LETTER SMALL U+    , ("U6", '\x30A6') -- KATAKANA LETTER U+    , ("e6", '\x30A7') -- KATAKANA LETTER SMALL E+    , ("E6", '\x30A8') -- KATAKANA LETTER E+    , ("o6", '\x30A9') -- KATAKANA LETTER SMALL O+    , ("O6", '\x30AA') -- KATAKANA LETTER O+    , ("Ka", '\x30AB') -- KATAKANA LETTER KA+    , ("Ga", '\x30AC') -- KATAKANA LETTER GA+    , ("Ki", '\x30AD') -- KATAKANA LETTER KI+    , ("Gi", '\x30AE') -- KATAKANA LETTER GI+    , ("Ku", '\x30AF') -- KATAKANA LETTER KU+    , ("Gu", '\x30B0') -- KATAKANA LETTER GU+    , ("Ke", '\x30B1') -- KATAKANA LETTER KE+    , ("Ge", '\x30B2') -- KATAKANA LETTER GE+    , ("Ko", '\x30B3') -- KATAKANA LETTER KO+    , ("Go", '\x30B4') -- KATAKANA LETTER GO+    , ("Sa", '\x30B5') -- KATAKANA LETTER SA+    , ("Za", '\x30B6') -- KATAKANA LETTER ZA+    , ("Si", '\x30B7') -- KATAKANA LETTER SI+    , ("Zi", '\x30B8') -- KATAKANA LETTER ZI+    , ("Su", '\x30B9') -- KATAKANA LETTER SU+    , ("Zu", '\x30BA') -- KATAKANA LETTER ZU+    , ("Se", '\x30BB') -- KATAKANA LETTER SE+    , ("Ze", '\x30BC') -- KATAKANA LETTER ZE+    , ("So", '\x30BD') -- KATAKANA LETTER SO+    , ("Zo", '\x30BE') -- KATAKANA LETTER ZO+    , ("Ta", '\x30BF') -- KATAKANA LETTER TA+    , ("Da", '\x30C0') -- KATAKANA LETTER DA+    , ("Ti", '\x30C1') -- KATAKANA LETTER TI+    , ("Di", '\x30C2') -- KATAKANA LETTER DI+    , ("TU", '\x30C3') -- KATAKANA LETTER SMALL TU+    , ("Tu", '\x30C4') -- KATAKANA LETTER TU+    , ("Du", '\x30C5') -- KATAKANA LETTER DU+    , ("Te", '\x30C6') -- KATAKANA LETTER TE+    , ("De", '\x30C7') -- KATAKANA LETTER DE+    , ("To", '\x30C8') -- KATAKANA LETTER TO+    , ("Do", '\x30C9') -- KATAKANA LETTER DO+    , ("Na", '\x30CA') -- KATAKANA LETTER NA+    , ("Ni", '\x30CB') -- KATAKANA LETTER NI+    , ("Nu", '\x30CC') -- KATAKANA LETTER NU+    , ("Ne", '\x30CD') -- KATAKANA LETTER NE+    , ("No", '\x30CE') -- KATAKANA LETTER NO+    , ("Ha", '\x30CF') -- KATAKANA LETTER HA+    , ("Ba", '\x30D0') -- KATAKANA LETTER BA+    , ("Pa", '\x30D1') -- KATAKANA LETTER PA+    , ("Hi", '\x30D2') -- KATAKANA LETTER HI+    , ("Bi", '\x30D3') -- KATAKANA LETTER BI+    , ("Pi", '\x30D4') -- KATAKANA LETTER PI+    , ("Hu", '\x30D5') -- KATAKANA LETTER HU+    , ("Bu", '\x30D6') -- KATAKANA LETTER BU+    , ("Pu", '\x30D7') -- KATAKANA LETTER PU+    , ("He", '\x30D8') -- KATAKANA LETTER HE+    , ("Be", '\x30D9') -- KATAKANA LETTER BE+    , ("Pe", '\x30DA') -- KATAKANA LETTER PE+    , ("Ho", '\x30DB') -- KATAKANA LETTER HO+    , ("Bo", '\x30DC') -- KATAKANA LETTER BO+    , ("Po", '\x30DD') -- KATAKANA LETTER PO+    , ("Ma", '\x30DE') -- KATAKANA LETTER MA+    , ("Mi", '\x30DF') -- KATAKANA LETTER MI+    , ("Mu", '\x30E0') -- KATAKANA LETTER MU+    , ("Me", '\x30E1') -- KATAKANA LETTER ME+    , ("Mo", '\x30E2') -- KATAKANA LETTER MO+    , ("YA", '\x30E3') -- KATAKANA LETTER SMALL YA+    , ("Ya", '\x30E4') -- KATAKANA LETTER YA+    , ("YU", '\x30E5') -- KATAKANA LETTER SMALL YU+    , ("Yu", '\x30E6') -- KATAKANA LETTER YU+    , ("YO", '\x30E7') -- KATAKANA LETTER SMALL YO+    , ("Yo", '\x30E8') -- KATAKANA LETTER YO+    , ("Ra", '\x30E9') -- KATAKANA LETTER RA+    , ("Ri", '\x30EA') -- KATAKANA LETTER RI+    , ("Ru", '\x30EB') -- KATAKANA LETTER RU+    , ("Re", '\x30EC') -- KATAKANA LETTER RE+    , ("Ro", '\x30ED') -- KATAKANA LETTER RO+    , ("WA", '\x30EE') -- KATAKANA LETTER SMALL WA+    , ("Wa", '\x30EF') -- KATAKANA LETTER WA+    , ("Wi", '\x30F0') -- KATAKANA LETTER WI+    , ("We", '\x30F1') -- KATAKANA LETTER WE+    , ("Wo", '\x30F2') -- KATAKANA LETTER WO+    , ("N6", '\x30F3') -- KATAKANA LETTER N `+    , ("Vu", '\x30F4') -- KATAKANA LETTER VU+    , ("KA", '\x30F5') -- KATAKANA LETTER SMALL KA+    , ("KE", '\x30F6') -- KATAKANA LETTER SMALL KE+    , ("Va", '\x30F7') -- KATAKANA LETTER VA+    , ("Vi", '\x30F8') -- KATAKANA LETTER VI+    , ("Ve", '\x30F9') -- KATAKANA LETTER VE+    , ("Vo", '\x30FA') -- KATAKANA LETTER VO+    , (".6", '\x30FB') -- KATAKANA MIDDLE DOT+    , ("-6", '\x30FC') -- KATAKANA-HIRAGANA PROLONGED SOUND MARK+    , ("*6", '\x30FD') -- KATAKANA ITERATION MARK+    , ("+6", '\x30FE') -- KATAKANA VOICED ITERATION MARK+    , ("b4", '\x3105') -- BOPOMOFO LETTER B+    , ("p4", '\x3106') -- BOPOMOFO LETTER P+    , ("m4", '\x3107') -- BOPOMOFO LETTER M+    , ("f4", '\x3108') -- BOPOMOFO LETTER F+    , ("d4", '\x3109') -- BOPOMOFO LETTER D+    , ("t4", '\x310A') -- BOPOMOFO LETTER T+    , ("n4", '\x310B') -- BOPOMOFO LETTER N `+    , ("l4", '\x310C') -- BOPOMOFO LETTER L+    , ("g4", '\x310D') -- BOPOMOFO LETTER G+    , ("k4", '\x310E') -- BOPOMOFO LETTER K+    , ("h4", '\x310F') -- BOPOMOFO LETTER H+    , ("j4", '\x3110') -- BOPOMOFO LETTER J+    , ("q4", '\x3111') -- BOPOMOFO LETTER Q+    , ("x4", '\x3112') -- BOPOMOFO LETTER X+    , ("zh", '\x3113') -- BOPOMOFO LETTER ZH+    , ("ch", '\x3114') -- BOPOMOFO LETTER CH+    , ("sh", '\x3115') -- BOPOMOFO LETTER SH+    , ("r4", '\x3116') -- BOPOMOFO LETTER R+    , ("z4", '\x3117') -- BOPOMOFO LETTER Z+    , ("c4", '\x3118') -- BOPOMOFO LETTER C+    , ("s4", '\x3119') -- BOPOMOFO LETTER S+    , ("a4", '\x311A') -- BOPOMOFO LETTER A+    , ("o4", '\x311B') -- BOPOMOFO LETTER O+    , ("e4", '\x311C') -- BOPOMOFO LETTER E+    , ("ai", '\x311E') -- BOPOMOFO LETTER AI+    , ("ei", '\x311F') -- BOPOMOFO LETTER EI+    , ("au", '\x3120') -- BOPOMOFO LETTER AU+    , ("ou", '\x3121') -- BOPOMOFO LETTER OU+    , ("an", '\x3122') -- BOPOMOFO LETTER AN+    , ("en", '\x3123') -- BOPOMOFO LETTER EN+    , ("aN", '\x3124') -- BOPOMOFO LETTER ANG+    , ("eN", '\x3125') -- BOPOMOFO LETTER ENG+    , ("er", '\x3126') -- BOPOMOFO LETTER ER+    , ("i4", '\x3127') -- BOPOMOFO LETTER I+    , ("u4", '\x3128') -- BOPOMOFO LETTER U+    , ("iu", '\x3129') -- BOPOMOFO LETTER IU+    , ("v4", '\x312A') -- BOPOMOFO LETTER V+    , ("nG", '\x312B') -- BOPOMOFO LETTER NG+    , ("gn", '\x312C') -- BOPOMOFO LETTER GN+    , ("1c", '\x3220') -- PARENTHESIZED IDEOGRAPH ONE+    , ("2c", '\x3221') -- PARENTHESIZED IDEOGRAPH TWO+    , ("3c", '\x3222') -- PARENTHESIZED IDEOGRAPH THREE+    , ("4c", '\x3223') -- PARENTHESIZED IDEOGRAPH FOUR+    , ("5c", '\x3224') -- PARENTHESIZED IDEOGRAPH FIVE+    , ("6c", '\x3225') -- PARENTHESIZED IDEOGRAPH SIX+    , ("7c", '\x3226') -- PARENTHESIZED IDEOGRAPH SEVEN+    , ("8c", '\x3227') -- PARENTHESIZED IDEOGRAPH EIGHT+    , ("9c", '\x3228') -- PARENTHESIZED IDEOGRAPH NINE+    , ("ff", '\xFB00') -- LATIN SMALL LIGATURE FF+    , ("fi", '\xFB01') -- LATIN SMALL LIGATURE FI+    , ("fl", '\xFB02') -- LATIN SMALL LIGATURE FL+    , ("ft", '\xFB05') -- LATIN SMALL LIGATURE LONG S T+    , ("st", '\xFB06') -- LATIN SMALL LIGATURE ST     ]
src/Yi/Keymap/Vim/Ex/Commands/BufferNew.hs view
@@ -12,7 +12,7 @@ import           Control.Monad                    (void) import qualified Data.Attoparsec.Text as P        (anyChar, char, string) import           Data.List                        (null)-import           Data.Text as T                   (Text, pack)+import qualified Data.Text as T                   (pack) import           Yi.Buffer                        (BufferId (MemBuffer)) import           Yi.Editor                        (newEmptyBufferE, newTempBufferE, switchToBufferE) import           Yi.Keymap                        (Action (EditorA))
src/Yi/Keymap/Vim/Ex/Commands/Delete.hs view
@@ -17,7 +17,7 @@ import           Data.Text                        () import           Data.Semigroup                   ((<>)) import           Lens.Micro.Platform-import           Yi.Buffer.Adjusted               hiding (Delete)+import           Yi.Buffer                        hiding (Delete) import           Yi.Keymap                        (Action (BufferA)) import           Yi.Keymap.Vim.Common             (EventString) import qualified Yi.Keymap.Vim.Ex.Commands.Common as Common (parse, pureExCommand, parseRange)
src/Yi/Keymap/Vim/Ex/Commands/Global.hs view
@@ -16,7 +16,7 @@ import           Data.Monoid                          ((<>)) import qualified Data.Text                            as T (Text, isInfixOf, pack, snoc) import qualified Data.Attoparsec.Text                 as P (anyChar, char, many', satisfy, string, try)-import           Yi.Buffer.Adjusted+import           Yi.Buffer import           Yi.Editor                            (withCurrentBuffer) import           Yi.Keymap                            (Action (BufferA, EditorA)) import           Yi.Keymap.Vim.Common                 (EventString (Ev))
src/Yi/Keymap/Vim/Ex/Commands/GotoLine.hs view
@@ -11,7 +11,7 @@  import           Data.Char                        (isDigit) import qualified Data.Text                        as T (all, null, unpack)-import           Yi.Buffer.Adjusted               (firstNonSpaceB, gotoLn)+import           Yi.Buffer                        (firstNonSpaceB, gotoLn) import           Yi.Keymap                        (Action (BufferA)) import           Yi.Keymap.Vim.Common             (EventString (Ev)) import           Yi.Keymap.Vim.Ex.Commands.Common (pureExCommand)
src/Yi/Keymap/Vim/Ex/Commands/Quit.hs view
@@ -24,8 +24,10 @@ import qualified Data.List.PointedList.Circular   as PL (length) import           Data.Monoid                      ((<>)) import qualified Data.Text                        as T (append)+import           System.Exit                      (ExitCode (ExitFailure)) import           Yi.Buffer                        (bkey, file)-import           Yi.Core                          (closeWindow, errorEditor, quitEditor)+import           Yi.Core                          (closeWindow, errorEditor, quitEditor,+                                                   quitEditorWithExitCode) import           Yi.Editor import           Yi.File                          (deservesSave, fwriteAllY, viWrite) import           Yi.Keymap                        (Action (YiA), YiM, readEditor)@@ -46,6 +48,9 @@         bangs <- P.many' (P.char '!')         return (quit True (not $ null bangs) False)     , do+        void $ P.try (P.string "cquit") <|> P.string "cq"+        return hardExitWithError+    , do         ws <- P.many' (P.char 'w')         void $ P.try ( P.string "quit") <|> P.string "q"         as <- P.many' (P.try ( P.string "all") <|> P.string "a")@@ -60,6 +65,12 @@               `T.append` (if a then "all" else "")               `T.append` (if f then "!" else "")   , cmdAction = YiA $ action w f a+  }++hardExitWithError :: ExCommand+hardExitWithError = Common.impureExCommand {+    cmdShow = "cquit"+  , cmdAction = YiA (quitEditorWithExitCode (ExitFailure 1))   }  action :: Bool -> Bool -> Bool -> YiM ()
src/Yi/Keymap/Vim/Ex/Commands/Substitute.hs view
@@ -20,17 +20,13 @@ import           Data.Monoid                      ((<>)) import qualified Data.Text                        as T (Text, cons, snoc) import           Lens.Micro.Platform              (over, _2)-import           Yi.Buffer.Adjusted-import           Yi.Editor                        (EditorM, closeBufferAndWindowE, printMsg, withCurrentBuffer)-import           Yi.Keymap                        (Action (EditorA), Keymap)-import           Yi.Keymap.Keys                   (char, choice, (?>>!))-import           Yi.Keymap.Vim.Common             (EventString)+import           Yi.Buffer+import           Yi.Keymap                        (Action (EditorA))+import           Yi.Keymap.Vim.Common             (EventString, Substitution(..)) import qualified Yi.Keymap.Vim.Ex.Commands.Common as Common (parse, pureExCommand, parseRange) import           Yi.Keymap.Vim.Ex.Types           (ExCommand (cmdAction, cmdShow))-import           Yi.MiniBuffer                    (spawnMinibufferE)-import           Yi.Regex                         (makeSearchOptsM)-import qualified Yi.Rope                          as R (YiString, fromString, length, null, toText, toString)-import           Yi.Search+import qualified Yi.Rope                          as R (fromString, toText)+import           Yi.Keymap.Vim.Substitution  -- | Skip one or no occurrences of a given parser. skipOptional :: Alternative f => f a -> f ()@@ -49,16 +45,20 @@     to <- R.fromString <$> P.many' (P.satisfy (/= delimiter))     flagChars <- P.option "" $       P.char delimiter *> P.many' (P.satisfy $ P.inClass "gic")-    return $! substitute from to delimiter-        ('g' `elem` flagChars)-        ('i' `elem` flagChars)-        ('c' `elem` flagChars)+    return $! substitute+        (Substitution+            from+            to+            ('g' `elem` flagChars)+            ('i' `elem` flagChars)+            ('c' `elem` flagChars))+        delimiter         rangeText         rangeB -substitute :: R.YiString -> R.YiString -> Char -> Bool -> Bool -> Bool -> T.Text -> BufferM Region -> ExCommand-substitute from to delimiter global caseInsensitive confirm regionText regionB = Common.pureExCommand {-    cmdShow = regionText+substitute :: Substitution -> Char -> T.Text -> BufferM Region -> ExCommand+substitute s@(Substitution from to global caseInsensitive confirm) delimiter regionText regionB = Common.pureExCommand+  { cmdShow = regionText               <>       "s"               <>       (delimiter `T.cons` R.toText from)               <>       (delimiter `T.cons` R.toText to)@@ -66,70 +66,5 @@               <>       (if confirm then "c" else "")               <>       (if caseInsensitive then "i" else "")               <>       (if global then "g" else "")-  , cmdAction = EditorA $ do-        let opts = if caseInsensitive then [IgnoreCase] else []-        lines' <- withCurrentBuffer $ regionB >>= linesOfRegionB-        regex <- if R.null from-                    then getRegexE-                    else return . (either (const Nothing) Just) -                            . makeSearchOptsM opts . R.toString $ from-        case regex of-            Nothing -> printMsg "No previous search pattern"-            Just regex' -> if confirm-                then substituteConfirm regex' to global lines'-                else withCurrentBuffer $ do-                    -- We need to reverse the lines' here so that replacing-                    -- does not effect the regions in question.-                    mapM_ (void . searchAndRepRegion0 regex' to global) (reverse lines')-                    moveToSol+  , cmdAction = EditorA $ substituteE s regionB   }---- | Run substitution in confirm mode-substituteConfirm :: SearchExp -> R.YiString -> Bool -> [Region] -> EditorM ()-substituteConfirm regex to global lines' = do-    -- TODO This highlights all matches, even in non-global mode-    -- and could potentially be classified as a bug. Fixing requires-    -- changing the regex highlighting api.-    setRegexE regex-    regions <- withCurrentBuffer $ findMatches regex global lines'-    substituteMatch to 0 False regions---- | All matches to replace under given flags-findMatches :: SearchExp -> Bool -> [Region] -> BufferM [Region]-findMatches regex global lines' = do-    let f = if global then id else take 1-    concat <$> mapM (fmap f . regexRegionB regex) lines'---- | Offsets a region (to account for a region prior being modified)-offsetRegion :: Int -> Region -> Region-offsetRegion k reg = mkRegion (regionStart reg + k') (regionEnd reg + k')-    where k' = fromIntegral k---- | Runs a list of matches using itself as a continuation-substituteMatch :: R.YiString -> Int -> Bool -> [Region] -> EditorM ()-substituteMatch _ _ _ [] = resetRegexE-substituteMatch to co autoAll (m:ms) = do-    let m' = offsetRegion co m-    withCurrentBuffer . moveTo $ regionStart m'-    len <- withCurrentBuffer $ R.length <$> readRegionB m'-    let diff = R.length to - len-        tex = "replace with " <> R.toText to <> " (y/n/a/q)?"-    if autoAll-        then do withCurrentBuffer $ replaceRegionB m' to-                substituteMatch to (co + diff) True ms-        else void . spawnMinibufferE tex . const $ askKeymap to co (co + diff) m ms---- | Actual choices during confirm mode.-askKeymap :: R.YiString -> Int -> Int -> Region -> [Region] -> Keymap-askKeymap to co co' m ms = choice [-      char 'n' ?>>! cleanUp >> substituteMatch to co False ms-    , char 'a' ?>>! do cleanUp-                       replace-                       substituteMatch to co' True ms-    , char 'y' ?>>! do cleanUp-                       replace-                       substituteMatch to co' False ms-    , char 'q' ?>>! cleanUp >> resetRegexE-    ]-    where cleanUp = closeBufferAndWindowE-          replace = withCurrentBuffer $ replaceRegionB (offsetRegion co m) to
src/Yi/Keymap/Vim/Ex/Commands/Undo.hs view
@@ -10,7 +10,7 @@  module Yi.Keymap.Vim.Ex.Commands.Undo (parse) where -import           Yi.Buffer.Adjusted               (redoB, undoB)+import           Yi.Buffer                        (redoB, undoB) import           Yi.Keymap                        (Action (BufferA)) import           Yi.Keymap.Vim.Common             (EventString (Ev)) import           Yi.Keymap.Vim.Ex.Commands.Common (pureExCommand)
src/Yi/Keymap/Vim/ExMap.hs view
@@ -18,7 +18,7 @@ import           Data.Monoid              ((<>)) import qualified Data.Text                as T (Text, drop, head, length, split, unwords, map, unpack) import           System.FilePath          (isPathSeparator)-import           Yi.Buffer.Adjusted       hiding (Insert)+import           Yi.Buffer                hiding (Insert) import           Yi.Editor import           Yi.History               (historyDown, historyFinish, historyPrefixSet, historyUp) import           Yi.Keymap                (YiM)
src/Yi/Keymap/Vim/InsertMap.hs view
@@ -19,7 +19,7 @@ import           Data.Monoid              ((<>)) import qualified Data.Text                as T (pack, unpack) import qualified Yi.Buffer                as B (bdeleteB, deleteB, deleteRegionB, insertB, insertN)-import           Yi.Buffer.Adjusted       as BA hiding (Insert)+import           Yi.Buffer                as BA hiding (Insert) import           Yi.Editor                (EditorM, getEditorDyn, withCurrentBuffer) import           Yi.Event                 (Event) import           Yi.Keymap.Vim.Common
src/Yi/Keymap/Vim/Motion.hs view
@@ -57,7 +57,7 @@ import           Data.Maybe                 (fromMaybe) import           Data.Monoid                ((<>)) import qualified Data.Text                  as T (unpack)-import           Yi.Buffer.Adjusted+import           Yi.Buffer import           Yi.Keymap.Vim.Common       (EventString (_unEv), MatchResult (..), lookupBestMatch) import           Yi.Keymap.Vim.StyledRegion (StyledRegion (..), normalizeRegion) 
src/Yi/Keymap/Vim/NormalMap.hs view
@@ -16,14 +16,14 @@ import           Lens.Micro.Platform        (use, (.=)) import           Control.Monad              (replicateM_, unless, void, when) import           Data.Char                  (ord)-import           Data.HashMap.Strict        (lookup, singleton)+import           Data.HashMap.Strict        (lookup, insert) import           Data.List                  (group) import           Data.Maybe                 (fromMaybe) import           Data.Monoid                ((<>)) import qualified Data.Text                  as T (drop, empty, pack, replicate, unpack) import           System.Directory           (doesFileExist) import           System.FriendlyPath        (expandTilda)-import           Yi.Buffer.Adjusted         hiding (Insert)+import           Yi.Buffer                  hiding (Insert) import           Yi.Core                    (closeWindow, quitEditor) import           Yi.Editor import           Yi.Event                   (Event (Event), Key (KASCII, KEnter, KEsc, KTab), Modifier (MCtrl))@@ -38,6 +38,7 @@ import           Yi.Keymap.Vim.Search       (doVimSearch) import           Yi.Keymap.Vim.StateUtils import           Yi.Keymap.Vim.StyledRegion (StyledRegion (StyledRegion), transformCharactersInLineN)+import           Yi.Keymap.Vim.Substitution (repeatSubstitutionE, repeatSubstitutionFlaglessE) import           Yi.Keymap.Vim.Tag          (gotoTag, popTag) import           Yi.Keymap.Vim.Utils import           Yi.MiniBuffer              (spawnMinibufferE)@@ -249,7 +250,6 @@     , (char 'R', return (), switchMode Replace)     ] - nonrepeatableBindings :: [VimBinding] nonrepeatableBindings = fmap (mkBindingE Normal Drop)     [ (spec KEsc, return (), resetCount)@@ -271,7 +271,7 @@     , (char ',', repeatGotoCharE reverseDir, id)      -- Repeat-    , (char '&', return (), id) -- TODO+    , (char '&', loadSubstitutionE >>= maybe (pure ()) repeatSubstitutionFlaglessE, id)      -- Transition to ex     , (char ':', do@@ -302,6 +302,7 @@     , ("g#", searchWordE False Backward, resetCount)     , ("gd", withCurrentBuffer $ withModeB modeGotoDeclaration, resetCount)     , ("gD", withCurrentBuffer $ withModeB modeGotoDeclaration, resetCount)+    , ("g&", loadSubstitutionE >>= maybe (pure ()) repeatSubstitutionE, id)     , ("<C-g>", printFileInfoE, resetCount)     , ("<C-w>c", tryCloseE, resetCount)     , ("<C-w>o", closeOtherE, resetCount)@@ -490,11 +491,10 @@                           , vsCurrentMacroRecording = Just (macroName, Ev macroBody) })                 = WholeMatch $ do                       let reg = Register Exclusive (R.fromText (T.drop 2 macroBody))-                      modifyStateE $ \s ->-                          s { vsCurrentMacroRecording = Nothing-                              , vsRegisterMap = singleton macroName reg-                                              <> vsRegisterMap s-                              }+                      modifyStateE $ \s -> s+                          { vsCurrentMacroRecording = Nothing+                          , vsRegisterMap = insert macroName reg (vsRegisterMap s)+                          }                       return Finish           f _ _ = NoMatch @@ -506,10 +506,12 @@                                , vsCount = mbCount }) = WholeMatch $ do               resetCountE               case lookup c registers of-                  Just (Register _ evs) -> do+                  Just reg@(Register _ evs) -> do                       let count = fromMaybe 1 mbCount                           mkAct = Ev . T.replicate count . R.toText                       scheduleActionStringForEval . mkAct $ evs+                      modifyStateE $ \s ->+                          s { vsRegisterMap = insert '@' reg (vsRegisterMap s) }                       return Finish                   Nothing -> return Drop           f _ _ = NoMatch
src/Yi/Keymap/Vim/NormalOperatorPendingMap.hs view
@@ -17,7 +17,7 @@ import           Data.Maybe                 (fromJust, fromMaybe) import           Data.Monoid                ((<>)) import qualified Data.Text                  as T (init, last, pack, snoc, unpack)-import           Yi.Buffer.Adjusted         hiding (Insert)+import           Yi.Buffer                  hiding (Insert) import           Yi.Editor                  (getEditorDyn, withCurrentBuffer) import           Yi.Keymap.Keys             (Key (KEsc), spec) import           Yi.Keymap.Vim.Common
src/Yi/Keymap/Vim/Operator.hs view
@@ -26,14 +26,16 @@ import           Control.Monad              (when) import           Data.Char                  (isSpace, toLower, toUpper) import           Data.Foldable              (find)+import qualified Data.List.NonEmpty as NE import           Data.Maybe                 (fromJust) import           Data.Monoid                ((<>)) import qualified Data.Text                  as T (unpack)-import           Yi.Buffer.Adjusted         hiding (Insert)+import           Yi.Buffer                  hiding (Insert)+import           Yi.Buffer.Misc             (startUpdateTransactionB) import           Yi.Editor                  (EditorM, getEditorDyn, withCurrentBuffer) import           Yi.Keymap.Vim.Common import           Yi.Keymap.Vim.EventUtils   (eventToEventString, parseEvents)-import           Yi.Keymap.Vim.StateUtils   (setRegisterE, switchModeE)+import           Yi.Keymap.Vim.StateUtils   (setRegisterE, switchModeE, modifyStateE) import           Yi.Keymap.Vim.StyledRegion (StyledRegion (..), transformCharactersInRegionB) import           Yi.Keymap.Vim.TextObject   (CountedTextObject, regionOfTextObjectB) import           Yi.Keymap.Vim.Utils        (indentBlockRegionB)@@ -88,7 +90,7 @@         regName <- fmap vsActiveRegister getEditorDyn         setRegisterE regName style s         withCurrentBuffer $ do-            point <- deleteRegionWithStyleB reg style+            point <- NE.head <$> deleteRegionWithStyleB reg style             moveTo point             eof <- atEof             if eof@@ -108,12 +110,23 @@         s <- withCurrentBuffer $ readRegionRopeWithStyleB reg style         regName <- fmap vsActiveRegister getEditorDyn         setRegisterE regName style s-        withCurrentBuffer $ do-            point <- deleteRegionWithStyleB reg style-            moveTo point-            when (style == LineWise) $ do-                insertB '\n'-                leftB+        do+            withCurrentBuffer $ startUpdateTransactionB+            case style of+                LineWise -> withCurrentBuffer $ do+                    point <- NE.head <$> deleteRegionWithStyleB reg style+                    moveTo point+                    insertB '\n'+                    leftB+                Block -> do+                    points <- withCurrentBuffer $ do+                        points <- deleteRegionWithStyleB reg style+                        moveTo $ NE.head points+                        return points+                    modifyStateE $ \s -> s { vsSecondaryCursors = NE.tail points }+                _ -> withCurrentBuffer $ do+                    point <- NE.head <$> deleteRegionWithStyleB reg style+                    moveTo point         switchModeE $ Insert 'c'         return Continue }
src/Yi/Keymap/Vim/ReplaceMap.hs view
@@ -13,7 +13,7 @@ import           Control.Monad            (replicateM_, when) import           Data.Monoid              ((<>)) import qualified Data.Text                as T (unpack)-import           Yi.Buffer.Adjusted+import           Yi.Buffer import           Yi.Editor                (EditorM, getEditorDyn, withCurrentBuffer) import           Yi.Keymap.Keys           (Key (KEsc), ctrlCh, spec) import           Yi.Keymap.Vim.Common@@ -49,6 +49,7 @@     saveInsertEventStringE evs     withCurrentBuffer $ case T.unpack . _unEv $ evs of         [c]    -> insertOrReplaceB c+        "<lt>" -> insertOrReplaceB '<'         "<CR>" -> insertOrReplaceB '\n'         -- For testing purposes assume noexpandtab, tw=4         "<Esc>" -> replicateM_ 4 $ insertOrReplaceB ' '
src/Yi/Keymap/Vim/ReplaceSingleCharMap.hs view
@@ -14,7 +14,7 @@ import           Control.Monad            (replicateM_, when) import           Data.Maybe               (fromMaybe) import qualified Data.Text                as T (unpack)-import           Yi.Buffer.Adjusted+import           Yi.Buffer import           Yi.Editor                (getEditorDyn, withCurrentBuffer) import           Yi.Keymap.Keys           (Key (KEsc), spec) import           Yi.Keymap.Vim.Common
src/Yi/Keymap/Vim/Search.hs view
@@ -12,7 +12,7 @@  import Data.Maybe         (listToMaybe) import Data.Text          ()-import Yi.Buffer.Adjusted+import Yi.Buffer import Yi.Editor          (EditorM, printMsg, withCurrentBuffer) import Yi.Search          (SearchOption, getRegexE, searchInit) 
src/Yi/Keymap/Vim/SearchMotionMap.hs view
@@ -14,7 +14,7 @@ import           Control.Monad            (replicateM_) import           Data.Maybe               (fromMaybe) import qualified Data.Text                as T (pack, unpack)-import           Yi.Buffer.Adjusted       (Direction (Backward, Forward), elemsB)+import           Yi.Buffer                (Direction (Backward, Forward), elemsB) import           Yi.Editor                (getEditorDyn, withCurrentBuffer) import           Yi.History               (historyFinish, historyPrefixSet) import           Yi.Keymap.Vim.Common
src/Yi/Keymap/Vim/StateUtils.hs view
@@ -31,6 +31,8 @@     , updateModeIndicatorE     , saveInsertEventStringE     , resetActiveRegisterE+    , saveSubstitutionE+    , loadSubstitutionE     ) where  import           Control.Monad            (when)@@ -174,3 +176,9 @@  resetActiveRegisterE :: EditorM () resetActiveRegisterE = modifyStateE $ \s -> s { vsActiveRegister = '\0' }++saveSubstitutionE :: Substitution -> EditorM ()+saveSubstitutionE sub = modifyStateE $ \s -> s { vsLastSubstitution = Just sub }++loadSubstitutionE :: EditorM (Maybe Substitution)+loadSubstitutionE = vsLastSubstitution <$> getEditorDyn
src/Yi/Keymap/Vim/StyledRegion.hs view
@@ -18,7 +18,7 @@  import           Control.Monad      (forM_) import qualified Data.Text          as T (map)-import           Yi.Buffer.Adjusted+import           Yi.Buffer import qualified Yi.Rope            as R (withText) import           Yi.Utils           (SemiNum ((-~))) 
+ src/Yi/Keymap/Vim/Substitution.hs view
@@ -0,0 +1,99 @@+{-# language OverloadedStrings #-}++module Yi.Keymap.Vim.Substitution+    ( substituteE+    , substituteConfirmE+    , repeatSubstitutionE+    , repeatSubstitutionFlaglessE+    ) where++import Control.Monad (void)+import Data.Monoid+import Yi.MiniBuffer+import Yi.Keymap (Keymap)+import qualified Yi.Rope as R+import Yi.Regex+import Yi.Buffer+import Yi.Editor+import Yi.Search+import Yi.Keymap.Keys (char, choice, (?>>!))+import Yi.Keymap.Vim.Common+import Yi.Keymap.Vim.StateUtils++substituteE :: Substitution -> BufferM Region -> EditorM ()+substituteE s@(Substitution from to global caseInsensitive confirm) regionB = do+        let opts = if caseInsensitive then [IgnoreCase] else []+        lines' <- withCurrentBuffer $ regionB >>= linesOfRegionB+        regex <- if R.null from+                    then getRegexE+                    else return . (either (const Nothing) Just) +                            . makeSearchOptsM opts . R.toString $ from+        case regex of+            Nothing -> printMsg "No previous search pattern"+            Just regex' -> do+                saveSubstitutionE s+                if confirm+                then substituteConfirmE regex' to global lines'+                else do+                    withCurrentBuffer $ do+                        -- We need to reverse the lines' here so that replacing+                        -- does not effect the regions in question.+                        mapM_ (void . searchAndRepRegion0 regex' to global) (reverse lines')+                        moveToSol++-- | Run substitution in confirm mode+substituteConfirmE :: SearchExp -> R.YiString -> Bool -> [Region] -> EditorM ()+substituteConfirmE regex to global lines' = do+    -- TODO This highlights all matches, even in non-global mode+    -- and could potentially be classified as a bug. Fixing requires+    -- changing the regex highlighting api.+    setRegexE regex+    regions <- withCurrentBuffer $ findMatches regex global lines'+    substituteMatch to 0 False regions++-- | All matches to replace under given flags+findMatches :: SearchExp -> Bool -> [Region] -> BufferM [Region]+findMatches regex global lines' = do+    let f = if global then id else take 1+    concat <$> mapM (fmap f . regexRegionB regex) lines'++-- | Runs a list of matches using itself as a continuation+substituteMatch :: R.YiString -> Int -> Bool -> [Region] -> EditorM ()+substituteMatch _ _ _ [] = resetRegexE+substituteMatch to co autoAll (m:ms) = do+    let m' = offsetRegion co m+    withCurrentBuffer . moveTo $ regionStart m'+    len <- withCurrentBuffer $ R.length <$> readRegionB m'+    let diff = R.length to - len+        tex = "replace with " <> R.toText to <> " (y/n/a/q)?"+    if autoAll+        then do withCurrentBuffer $ replaceRegionB m' to+                substituteMatch to (co + diff) True ms+        else void . spawnMinibufferE tex . const $ askKeymap to co (co + diff) m ms++-- | Offsets a region (to account for a region prior being modified)+offsetRegion :: Int -> Region -> Region+offsetRegion k reg = mkRegion (regionStart reg + k') (regionEnd reg + k')+    where k' = fromIntegral k++-- | Actual choices during confirm mode.+askKeymap :: R.YiString -> Int -> Int -> Region -> [Region] -> Keymap+askKeymap to co co' m ms = choice [+      char 'n' ?>>! cleanUp >> substituteMatch to co False ms+    , char 'a' ?>>! do cleanUp+                       replace+                       substituteMatch to co' True ms+    , char 'y' ?>>! do cleanUp+                       replace+                       substituteMatch to co' False ms+    , char 'q' ?>>! cleanUp >> resetRegexE+    ]+    where cleanUp = closeBufferAndWindowE+          replace = withCurrentBuffer $ replaceRegionB (offsetRegion co m) to++repeatSubstitutionFlaglessE :: Substitution -> EditorM ()+repeatSubstitutionFlaglessE (Substitution from to _ _ _) =+    substituteE (Substitution from to False False False) (regionOfB Line)++repeatSubstitutionE :: Substitution -> EditorM ()+repeatSubstitutionE s = substituteE s (regionOfB Line)
src/Yi/Keymap/Vim/TextObject.hs view
@@ -8,7 +8,7 @@   ) where  import Control.Monad              (replicateM_, (<=<))-import Yi.Buffer.Adjusted+import Yi.Buffer import Yi.Keymap.Vim.MatchResult import Yi.Keymap.Vim.StyledRegion (StyledRegion (..), normalizeRegion) 
src/Yi/Keymap/Vim/Utils.hs view
@@ -36,7 +36,7 @@ import           Data.List                (group) import qualified Data.Text                as T (unpack) import           Safe                     (headDef)-import           Yi.Buffer.Adjusted       hiding (Insert)+import           Yi.Buffer                hiding (Insert) import           Yi.Editor import           Yi.Event                 (Event) import           Yi.Keymap                (YiM)
src/Yi/Keymap/Vim/VisualMap.hs view
@@ -19,7 +19,7 @@ import           Data.List                  (group) import           Data.Maybe                 (fromJust, fromMaybe) import qualified Data.Text                  as T (unpack)-import           Yi.Buffer.Adjusted         hiding (Insert)+import           Yi.Buffer                  hiding (Insert) import           Yi.Editor import           Yi.Keymap.Vim.Common import           Yi.Keymap.Vim.Operator     (VimOperator (..), opDelete, stringToOperator)@@ -230,7 +230,7 @@                     region <- withCurrentBuffer regionOfSelectionB                     withCurrentBuffer $ transformCharactersInRegionB (StyledRegion style region)                                       (\x -> if x == '\n' then x else c)-                    switchModeE Normal+                    escAction                     return Finish                 _ -> NoMatch           f _ _ = NoMatch@@ -260,7 +260,7 @@                 region' <- convertRegionToStyleB region Inclusive                 replaceRegionB region' rope             _ -> pure ()-        switchModeE Normal+        escAction         return Finish     f _ _ = NoMatch @@ -294,6 +294,7 @@                       [] -> error "No cursor to move to (in Yi.Keymap.Vim.VisualMap.insertBinding)"                       (mainCursor : _) -> withCurrentBuffer (moveTo mainCursor)                   modifyStateE $ \s -> s { vsSecondaryCursors = drop 1 cursors }+                  withCurrentBuffer $ setVisibleSelection False                   switchModeE $ Insert (head evs)                   return Continue           f _ _ = NoMatch@@ -304,7 +305,7 @@             = WholeMatch $ do                  tag <- Tag . R.toText <$> withCurrentBuffer                             (regionOfSelectionB >>= readRegionB)-                 withEditor $ switchModeE Normal+                 withEditor escAction                  gotoTag tag 0 Nothing                  return Finish           f _ _ = NoMatch
tests/Generic/TestPureBufferManipulations.hs view
@@ -170,7 +170,7 @@         assertions editor _ =             let actualOut = cursorPos editor ++ "\n" ++                             extractBufferString cf editor-            in  assertEqual (errorMsg actualOut) actualOut (ktOutput t)+            in  assertEqual (errorMsg actualOut) (ktOutput t) actualOut      runTest setupActions preConditions testActions assertions cf 
+ tests/vimtests/blockvisual/c.test view
@@ -0,0 +1,14 @@+-- Input+(1,2)+foo+bar++baz+-- Output+(1,4)+f123o+b123r++b123z+-- Events+<C-v>jjjc123<Esc>
+ tests/vimtests/blockvisual/r_4.test view
@@ -0,0 +1,12 @@+-- Input+(1,1)+1234++1234+-- Output+(1,2)+1xx4++1xx4+-- Events+l<C-v>ljjrx
+ tests/vimtests/macros/repeat_last_macro.test view
@@ -0,0 +1,12 @@+-- Input+(2,2)+qwf+ars+zxc+-- Output+(2,11)+qwf+arfoofoofoos+zxc+-- Events+qaafoo<Esc>q@a@@
+ tests/vimtests/replace/12.test view
@@ -0,0 +1,8 @@+-- Input+(1,1)+foobarbaz+-- Output+(1,13)+foo123456789<+-- Events+3lR123456789<lt><Esc>
+ tests/vimtests/undo/cw.test view
@@ -0,0 +1,12 @@+-- Input+(2,1)+foo+bar+baz+-- Output+(2,1)+foo+bar+baz+-- Events+cwohai<Esc>u
yi-keymap-vim.cabal view
@@ -1,9 +1,9 @@--- This file has been generated from package.yaml by hpack version 0.17.0.+-- This file has been generated from package.yaml by hpack version 0.17.1. -- -- see: https://github.com/sol/hpack  name:           yi-keymap-vim-version:        0.14.1+version:        0.15.0 synopsis:       Vim keymap for Yi editor category:       Yi homepage:       https://github.com/yi-editor/yi#readme@@ -21,6 +21,7 @@     tests/vimtests/blockvisual/block_d.test     tests/vimtests/blockvisual/block_d_1.test     tests/vimtests/blockvisual/block_d_2.test+    tests/vimtests/blockvisual/c.test     tests/vimtests/blockvisual/capD_1.test     tests/vimtests/blockvisual/capD_2.test     tests/vimtests/blockvisual/capI.test@@ -44,6 +45,7 @@     tests/vimtests/blockvisual/r_1.test     tests/vimtests/blockvisual/r_2.test     tests/vimtests/blockvisual/r_3.test+    tests/vimtests/blockvisual/r_4.test     tests/vimtests/blockvisual/switchcase_2.test     tests/vimtests/blockvisual/u_2.test     tests/vimtests/blockvisual/y_10.test@@ -250,6 +252,7 @@     tests/vimtests/macros/7.test     tests/vimtests/macros/8.test     tests/vimtests/macros/9.test+    tests/vimtests/macros/repeat_last_macro.test     tests/vimtests/marks/unjump_backquote.test     tests/vimtests/marks/unjump_quote.test     tests/vimtests/marks/unjump_quote_blank.test@@ -340,6 +343,7 @@     tests/vimtests/replace/1.test     tests/vimtests/replace/10.test     tests/vimtests/replace/11.test+    tests/vimtests/replace/12.test     tests/vimtests/replace/2.test     tests/vimtests/replace/3.test     tests/vimtests/replace/4.test@@ -403,6 +407,7 @@     tests/vimtests/undo/7.test     tests/vimtests/undo/8.test     tests/vimtests/undo/9.test+    tests/vimtests/undo/cw.test     tests/vimtests/unicode/chinese-simp.test     tests/vimtests/unicode/chinese-trad.test     tests/vimtests/unicode/russian.test@@ -501,7 +506,6 @@     , oo-prototypes     , pointedlist     , safe-    , semigroups     , text     , transformers-base     , unordered-containers@@ -562,6 +566,7 @@   other-modules:       Yi.Keymap.Vim.Ex.Commands.BufferNew       Yi.Keymap.Vim.Ex.Commands.Stack+      Yi.Keymap.Vim.Substitution       Paths_yi_keymap_vim   default-language: Haskell2010 @@ -585,7 +590,6 @@     , oo-prototypes     , pointedlist     , safe-    , semigroups     , text     , transformers-base     , unordered-containers