from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import Qt


# ----------------------------------------------------------------------
class Win(QtWidgets.QWidget):

    # --------
    def __init__(self):
        super().__init__()

        self.setFixedSize(600, 400)

        self.layout = QtWidgets.QVBoxLayout()
        self.editor = Editor()
        self.layout.addWidget(self.editor)
        self.setLayout(self.layout)
        

# ----------------------------------------------------------------------
class Editor(QtWidgets.QPlainTextEdit):

    # --------
    def __init__(self):
        super().__init__()

        f = QtGui.QFont('Consolas')
        f.setPixelSize(14)
        f.setHintingPreference(QtGui.QFont.HintingPreference.PreferNoHinting)
        self.setFont(f)

        self.setPlainText('All animals are equal. But some are more equal than others.')
        
    # --------
    def keyPressEvent(self, event):

        if (
            event.modifiers() == Qt.KeyboardModifier.AltModifier and
            event.key() == Qt.Key.Key_B
        ):
            self.textCursor().beginEditBlock()

        elif (
            event.modifiers() == Qt.KeyboardModifier.AltModifier and
            event.key() == Qt.Key.Key_E
        ):
            self.textCursor().endEditBlock()

        elif (
            event.modifiers() == Qt.KeyboardModifier.ControlModifier and
            event.key() == Qt.Key.Key_U
        ):
            self.undo()

        else:
            super().keyPressEvent(event)


# ----------------------------------------------------------------------
if __name__ == '__main__':
    app = QtWidgets.QApplication([])

    w = Win()
    w.show()

    exit(app.exec())
# ----------------------------------------------------------------------
