##// END OF EJS Templates
Set heading scroll manager as default scroll manager.
Set heading scroll manager as default scroll manager.

File last commit:

r17761:470b8213
r17879:7f045bdf
Show More
completion_lexer.py
79 lines | 2.7 KiB | text/x-python | PythonLexer
/ IPython / qt / console / completion_lexer.py
epatters
Initial checkin of Qt frontend code.
r2602 # System library imports
from pygments.token import Token, is_token_subtype
class CompletionLexer(object):
Bernardo B. Marques
remove all trailling spaces
r4872 """ Uses Pygments and some auxillary information to lex code snippets for
epatters
Initial checkin of Qt frontend code.
r2602 symbol contexts.
"""
# Maps Lexer names to a list of possible name separators
separator_map = { 'C' : [ '.', '->' ],
'C++' : [ '.', '->', '::' ],
'Python' : [ '.' ] }
def __init__(self, lexer):
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640 """ Create a CompletionLexer using the specified Pygments lexer.
"""
epatters
Initial checkin of Qt frontend code.
r2602 self.lexer = lexer
def get_context(self, string):
""" Assuming the cursor is at the end of the specified string, get the
context (a list of names) for the symbol at cursor position.
"""
context = []
reversed_tokens = list(self._lexer.get_tokens(string))
reversed_tokens.reverse()
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640 # Pygments often tacks on a newline when none is specified in the input.
# Remove this newline.
epatters
Initial checkin of Qt frontend code.
r2602 if reversed_tokens and reversed_tokens[0][1].endswith('\n') and \
not string.endswith('\n'):
reversed_tokens.pop(0)
Bernardo B. Marques
remove all trailling spaces
r4872
epatters
Made use of plain text consistent.
r2720 current_op = ''
epatters
Initial checkin of Qt frontend code.
r2602 for token, text in reversed_tokens:
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
if is_token_subtype(token, Token.Name):
# Handle a trailing separator, e.g 'foo.bar.'
if current_op in self._name_separators:
if not context:
epatters
Made use of plain text consistent.
r2720 context.insert(0, '')
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Handle non-separator operators and punction.
elif current_op:
break
epatters
Initial checkin of Qt frontend code.
r2602 context.insert(0, text)
epatters
Made use of plain text consistent.
r2720 current_op = ''
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Pygments doesn't understand that, e.g., '->' is a single operator
# in C++. This is why we have to build up an operator from
# potentially several tokens.
epatters
Initial checkin of Qt frontend code.
r2602 elif token is Token.Operator or token is Token.Punctuation:
Martin Bergtholdt
Fix greedy completion for qtconsole
r17761 # Handle a trailing separator, e.g 'foo.bar.'
if current_op in self._name_separators:
if not context:
context.insert(0, '')
else:
current_op = text + current_op
epatters
* Fixed bug in CompletionLexer where a context would be generated for, e.g, 'foo('....
r2640
# Break on anything that is not a Operator, Punctuation, or Name.
epatters
Initial checkin of Qt frontend code.
r2602 else:
break
return context
def get_lexer(self, lexer):
return self._lexer
def set_lexer(self, lexer, name_separators=None):
self._lexer = lexer
if name_separators is None:
self._name_separators = self.separator_map.get(lexer.name, ['.'])
else:
self._name_separators = list(name_separators)
lexer = property(get_lexer, set_lexer)
Bernardo B. Marques
remove all trailling spaces
r4872