52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
"""
|
|
This module contains the smart backspace mode
|
|
"""
|
|
from pyqode.qt import QtCore, QtGui
|
|
from pyqode.core.api import Mode
|
|
|
|
|
|
class SmartBackSpaceMode(Mode):
|
|
""" Improves backspace behaviour.
|
|
|
|
When you press backspace and there are spaces on the left of the cursor,
|
|
those spaces will be deleted (at most tab_len spaces).
|
|
|
|
Basically this turns backspace into Shitf+Tab
|
|
"""
|
|
def on_state_changed(self, state):
|
|
if state:
|
|
self.editor.key_pressed.connect(self._on_key_pressed)
|
|
else:
|
|
self.editor.key_pressed.disconnect(self._on_key_pressed)
|
|
|
|
def _on_key_pressed(self, event):
|
|
no_modifiers = int(event.modifiers()) == QtCore.Qt.NoModifier
|
|
if event.key() == QtCore.Qt.Key_Backspace and no_modifiers:
|
|
if self.editor.textCursor().atBlockStart():
|
|
return
|
|
tab_len = self.editor.tab_length
|
|
tab_len = self.editor.textCursor().positionInBlock() % tab_len
|
|
if tab_len == 0:
|
|
tab_len = self.editor.tab_length
|
|
# count the number of spaces deletable, stop at tab len
|
|
spaces = 0
|
|
cursor = QtGui.QTextCursor(self.editor.textCursor())
|
|
while spaces < tab_len or cursor.atBlockStart():
|
|
pos = cursor.position()
|
|
cursor.movePosition(cursor.Left, cursor.KeepAnchor)
|
|
char = cursor.selectedText()
|
|
if char == " ":
|
|
spaces += 1
|
|
else:
|
|
break
|
|
cursor.setPosition(pos - 1)
|
|
cursor = self.editor.textCursor()
|
|
if spaces == 0:
|
|
return
|
|
cursor.beginEditBlock()
|
|
for _ in range(spaces):
|
|
cursor.deletePreviousChar()
|
|
cursor.endEditBlock()
|
|
self.editor.setTextCursor(cursor)
|
|
event.accept()
|