; ; Copyright: (c) 2013 Sam Hocevar ; This program is free software; you can redistribute it and/or ; modify it under the terms of the Do What The Fuck You Want To ; Public License, Version 2, as published by the WTFPL Task Force. ; See http://www.wtfpl.net/ for more details. #SingleInstance force #EscapeChar \ #Persistent #NoEnv ; Compose Key: one of RAlt, LAlt, LControl, RControl, RWin, LWin, Esc, Insert, Numlock, Tab compose_key = RAlt ; Reset Delay: milliseconds until reset reset_delay := 5000 ; All the compose sequences add_sequence(" ", "{ASC 0160}") add_sequence("!!", "¡") add_sequence("|c", "¢") add_sequence("c|", "¢") add_sequence("c/", "¢") add_sequence("/c", "¢") add_sequence("L-", "£") add_sequence("-L", "£") add_sequence("ox", "¤") add_sequence("xo", "¤") add_sequence("Y=", "¥") add_sequence("=Y", "¥") add_sequence("!\^", "¦") add_sequence("so", "§") add_sequence("os", "§") add_sequence("oc", "©") add_sequence("oC", "©") add_sequence("Oc", "©") add_sequence("OC", "©") add_sequence("\^_", "ª") add_sequence("<<", "«") add_sequence("\,-", "¬") add_sequence("-\,", "¬") add_sequence("or", "®") add_sequence("oR", "®") add_sequence("Or", "®") add_sequence("OR", "®") add_sequence("oo", "°") add_sequence("\+-", "±") add_sequence("\^2", "²") add_sequence(".2", "²") add_sequence("\^3", "³") add_sequence(".3", "³") add_sequence("mu", "µ") add_sequence("p!", "¶") add_sequence("P!", "¶") add_sequence("PP", "¶") add_sequence("..", "·") add_sequence("\, ", "¸") add_sequence(" \,", "¸") add_sequence("\^1", "¹") add_sequence(".1", "¹") add_sequence(".o", "º") add_sequence(">>", "»") add_sequence("14", "¼") add_sequence("12", "½") add_sequence("34", "¾") add_sequence("??", "¿") add_sequence("\`A", "À") add_sequence("'A", "Á") add_sequence("\^A", "Â") add_sequence("~A", "Ã") add_sequence("""A", "Ä") add_sequence("oA", "Å") add_sequence("AE", "Æ") add_sequence("\,C", "Ç") add_sequence("\`E", "È") add_sequence("'E", "É") add_sequence("\^E", "Ê") add_sequence("""E", "Ë") add_sequence("\`I", "Ì") add_sequence("'I", "Í") add_sequence("\^I", "Î") add_sequence("""I", "Ï") add_sequence("DH", "Ð") add_sequence("~N", "Ñ") add_sequence("\`O", "Ò") add_sequence("'O", "Ó") add_sequence("\^O", "Ô") add_sequence("~O", "Õ") add_sequence("""O", "Ö") add_sequence("xx", "×") add_sequence("/O", "Ø") add_sequence("\`U", "Ù") add_sequence("'U", "Ú") add_sequence("\^U", "Û") add_sequence("""U", "Ü") add_sequence("'Y", "Ý") add_sequence("TH", "Þ") add_sequence("ss", "ß") add_sequence("\`a", "à") add_sequence("'a", "á") add_sequence("\^a", "â") add_sequence("~a", "ã") add_sequence("""a", "ä") add_sequence("oa", "å") add_sequence("ae", "æ") add_sequence("\,c", "ç") add_sequence("\`e", "è") add_sequence("'e", "é") add_sequence("\^e", "ê") add_sequence("""e", "ë") add_sequence("\`i", "ì") add_sequence("'i", "í") add_sequence("\^i", "î") add_sequence("""i", "ï") add_sequence("dh", "ð") add_sequence("~n", "ñ") add_sequence("\`o", "ò") add_sequence("'o", "ó") add_sequence("\^o", "ô") add_sequence("~o", "õ") add_sequence("""o", "ö") add_sequence("\:\-", "÷") add_sequence("-""", "÷") add_sequence("/o", "ø") add_sequence("\`u", "ù") add_sequence("'u", "ú") add_sequence("\^u", "û") add_sequence("""u", "ü") add_sequence("'y", "ý") add_sequence("th", "þ") add_sequence("""y", "ÿ") add_sequence("_A", "Ā") add_sequence("_a", "ā") add_sequence("UA", "Ă") add_sequence("bA", "Ă") add_sequence("Ua", "ă") add_sequence("ba", "ă") add_sequence("\;A", "Ą") add_sequence("\;a", "ą") add_sequence("'C", "Ć") add_sequence("'c", "ć") add_sequence("\^C", "Ĉ") add_sequence("^c", "ĉ") add_sequence("cC", "Č") add_sequence("cc", "č") add_sequence("cD", "Ď") add_sequence("cd", "ď") add_sequence("-D", "Đ") add_sequence("/D", "Đ") add_sequence("-d", "đ") add_sequence("/d", "đ") add_sequence("_E", "Ē") add_sequence("_e", "ē") add_sequence("UE", "Ĕ") add_sequence("bE", "Ĕ") add_sequence("Ue", "ĕ") add_sequence("be", "ĕ") add_sequence(";E", "Ę") add_sequence(";e", "ę") add_sequence("cE", "Ě") add_sequence("ce", "ě") add_sequence("\^G", "Ĝ") add_sequence("\^g", "ĝ") add_sequence("UG", "Ğ") add_sequence("bG", "Ğ") add_sequence("Ug", "ğ") add_sequence("bg", "ğ") add_sequence("\,G", "Ģ") add_sequence("\,g", "ģ") add_sequence("\^H", "Ĥ") add_sequence("\^h", "ĥ") add_sequence("/H", "Ħ") add_sequence("/h", "ħ") add_sequence("~I", "Ĩ") add_sequence("~i", "ĩ") add_sequence("_I", "Ī") add_sequence("_i", "ī") add_sequence("UI", "Ĭ") add_sequence("bI", "Ĭ") add_sequence("Ui", "ĭ") add_sequence("bi", "ĭ") add_sequence("\;I", "Į") add_sequence("\;i", "į") add_sequence("i.", "ı") add_sequence("\^J", "Ĵ") add_sequence("\^j", "ĵ") add_sequence("\,K", "Ķ") add_sequence("\,k", "ķ") add_sequence("kk", "ĸ") add_sequence("'L", "Ĺ") add_sequence("'l", "ĺ") add_sequence("\,L", "Ļ") add_sequence("\,l", "ļ") add_sequence("cL", "Ľ") add_sequence("cl", "ľ") add_sequence("/L", "Ł") add_sequence("/l", "ł") add_sequence("'N", "Ń") add_sequence("'n", "ń") add_sequence("\,N", "Ņ") add_sequence("\,n", "ņ") add_sequence("cN", "Ň") add_sequence("cn", "ň") add_sequence("NG", "Ŋ") add_sequence("ng", "ŋ") add_sequence("_O", "Ō") add_sequence("_o", "ō") add_sequence("UO", "Ŏ") add_sequence("BO", "Ŏ") add_sequence("uo", "ŏ") add_sequence("bo", "ŏ") add_sequence("=O", "Ő") add_sequence("=o", "ő") add_sequence("OE", "Œ") add_sequence("oe", "œ") add_sequence("'R", "Ŕ") add_sequence("'r", "ŕ") add_sequence("\,R", "Ŗ") add_sequence("\,r", "ŗ") add_sequence("cR", "Ř") add_sequence("cr", "ř") add_sequence("'S", "Ś") add_sequence("'s", "ś") add_sequence("\^S", "Ŝ") add_sequence("\^s", "ŝ") add_sequence("\,S", "Ş") add_sequence("\,s", "ş") add_sequence("cS", "Š") add_sequence("cs", "š") add_sequence("\,T", "Ţ") add_sequence("\,t", "ţ") add_sequence("cT", "Ť") add_sequence("ct", "ť") add_sequence("/T", "Ŧ") add_sequence("/t", "ŧ") add_sequence("~U", "Ũ") add_sequence("~u", "ũ") add_sequence("_U", "Ū") add_sequence("_u", "ū") add_sequence("UU", "Ŭ") add_sequence("bU", "Ŭ") add_sequence("Uu", "ŭ") add_sequence("""b", "ŭ") add_sequence("oU", "Ů") add_sequence("ou", "ů") add_sequence("=U", "Ű") add_sequence("=u", "ű") add_sequence("\;U", "Ų") add_sequence("\;u", "ų") add_sequence("\^W", "Ŵ") add_sequence("\^w", "ŵ") add_sequence("\^Y", "Ŷ") add_sequence("\^y", "ŷ") add_sequence("""Y", "Ÿ") add_sequence("'Z", "Ź") add_sequence("'z", "ź") add_sequence("cZ", "Ž") add_sequence("cz", "ž") add_sequence("fs", "ſ") add_sequence("/b", "ƀ") add_sequence("/I", "Ɨ") add_sequence("/Z", "Ƶ") add_sequence("/z", "ƶ") add_sequence("cA", "Ǎ") add_sequence("ca", "ǎ") add_sequence("cI", "Ǐ") add_sequence("ci", "ǐ") add_sequence("cO", "Ǒ") add_sequence("co", "ǒ") add_sequence("cU", "Ǔ") add_sequence("cu", "ǔ") add_sequence("/G", "Ǥ") add_sequence("/g", "ǥ") add_sequence("cG", "Ǧ") add_sequence("cg", "ǧ") add_sequence("cK", "Ǩ") add_sequence("ck", "ǩ") add_sequence("\;O", "Ǫ") add_sequence("\;o", "ǫ") add_sequence("cj", "ǰ") add_sequence("'G", "Ǵ") add_sequence("'g", "ǵ") add_sequence("\`N", "Ǹ") add_sequence("\`n", "ǹ") add_sequence("cH", "Ȟ") add_sequence("ch", "ȟ") add_sequence("\,E", "Ȩ") add_sequence("\,e", "ȩ") add_sequence("_Y", "Ȳ") add_sequence("_y", "ȳ") add_sequence("ee", "ə") add_sequence("/i", "ɨ") add_sequence("\,D", "Ḑ") add_sequence("\,d", "ḑ") add_sequence("_G", "Ḡ") add_sequence("_g", "ḡ") add_sequence("""H", "Ḧ") add_sequence("""h", "ḧ") add_sequence("\,H", "Ḩ") add_sequence("\,h", "ḩ") add_sequence("'K", "Ḱ") add_sequence("'k", "ḱ") add_sequence("'M", "Ḿ") add_sequence("'m", "ḿ") add_sequence("'P", "Ṕ") add_sequence("'p", "ṕ") add_sequence("~V", "Ṽ") add_sequence("~v", "ṽ") add_sequence("\`W", "Ẁ") add_sequence("\`w", "ẁ") add_sequence("'W", "Ẃ") add_sequence("'w", "ẃ") add_sequence("""W", "Ẅ") add_sequence("""w", "ẅ") add_sequence("""X", "Ẍ") add_sequence("""x", "ẍ") add_sequence("\^Z", "Ẑ") add_sequence("\^z", "ẑ") add_sequence("""t", "ẗ") add_sequence("ow", "ẘ") add_sequence("oy", "ẙ") add_sequence("~E", "Ẽ") add_sequence("~e", "ẽ") add_sequence("\`Y", "Ỳ") add_sequence("\`y", "ỳ") add_sequence("~Y", "Ỹ") add_sequence("~y", "ỹ") add_sequence(" .", " ") add_sequence("--", "–") add_sequence("-2", "–") add_sequence("2-", "–") add_sequence("-3", "—") add_sequence("3-", "—") add_sequence("<'", "‘") add_sequence("'<", "‘") add_sequence(">'", "’") add_sequence("'>", "’") add_sequence("\,'", "‚") add_sequence("'\,", "‚") add_sequence("<""", "“") add_sequence("""<", "“") add_sequence(">""", "”") add_sequence(""">", "”") add_sequence("\,""", "„") add_sequence("""\,", "„") add_sequence("\%o", "‰") add_sequence(".<", "‹") add_sequence(".>", "›") add_sequence("\^0", "⁰") add_sequence(".0", "⁰") add_sequence("\^i", "ⁱ") add_sequence("\^4", "⁴") add_sequence("\^5", "⁵") add_sequence("\^6", "⁶") add_sequence("\^7", "⁷") add_sequence("\^8", "⁸") add_sequence("\^9", "⁹") add_sequence("\^+", "⁺") add_sequence("\^=", "⁼") add_sequence("\^(", "⁽") add_sequence("\^)", "⁾") add_sequence("\^n", "ⁿ") add_sequence("_0", "₀") add_sequence("_1", "₁") add_sequence("_2", "₂") add_sequence("_3", "₃") add_sequence("_4", "₄") add_sequence("_5", "₅") add_sequence("_6", "₆") add_sequence("_7", "₇") add_sequence("_8", "₈") add_sequence("_9", "₉") add_sequence("_+", "₊") add_sequence("_=", "₌") add_sequence("_(", "₍") add_sequence("_)", "₎") add_sequence("CE", "₠") add_sequence("C/", "₡") add_sequence("/C", "₡") add_sequence("Cr", "₢") add_sequence("Fr", "₣") add_sequence("L=", "₤") add_sequence("=L", "₤") add_sequence("m/", "₥") add_sequence("/m", "₥") add_sequence("N=", "₦") add_sequence("=N", "₦") add_sequence("Pt", "₧") add_sequence("Rs", "₨") add_sequence("W=", "₩") add_sequence("=W", "₩") add_sequence("d-", "₫") add_sequence("C=", "€") add_sequence("=C", "€") add_sequence("c=", "€") add_sequence("=c", "€") add_sequence("E=", "€") add_sequence("=E", "€") add_sequence("\^S", "℠") add_sequence("\^T", "™") add_sequence("""\\", "〝") add_sequence("""/", "〞") add_sequence("<-", "←") add_sequence("->", "→") add_sequence("<=", "⇐") add_sequence("=>", "⇒") add_sequence("<>", "⇔") add_sequence("+>", "➨") add_sequence("L_", "└") add_sequence("L>", "↳") add_sequence("\\/", "✔") add_sequence("**", "✻") ; Build the menu Menu, Tray, Click, 1 Menu, Tray, NoStandard Menu, Tray, Add, &Disable, ToggleCallback Menu, Tray, Add, &Restart, RestartCallback Menu, Tray, Add Menu, Tray, Add, &About, AboutCallback Menu, Tray, Add, E&xit, ExitCallback Menu, Tray, Icon, compose.ico ; Workaround for an AHK bug that prevents "::`:::" from working in hotstrings HotKey, $:, workaround_hotkey ; Activate the compose key for real #Hotstring ? * c b0 Hotkey, %compose_key%, ComposeCallback ; End of initialisation return workaround_hotkey: send_char(substr(A_ThisHotKey, strlen(A_ThisHotKey))) return send_char(char) { global reset_delay static sequence := "" static compose := false static active := true if (!compose) sequence := "" if (!active) { send_raw(char) compose := false return } if (char = "compose") { ;TrayTip, Compose Key, character: [ %char% ] sequence: [ %sequence% ], 10, 1 compose := !compose if (compose) SetTimer, ResetCallback, %reset_delay% return } sequence .= char ;TrayTip, Compose Key, character: [ %char% ] sequence: [ %sequence% ], 10, 1 if (!compose) { send_raw(sequence) return } if (has_sequence(sequence)) { tmp := get_sequence(sequence) Send %tmp% compose := false } else if (!has_prefix(sequence)) { ;TrayTip, Compose Key, Disabling Dead End Sequence [ %sequence% ], 10, 1 send_raw(sequence) compose := false } return ResetCallback: send_raw(sequence) compose := false SetTimer, ResetCallback, Off return ToggleCallback: active := !active if (active) { Menu, Tray, Uncheck, &Disable Menu, Tray, Icon, compose.ico } else { Menu, Tray, Check, &Disable Menu, Tray, Icon, compose2.ico } return } send_raw(string) { Loop, parse, string { if (A_LoopField = " ") Send {Space} else SendRaw %A_LoopField% } } ; We need to encode our strings somehow because AutoHotKey objects ; have case-insensitive hash tables. How retarded is that? to_hex(str) { hex = "" loop, parse, str hex .= asc(A_LoopField) return hex } add_sequence(key, val) { global s, p if (!s) { s := {} p := {} } s.insert(to_hex(key), val) loop % strlen(key) p.insert(to_hex(substr(key, 1, A_Index)), true) } has_sequence(key) { global s return s.HasKey(to_hex(key)) } get_sequence(key) { global s return s[to_hex(key)] } has_prefix(key) { global p return p.HasKey(to_hex(key)) } ComposeCallback: send_char("compose") return RestartCallback: Reload return AboutCallback: MsgBox, 64, Compose Key, Compose Key\nby Sam Hocevar return ExitCallback: ExitApp return ; Activate hotstrings for all ASCII characters that may ; be used in a compose sequence; these hotstrings just feed ; the character to the underlying engine. #Hotstring ? * c b :: :: send_char(" ") return ::!:: send_char("!") return ::":: send_char("""") return ::#:: send_char("#") return ::$:: send_char("$") return ::%:: send_char("%") return ::&:: send_char("&") return ::':: send_char("'") return ::(:: send_char("(") return ::):: send_char(")") return ::\*:: send_char("*") return ::+:: send_char("+") return ::,:: send_char(",") return ::-:: send_char("-") return ::.:: send_char(".") return ::/:: send_char("/") return ::0:: send_char("0") return ::1:: send_char("1") return ::2:: send_char("2") return ::3:: send_char("3") return ::4:: send_char("4") return ::5:: send_char("5") return ::6:: send_char("6") return ::7:: send_char("7") return ::8:: send_char("8") return ::9:: send_char("9") return ; XXX: disabled on purpose because AHK can't parse this ;::::: ;send_char(":") ;return ::;:: send_char(";") return ::<:: send_char("<") return ::=:: send_char("=") return ::>:: send_char(">") return ::?:: send_char("?") return ::@:: send_char("@") return ::A:: send_char("A") return ::B:: send_char("B") return ::C:: send_char("C") return ::D:: send_char("D") return ::E:: send_char("E") return ::F:: send_char("F") return ::G:: send_char("G") return ::H:: send_char("H") return ::I:: send_char("I") return ::J:: send_char("J") return ::K:: send_char("K") return ::L:: send_char("L") return ::M:: send_char("M") return ::N:: send_char("N") return ::O:: send_char("O") return ::P:: send_char("P") return ::Q:: send_char("Q") return ::R:: send_char("R") return ::S:: send_char("S") return ::T:: send_char("T") return ::U:: send_char("U") return ::V:: send_char("V") return ::W:: send_char("W") return ::X:: send_char("X") return ::Y:: send_char("Y") return ::Z:: send_char("Z") return ::[:: send_char("[") return ::\\:: send_char("\\") return ::]:: send_char("]") return ::^:: send_char("^") return ::_:: send_char("_") return ::\`:: send_char("\`") return ::a:: send_char("a") return ::b:: send_char("b") return ::c:: send_char("c") return ::d:: send_char("d") return ::e:: send_char("e") return ::f:: send_char("f") return ::g:: send_char("g") return ::h:: send_char("h") return ::i:: send_char("i") return ::j:: send_char("j") return ::k:: send_char("k") return ::l:: send_char("l") return ::m:: send_char("m") return ::n:: send_char("n") return ::o:: send_char("o") return ::p:: send_char("p") return ::q:: send_char("q") return ::r:: send_char("r") return ::s:: send_char("s") return ::t:: send_char("t") return ::u:: send_char("u") return ::v:: send_char("v") return ::w:: send_char("w") return ::x:: send_char("x") return ::y:: send_char("y") return ::z:: send_char("z") return ::{:: send_char("{") return ::|:: send_char("|") return ::}:: send_char("}") return ::~:: send_char("~") return