##// END OF EJS Templates
usability and cross browser compat for completer...
usability and cross browser compat for completer - dissmiss the completer, append what alredy type, **Plus** one caracter in some cases List of special caracter that are handle are in a given list `()[]./\-+` for the moment. usefull for exaple when typing : >>> np.s<tab>in( and not having to type '(' twice. they are handle separately has the [a-zA-Z] ones because otherwise they will screw up the regexp, and are opt-in to avoid bugs with invisible caracters send because some browser have 'keypress' event for meta keys close #1080 Note to this commit : list of test for the completer across browser with --pylab=inline flag #test direct one completion plt.an<tab> -> plt.annotate #test filter,tab, only one completion plt.a<tab>n<tab> -> plt.annotate # test partial common beggining # test dismmised if user erase plt.a<tab>nn<backspace><backspace>u<tab> -> completer to `aut` ........................................<tab><tab><tab> -> nothing should append .......................................................<backspace><backspace<backspace> -> completer cancelled #test dismiss if no more completion plt.s<tab>c -> completer 3 choices ...........u -> dismissed whith what user have typed. `plt.scu` # test dismiss in no completion, special symbol # opt-in list of caracters +-/\()[]. np<tab>.s -> a 'dot' sould dismiss the completer and be appended .........<tab>in( -> np.sin( np.s<tab>in[ -> np.sin[

File last commit:

r4872:34c10438
r5635:c630b34a
Show More
thread_ex.py
50 lines | 1.7 KiB | text/x-python | PythonLexer
"""
Thread subclass that can deal with asynchronously function calls via
raise_exc.
"""
import threading
import inspect
import ctypes
def _async_raise(tid, exctype):
"""raises the exception, performs cleanup if needed"""
if not inspect.isclass(exctype):
raise TypeError("Only types can be raised (not instances)")
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
raise SystemError("PyThreadState_SetAsyncExc failed")
class ThreadEx(threading.Thread):
def _get_my_tid(self):
"""determines this (self's) thread id"""
if not self.isAlive():
raise threading.ThreadError("the thread is not active")
# do we have it cached?
if hasattr(self, "_thread_id"):
return self._thread_id
# no, look for it in the _active dict
for tid, tobj in threading._active.items():
if tobj is self:
self._thread_id = tid
return tid
raise AssertionError("could not determine the thread's id")
def raise_exc(self, exctype):
"""raises the given exception type in the context of this thread"""
_async_raise(self._get_my_tid(), exctype)
def kill(self):
"""raises SystemExit in the context of the given thread, which should
cause the thread to exit silently (unless caught)"""
self.raise_exc(SystemExit)