Gaim/Pidgin includes a "Text replacement" plugin, which performs textual substitutions on your text as you type it --- it looks for specific strings of text, and if it finds them, it replaces them with other specific strings of text.
This turns out to actually be Turing-complete. Here's my .gaim/dict file, which contains: 1. some shortcuts for Unicode characters; 2. a simple smart-quotes algorithm (partly due to Aristotle Pagaltzis); 3. an animation of arrows bouncing back and forth, launched by the string @!@; 4. a sort of prototype input method for Runic; if you type "$runic$futhark " you will see the runes for "futhark", but I haven't implemented most of the runes, nor is it possible to backspace easily; 5. and a complete evaluator for Boolean expressions expressed in the Laws of Form notation, using (x) to represent a "cross" whose content is x. You launch it by typing ##@ followed by the expression expressed as nested parentheses; it transforms your ()'s into ⎡⎤'s. You terminate the expression entry by typing a space, and as you type further, it will reduce the expression further. The evaluator is considerably more complex than necessary because I entered it entirely through Gaim's GUI, which doesn't allow you to add "ε-productions" --- replacements that delete a string entirely --- so it represents the deletion of ⎡⎡⎤⎤ with several different contextual rules, which I think are exhaustive as long as you type a space at the end of the expression (and could be simplified!). It would be nicer if you could enter the expressions in the normal Boolean fashion with and, or, and not operators, and true and false, rather than Laws Of Form's single N-way NAND. This is possible to accomplish, but I'm too sleepy now to figure out how. I think you can just append this file onto your .gaim/dict and have it work. I should probably make a screencast, because this feature probably won't survive more than a few more versions of Gaim. COMPLETE 0 CASE 1 BAD |>>> GOOD ▷ COMPLETE 0 CASE 1 BAD " GOOD “ COMPLETE 0 CASE 1 BAD ⇇ GOOD ⇇ COMPLETE 0 CASE 1 BAD -- GOOD – COMPLETE 0 CASE 1 BAD !? GOOD ‽ COMPLETE 0 CASE 1 BAD " GOOD ” COMPLETE 0 CASE 1 BAD @!@ GOOD ⁅⇉⁆ COMPLETE 0 CASE 1 BAD $*$ GOOD ҉ COMPLETE 0 CASE 1 BAD ##@ GOOD . COMPLETE 0 CASE 1 BAD ##@( GOOD ⎡##@ COMPLETE 0 CASE 1 BAD ##@) GOOD ⎤##@ COMPLETE 0 CASE 1 BAD ⇉ GOOD ⇉ COMPLETE 0 CASE 1 BAD –- GOOD — COMPLETE 0 CASE 1 BAD ⁅⇇ GOOD ⁅⇉ COMPLETE 0 CASE 1 BAD ⇉⁆ GOOD ⇇ ⁆ COMPLETE 0 CASE 1 BAD ⎡⎤⎡⎤ GOOD ⎡⎤ COMPLETE 0 CASE 1 BAD ⎡⎡⎤⎤. GOOD . COMPLETE 0 CASE 1 BAD ⎡⎡⎤⎤⎡ GOOD ⎡ COMPLETE 0 CASE 1 BAD ⎤⎡⎡⎤⎤ GOOD ⎤ COMPLETE 0 CASE 1 BAD ⎡⎡⎡⎤⎤ GOOD ⎡ COMPLETE 0 CASE 1 BAD (1) GOOD ① COMPLETE 0 CASE 1 BAD ^2 GOOD ² COMPLETE 0 CASE 1 BAD _2 GOOD ₂ COMPLETE 0 CASE 1 BAD (2) GOOD ② COMPLETE 0 CASE 1 BAD ^3 GOOD ³ COMPLETE 0 CASE 1 BAD _3 GOOD ₃ COMPLETE 0 CASE 1 BAD (3) GOOD ③ COMPLETE 0 CASE 1 BAD $<3 GOOD ♥ COMPLETE 0 CASE 1 BAD $\<3 GOOD 愛 COMPLETE 0 CASE 1 BAD _4 GOOD ₄ COMPLETE 0 CASE 1 BAD (4) GOOD ④ COMPLETE 0 CASE 1 BAD (5) GOOD ⑤ COMPLETE 0 CASE 1 BAD $dragon$ GOOD ⿓ COMPLETE 0 CASE 1 BAD =e= GOOD € COMPLETE 0 CASE 1 BAD $runic$ GOOD COMPLETE 0 CASE 1 BAD $runic$a GOOD ᚨ$runic$ COMPLETE 0 CASE 1 BAD $runic$f GOOD ᚠ$runic$ COMPLETE 0 CASE 1 BAD $runic$k GOOD ᚴ$runic$ COMPLETE 0 CASE 1 BAD $runic$r GOOD ᚱ$runic$ COMPLETE 0 CASE 1 BAD $runic$th GOOD ᚦ$runic$ COMPLETE 0 CASE 1 BAD $runic$u GOOD ᚢ$runic$