✑ Quills
Last updated:
Some customizations are a bit more involved (whereas others are quite basic):
Customizing Double-Click Words
When terminal text is double-clicked, Python is actually invoked to determine what the "word" should be that is highlighted! You can install your own callback routine to customize highlighting in any way you see fit.
Note that the function below is copied directly from the PyMacTerm framework, and is the default implementation. Notice that the set of characters it uses can be customized fairly easily; though you may also decide to use a different algorithm entirely.
Example:
def find_word(text_utf8, pos): """find_word(text_utf8, pos) -> (pos, count) Return a pair of integers as a tuple, where the first is a zero-based CHARACTER offset into the given string, and the second is a CHARACTER count from that offset. This range identifies a word that is found by scanning forwards and backwards from the given starting CHARACTER in the given string of BYTES. Don't use byte offsets! This is designed to be compatible with the callback format required by quills.Terminal.on_seekword_call(). (Below are REAL testcases run by doctest!) >>> find_word("this is a sentence", 0) (0, 4) >>> find_word("this is a sentence", 1) (0, 4) >>> find_word("this is a sentence", 3) (0, 4) >>> find_word("this is a sentence", 4) (4, 1) >>> find_word("this is a sentence", 5) (5, 2) >>> find_word(" well spaced words ", 17) (15, 6) >>> find_word(" well spaced words ", 13) (9, 6) """ result = [pos, 1] if pos < 0: raise ValueError("word-seeking callback expected nonnegative offset") try: ustr = unicode(text_utf8, "utf-8", "ignore") if pos >= len(ustr): raise ValueError("word-seeking callback expected offset to fall within range of characters") nonword_chars = str(string.whitespace) # an easy way to customize this is to add characters to # the string variable "nonword_chars", e.g. the following # would consider dots (.) to be word-breaking characters: # nonword_chars = nonword_chars + '.' invert = False if ustr[pos] in nonword_chars: # special case; when starting on non-word characters, look for all non-word characters invert = True i = pos j = pos while i >= 0: if (invert and ustr[i] not in nonword_chars) or \ (not invert and ustr[i] in nonword_chars): i = i + 1 break i = i - 1 if i < 0: i = 0 while j < len(ustr): if (invert and ustr[j] not in nonword_chars) or \ (not invert and ustr[j] in nonword_chars): j = j - 1 break j = j + 1 if j >= len(ustr): j = len(ustr) - 1 result[0] = i result[1] = j - i + 1 except Exception, e: print "warning, exception while trying to find words:", e return (result[0], result[1]) try: Terminal.on_seekword_call(find_word) except Exception, e: print "warning, exception while trying to register word finder for double clicks:", e