def onAutocomplete(self, args): '''Check if auto complete data can be added and displayed: "." after objects: show auto completion list with properties and methods "[" after dict: show auto completion list with keys "(" after functions: insert template and display a call tip with the doc string.''' if args['ch'] == 46 and args['code'] == 2001: # character "." iPos = editor.getCurrentPos() autoCompleteList = self.interp.autoCompleteObject( self.getUncompleteLine(iPos)) if autoCompleteList is None: return if autoCompleteList: editor.autoCSetSeparator(ord('\t')) editor.autoCSetIgnoreCase(False) editor.autoCSetCaseInsensitiveBehaviour(False) editor.autoCSetOrder(2) editor.autoCSetDropRestOfWord(True) editor.autoCShow(0, autoCompleteList) elif args['ch'] == 40 and args['code'] == 2001: # character "(" iPos = editor.getCurrentPos() r = self.interp.autoCompleteFunction(self.getUncompleteLine(iPos)) if r is None: return n, funcParam, callTip = r if callTip: editor.callTipShow(max(0, iPos - n), callTip) editor.callTipSetHlt(0, max(0, callTip.find('\n'))) self.activeCalltip = 'doc' if funcParam and iPos == editor.getCurrentPos(): editor.insertText(iPos, funcParam + ')') editor.setSelectionStart(iPos) editor.setSelectionStart(iPos + len(funcParam) + 1) editor.setCurrentPos(iPos) elif args['ch'] == 91 and args['code'] == 2001: # character "[" iPos = editor.getCurrentPos() autoCompleteList = self.interp.autoCompleteDict( self.getUncompleteLine(iPos)) if autoCompleteList: editor.autoCSetSeparator(ord('\t')) editor.autoCSetIgnoreCase(False) editor.autoCSetCaseInsensitiveBehaviour(False) editor.autoCSetOrder(0) editor.autoCSetDropRestOfWord(True) editor.autoCShow(0, autoCompleteList)
def __init__(self, externalPython=None, matplotlib_eventHandler=True, cellHighlight=True, popupForUnselectedVariable=True, popupForSelectedExpression=False, mouseDwellTime=200): '''Initializes PyPadPlusPlus to prepare Notepad++ for interactive Python development''' console.show() editor.grabFocus() self.windowHandle = windll.user32.GetForegroundWindow() sys.stdout = PseudoFileOut(Npp.console.write) sys.stderr = PseudoFileOut(Npp.console.writeError) sys.stdout.outp = PseudoFileOut(Npp.console.write) self.matplotlib_eventHandler = matplotlib_eventHandler self.matplotlib_enabled = False self.popupForUnselectedVariable = popupForUnselectedVariable self.popupForSelectedExpression = popupForSelectedExpression self.mouseDwellTime = mouseDwellTime self.externalPython = bool(externalPython) if self.externalPython: from . import pyPadHost self.interp = pyPadHost.interpreter(externalPython, outBuffer=self.outBuffer) else: from . import pyPadClient self.interp = pyPadClient.interpreter() if cellHighlight: self.lexer = EnhancedPythonLexer() self.lexer.main() else: self.lexer = None self.thread = None self.threadMarker = None self.bufferActive = 1 self.delayedMarker = False self.activeCalltip = None editor.setTargetStart(0) self.specialMarkers = None self.bufferMarkerAction = {} self.lastActiveBufferID = -1 # Marker self.markerWidth = 3 editor.setMarginWidthN(3, self.markerWidth) editor.setMarginMaskN(3, (256 + 128 + 64) * (1 + 2**3 + 2**6)) self.markers = {} self.m_active, self.m_error, self.m_finish = [ 6 + 3 * i for i in [0, 1, 2] ] self.preCalculateMarkers() for iMarker in self.m_active, self.m_error, self.m_finish: self.drawMarker(iMarker) self.setCallbacks() editor.callTipSetBack((255, 255, 225)) editor.autoCSetSeparator(ord('\t')) editor.autoCSetIgnoreCase(False) editor.autoCSetCaseInsensitiveBehaviour(False) editor.autoCSetCancelAtStart(False) editor.autoCSetDropRestOfWord(False) console.clear() console.editor.setReadOnly(0) self.tTimerFlush = 0.15 self.tTimerMiddleButton = 0.1 self.middleButton = 0 self.bufferActive = 0 self.onTimerFlush( ) # start periodic timer to check output of subprocess self.onTimerMiddleButton( ) # start periodic timer to check state of middleButton
def showCalltip(self, pos=None): iStart = editor.getSelectionStart() iEnd = editor.getSelectionEnd() if pos is None: pos = editor.getCurrentPos() CT_unselected = True CT_expression = True else: CT_unselected = self.popupForUnselectedVariable CT_expression = self.popupForSelectedExpression if iEnd != iStart and iStart <= pos <= iEnd: if CT_expression and iEnd - iStart > 1: expression = editor.getTextRange(iStart, iEnd) if expression == 'False': self.activeCalltip = False editor.callTipShow(iStart, 'set to True') elif expression == 'True': self.activeCalltip = True editor.callTipShow(iStart, 'set to False') elif not '\n' in expression: ret = self.interp.getCallTip(None, expression) if ret and (CT_unselected or ret[-1] != 'value error'): element, nHighlight, calltip = ret self.activeCalltip = 'doc' editor.callTipShow(iStart, ''.join(calltip)) editor.callTipSetHlt(0, int(nHighlight)) else: iLineStart = editor.positionFromLine( editor.lineFromPosition(iStart)) var = editor.getTextRange(iStart, iEnd) line = editor.getTextRange(iLineStart, iEnd) if var == '.': autoCompleteList = self.interp.autoCompleteObject( self.getUncompleteLine(iStart + 1)) if autoCompleteList: editor.autoCSetSeparator(ord('\t')) editor.autoCSetIgnoreCase(False) editor.autoCSetCaseInsensitiveBehaviour(False) editor.autoCSetOrder(0) editor.autoCSetDropRestOfWord(True) editor.autoCShow(0, autoCompleteList) else: ret = self.interp.getCallTip(line, var) if ret: element, nHighlight, calltip = ret if element == var == 'False': self.activeCalltip = False editor.callTipShow(iStart, 'set to True') elif element == var == 'True': self.activeCalltip = True editor.callTipShow(iStart, 'set to False') elif ret[-1] != 'value error': self.activeCalltip = 'doc' editor.callTipShow(iStart, ''.join(calltip)) editor.callTipSetHlt(0, int(nHighlight)) elif CT_unselected and iStart == iEnd and pos >= 0: iLine = editor.lineFromPosition(pos) line = editor.getLine(iLine) iLineStart = editor.positionFromLine(iLine) posInLine = pos - iLineStart iWordEnd = 0 for iWordStart in range(posInLine, -1, -1): s = line[iWordStart] if not ('a' <= s <= 'z' or 'A' <= s <= 'Z' or '0' <= s <= '9' or s == '_'): iWordStart += 1 break if iWordStart <= posInLine: for iWordEnd in range(posInLine + 1, len(line)): s = line[iWordEnd] if not ('a' <= s <= 'z' or 'A' <= s <= 'Z' or '0' <= s <= '9' or s == '_'): iWordEnd -= 1 break var = line[iWordStart:iWordEnd + 1] if var: var = line[iWordStart:iWordEnd + 1] ret = self.interp.getCallTip(line[0:iWordEnd + 1], var) pos = iLineStart + iWordStart if ret: element, nHighlight, calltip = ret if calltip != 'value error': self.activeCalltip = 'doc' editor.callTipShow(pos, ''.join(calltip)) editor.callTipSetHlt(0, int(nHighlight))
def onMouseDwell(self, args): '''Show a call tip window about the current content of a selected variable''' if self.bufferBusy or self.interp.kernelBusy.isSet(): return if editor.callTipActive(): return p = editor.positionFromPoint(args['x'], args['y']) iStart = editor.getSelectionStart() iEnd = editor.getSelectionEnd() if iEnd != iStart and iStart <= p <= iEnd: if self.popupForSelectedExpression and iEnd - iStart > 1: expression = editor.getTextRange(iStart, iEnd) if expression == 'False': self.activeCalltip = False editor.callTipShow(iStart, 'set to True') elif expression == 'True': self.activeCalltip = True editor.callTipShow(iStart, 'set to False') elif not '\n' in expression: ret = self.interp.getCallTip(None, expression) if ret: element, nHighlight, calltip = ret self.activeCalltip = 'doc' editor.callTipShow(iStart, ''.join(calltip)) editor.callTipSetHlt(0, int(nHighlight)) else: iLineStart = editor.positionFromLine( editor.lineFromPosition(iStart)) var = editor.getTextRange(iStart, iEnd) line = editor.getTextRange(iLineStart, iEnd) if var == '.': autoCompleteList = self.interp.autoCompleteObject( self.getUncompleteLine(iStart + 1)) if autoCompleteList: editor.autoCSetSeparator(ord('\t')) editor.autoCSetIgnoreCase(False) editor.autoCSetCaseInsensitiveBehaviour(False) editor.autoCSetOrder(0) editor.autoCSetDropRestOfWord(True) editor.autoCShow(0, autoCompleteList) else: ret = self.interp.getCallTip(line, var) if ret: element, nHighlight, calltip = ret if element == var == 'False': self.activeCalltip = False editor.callTipShow(iStart, 'set to True') elif element == var == 'True': self.activeCalltip = True editor.callTipShow(iStart, 'set to False') else: self.activeCalltip = 'doc' editor.callTipShow(iStart, ''.join(calltip)) editor.callTipSetHlt(0, int(nHighlight)) elif self.popupForUnselectedVariable and iStart == iEnd and p >= 0: iLine = editor.lineFromPosition(p) line = editor.getLine(iLine) iLineStart = editor.positionFromLine(iLine) posInLine = p - iLineStart iWordEnd = 0 for iWordStart in range(posInLine, -1, -1): s = line[iWordStart] if not ('a' <= s <= 'z' or 'A' <= s <= 'Z' or '0' <= s <= '9' or s == '_'): iWordStart += 1 break if iWordStart <= posInLine: for iWordEnd in range(posInLine + 1, len(line)): s = line[iWordEnd] if not ('a' <= s <= 'z' or 'A' <= s <= 'Z' or '0' <= s <= '9' or s == '_'): iWordEnd -= 1 break var = line[iWordStart:iWordEnd + 1] if var: var = line[iWordStart:iWordEnd + 1] ret = self.interp.getCallTip(line[0:iWordEnd + 1], var) pos = iLineStart + iWordStart if ret: element, nHighlight, calltip = ret self.activeCalltip = 'doc' editor.callTipShow(pos, ''.join(calltip)) editor.callTipSetHlt(0, int(nHighlight))