--- a/QScintilla/Editor.py Thu Jan 18 11:10:57 2018 +0100 +++ b/QScintilla/Editor.py Thu Jan 18 18:57:40 2018 +0100 @@ -547,7 +547,8 @@ """ Public method to add a clone to our list. - @param editor reference to the cloned editor (Editor) + @param editor reference to the cloned editor + @type Editor """ self.__clones.append(editor) @@ -560,7 +561,8 @@ """ Public method to remove a clone from our list. - @param editor reference to the cloned editor (Editor) + @param editor reference to the cloned editor + @type Editor """ if editor in self.__clones: editor.editorRenamed.disconnect(self.fileRenamed) @@ -569,6 +571,17 @@ editor.encodingChanged.disconnect(self.__encodingChanged) self.__clones.remove(editor) + def isClone(self, editor): + """ + Public method to test, if the given editor is a clone. + + @param editor reference to the cloned editor + @type Editor + @return flag indicating a clone + @rtype bool + """ + return editor in self.__clones + def __bindName(self, line0): """ Private method to generate a dummy filename for binding a lexer. @@ -616,6 +629,15 @@ elif "python" in line0: bindName = "dummy.py" self.filetype = "Python2" + elif "pypy3" in line0: + bindName = "dummy.py" + self.filetype = "Python3" + elif "pypy2" in line0: + bindName = "dummy.py" + self.filetype = "Python2" + elif "pypy" in line0: + bindName = "dummy.py" + self.filetype = "Python2" elif ("/bash" in line0 or "/sh" in line0): bindName = "dummy.sh" elif "ruby" in line0: @@ -630,6 +652,28 @@ self.filetype = "D" if not bindName: + # mode line detection: -*- mode: python -*- + match = re.search(r"mode[:=]\s*([-\w_.]+)", line0) + if match: + mode = match.group(1).lower() + if mode in ["python3", "pypy3"]: + bindName = "dummy.py" + self.filetype = "Python3" + elif mode in ["python2", "pypy2", "python", "pypy"]: + bindName = "dummy.py" + self.filetype = "Python2" + elif mode == "ruby": + bindName = "dummy.rb" + self.filetype = "Ruby" + elif mode == "perl": + bindName = "dummy.pl" + elif mode == "lua": + bindName = "dummy.lua" + elif mode in ["dmd", "d"]: + bindName = "dummy.d" + self.filetype = "D" + + if not bindName: bindName = self.fileName return bindName @@ -705,10 +749,13 @@ self.menuActs["Copy"] = self.menu.addAction( UI.PixmapCache.getIcon("editCopy.png"), self.tr('Copy'), self.copy) - self.menu.addAction( + self.menuActs["Paste"] = self.menu.addAction( UI.PixmapCache.getIcon("editPaste.png"), self.tr('Paste'), self.paste) if not self.miniMenu: + self.menuActs["ExecuteSelection"] = self.menu.addAction( + self.tr("Execute Selection In Console"), + self.__executeSelection) self.menu.addSeparator() self.menu.addAction( UI.PixmapCache.getIcon("editIndent.png"), @@ -734,7 +781,9 @@ self.menu.addAction(self.tr('Select all'), self.__selectAll) self.menu.addAction( self.tr('Deselect all'), self.__deselectAll) - self.menu.addSeparator() + else: + self.menuActs["ExecuteSelection"] = None + self.menu.addSeparator() self.menuActs["SpellCheck"] = self.menu.addAction( UI.PixmapCache.getIcon("spellchecking.png"), self.tr('Check spelling...'), self.checkSpelling) @@ -1182,7 +1231,7 @@ self.tr('Previous change'), self.previousChange) self.marginMenuActs["ClearChangeMarkers"] = \ self.indicMarginMenu.addAction( - self.tr('Clear changes'), self.__deleteAllChangeMarkers) + self.tr('Clear changes'), self.__reinitOnlineChangeTrace) self.indicMarginMenu.aboutToShow.connect(self.__showContextMenuMargin) @@ -1253,7 +1302,7 @@ self.tr('Previous change'), self.previousChange) self.marginMenuActs["ClearChangeMarkers"] = \ self.marginMenu.addAction( - self.tr('Clear changes'), self.__deleteAllChangeMarkers) + self.tr('Clear changes'), self.__reinitOnlineChangeTrace) self.marginMenu.addSeparator() self.marginMenuActs["LMBbookmarks"] = self.marginMenu.addAction( self.tr('LMB toggles bookmarks'), self.__lmBbookmarks) @@ -5126,9 +5175,12 @@ self.menuActs["Undo"].setEnabled(self.isUndoAvailable()) self.menuActs["Redo"].setEnabled(self.isRedoAvailable()) self.menuActs["Revert"].setEnabled(self.isModified()) - if not self.miniMenu: - self.menuActs["Cut"].setEnabled(self.hasSelectedText()) - self.menuActs["Copy"].setEnabled(self.hasSelectedText()) + self.menuActs["Cut"].setEnabled(self.hasSelectedText()) + self.menuActs["Copy"].setEnabled(self.hasSelectedText()) + if self.menuActs["ExecuteSelection"] is not None: + self.menuActs["ExecuteSelection"].setEnabled( + self.hasSelectedText()) + self.menuActs["Paste"].setEnabled(self.canPaste()) if not self.isResourcesFile: if self.fileName and self.isPyFile(): self.menuActs["Show"].setEnabled(True) @@ -6675,7 +6727,7 @@ if evt.modifiers() & Qt.ControlModifier: if delta < 0: self.zoomOut() - else: + elif delta > 0: self.zoomIn() evt.accept() return @@ -6683,7 +6735,7 @@ if evt.modifiers() & Qt.ShiftModifier: if delta < 0: self.gotoMethodClass(False) - else: + elif delta > 0: self.gotoMethodClass(True) evt.accept() return @@ -7136,7 +7188,7 @@ self.completer.setEnabled(False) ####################################################################### - ## Autocompleting templates + ## Auto-completing templates ####################################################################### def editorCommand(self, cmd): @@ -7957,3 +8009,10 @@ keys.append(key) for key in keys: del self.__mouseClickHandlers[key] + + def __executeSelection(self): + """ + Private slot to execute the selected text in the shell window. + """ + txt = self.selectedText() + e5App().getObject("Shell").executeLines(txt)