这里的最终目标是在qscintlla中实现基于缩进的代码折叠,类似于sublimitext3的方式。在
首先,这里有一个小例子,说明如何使用QScintilla机制手动提供折叠:
import sys
from PyQt5.Qsci import QsciScintilla
from PyQt5.Qt import *
if __name__ == '__main__':
app = QApplication(sys.argv)
view = QsciScintilla()
# http://www.scintilla.org/ScintillaDoc.html#Folding
view.setFolding(QsciScintilla.BoxedTreeFoldStyle)
lines = [
(0, "def foo():"),
(1, " x = 10"),
(1, " y = 20"),
(1, " return x+y"),
(-1, ""),
(0, "def bar(x):"),
(1, " if x > 0:"),
(2, " print('this is')"),
(2, " print('branch1')"),
(1, " else:"),
(2, " print('and this')"),
(2, " print('is branch2')"),
(-1, ""),
(-1, ""),
(-1, ""),
(-1, "print('end')"),
]
view.setText("\n".join([b for a, b in lines]))
MASK = QsciScintilla.SC_FOLDLEVELNUMBERMASK
for i, tpl in enumerate(lines):
level, line = tpl
if level >= 0:
view.SendScintilla(view.SCI_SETFOLDLEVEL, i, level | QsciScintilla.SC_FOLDLEVELHEADERFLAG)
else:
view.SendScintilla(view.SCI_SETFOLDLEVEL, i, 0)
view.show()
app.exec_()
要想更深入地了解它,你可以查阅官方文件:
参考文献:
正如我所说,我希望像Sublime一样实现代码折叠,所以我创建了一个小mcve作为基本代码来玩玩:
^{pr2}$在上面的片段中,您可以看到我试图复制一些崇高的函数。如果我的测试没有错误,indentation_level
应该提供与SublimeView提供的输出相同的输出。在
问题:您将如何修改上面的代码片段以提供类似Sublime的基于缩进的代码折叠?在
在这里,您可以看到Sublime是如何工作的:
当然,在使用multiselection(在上面的mcve中已经启用)时,一个适当的标识符也应该起作用,例如:
在Sublime中,您可以看到缩进折叠级别如何在每个文档的更改上完美/高效地更新
我的盒子设置:
我在互联网上发现了一段很有趣的代码,它很好地工作,https://github.com/pyQode/pyqode.core/blob/master/pyqode/core/api/folding.py问题是代码是用来处理QPlainTextEdit
和{QScinScintilla
小部件中工作
[删除前面的答案,因为根据最后一个问题,edit可能只有历史值;如果您仍然好奇,请参考编辑历史]
最后,优化的版本-捆绑了80千行的示例文本来展示它的性能。在
相关问题 更多 >
编程相关推荐