使用 QScintilla 进行多光标编辑
Multi-Cursor editing with QScintilla
我想创建一个像 SublimeText 一样支持多光标编辑的 QScintilla 小部件。据我所知,Scintilla 已经支持多个游标,但我还没有看到任何示例。
所以,有人可以 post 一个显示 QScintilla 多游标基础知识的小例子吗?
多光标功能在 Scintilla 中可用,但 QScintilla 不提供此功能的直接包装器。但是,您可以 "reimplement" 您的包装器,因为几乎所有事情都可以使用 SendScintilla
方法完成。
from PyQt5.Qsci import QsciScintilla
from PyQt5.QtWidgets import QApplication
app = QApplication([])
ed = QsciScintilla()
ed.setText('insert <-\nsome <-\ntext <-\n')
ed.show()
# typing should insert in all selections at the same time
ed.SendScintilla(ed.SCI_SETADDITIONALSELECTIONTYPING, 1)
# do multiple selections
offset = ed.positionFromLineIndex(0, 7) # line-index to offset
ed.SendScintilla(ed.SCI_SETSELECTION, offset, offset)
# using the same offset twice selects no characters, hence a cursor
offset = ed.positionFromLineIndex(1, 5)
ed.SendScintilla(ed.SCI_ADDSELECTION, offset, offset)
offset = ed.positionFromLineIndex(2, 5)
ed.SendScintilla(ed.SCI_ADDSELECTION, offset, offset)
app.exec_()
您应该将 SendScintilla
调用包装在您自己的包装器中。
请记住,offset
以字节表示,因此取决于文本的编码,这或多或少被 QScintilla 的 QString 隐藏了。另一方面,"line-index" 以字符表示(如果使用 unicode,则为代码点),因此更可靠。
我想创建一个像 SublimeText 一样支持多光标编辑的 QScintilla 小部件。据我所知,Scintilla 已经支持多个游标,但我还没有看到任何示例。
所以,有人可以 post 一个显示 QScintilla 多游标基础知识的小例子吗?
多光标功能在 Scintilla 中可用,但 QScintilla 不提供此功能的直接包装器。但是,您可以 "reimplement" 您的包装器,因为几乎所有事情都可以使用 SendScintilla
方法完成。
from PyQt5.Qsci import QsciScintilla
from PyQt5.QtWidgets import QApplication
app = QApplication([])
ed = QsciScintilla()
ed.setText('insert <-\nsome <-\ntext <-\n')
ed.show()
# typing should insert in all selections at the same time
ed.SendScintilla(ed.SCI_SETADDITIONALSELECTIONTYPING, 1)
# do multiple selections
offset = ed.positionFromLineIndex(0, 7) # line-index to offset
ed.SendScintilla(ed.SCI_SETSELECTION, offset, offset)
# using the same offset twice selects no characters, hence a cursor
offset = ed.positionFromLineIndex(1, 5)
ed.SendScintilla(ed.SCI_ADDSELECTION, offset, offset)
offset = ed.positionFromLineIndex(2, 5)
ed.SendScintilla(ed.SCI_ADDSELECTION, offset, offset)
app.exec_()
您应该将 SendScintilla
调用包装在您自己的包装器中。
请记住,offset
以字节表示,因此取决于文本的编码,这或多或少被 QScintilla 的 QString 隐藏了。另一方面,"line-index" 以字符表示(如果使用 unicode,则为代码点),因此更可靠。