-
-
Save Enteleform/8668f13319100a73066d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sublime, sublime_plugin | |
class StorytellerListener (sublime_plugin.EventListener): | |
def __init__(self): | |
self.allInsertEventsByFile = {} | |
self.allBufferSizes = {} | |
def on_new(self, view): | |
self.allInsertEventsByFile[view.buffer_id()] = [[]] | |
self.allBufferSizes[view.buffer_id()] = 0 | |
def on_modified (self, view): | |
updatedRegions = view.sel() | |
for region in reversed ( updatedRegions ): | |
newBufferSize = view.size() | |
bufferId = view.buffer_id(); | |
#▒▒▒▒▒ Fixes traceback from non-existent entry ▒▒▒▒▒# | |
if not bufferId in self.allBufferSizes: | |
self.allBufferSizes[bufferId] = newBufferSize | |
numCharsChanged = abs(newBufferSize - self.allBufferSizes[bufferId]) | |
if(newBufferSize == self.allBufferSizes[bufferId]): | |
print("Size the same-- When does this happen????") | |
elif(newBufferSize < self.allBufferSizes[bufferId]): | |
self.removeEvent(numCharsChanged, region.a, self.allInsertEventsByFile[bufferId], view) | |
else: | |
self.insertEvent(numCharsChanged, region.a, self.allInsertEventsByFile[bufferId], view) | |
self.allBufferSizes[bufferId] = newBufferSize | |
def printEvents(self, view): | |
print("buffer id: %i" % view.buffer_id()) | |
allEvents = self.allInsertEventsByFile[view.buffer_id()] | |
for row in allEvents: | |
print(row) | |
#▒▒▒▒▒ add space between prints for easier testing ▒▒▒▒▒# | |
print("\n\n\n") | |
def insertEvent(self, numCharsChanged, cursorPoint, bufferOfInsertEvents, view): | |
insertedRegion = sublime.Region(cursorPoint - numCharsChanged, cursorPoint) | |
insertedText = view.substr(insertedRegion) | |
beginInsertRow, beginInsertColumn = view.rowcol(cursorPoint - numCharsChanged) | |
insertRow = beginInsertRow | |
insertColumn = beginInsertColumn | |
for newChar in insertedText: | |
if newChar == "\n": | |
restOnLine = bufferOfInsertEvents[insertRow][insertColumn:] | |
bufferOfInsertEvents[insertRow].insert(insertColumn, newChar) | |
bufferOfInsertEvents.insert(insertRow + 1, restOnLine) | |
for x in restOnLine: | |
bufferOfInsertEvents[insertRow].pop() | |
insertRow = insertRow + 1 | |
insertColumn = 0 | |
else: | |
if insertRow == len(bufferOfInsertEvents): | |
bufferOfInsertEvents.append([]) | |
bufferOfInsertEvents[insertRow].insert(insertColumn, newChar) | |
insertColumn = insertColumn + 1 | |
self.printEvents(view) | |
def removeEvent(self, numCharsChanged, cursorPoint, bufferOfInsertEvents, view): | |
deleteRow, deleteColumn = view.rowcol(cursorPoint) | |
count = 0 | |
while count < numCharsChanged: | |
if bufferOfInsertEvents[deleteRow][deleteColumn] == "\n": | |
del bufferOfInsertEvents[deleteRow][deleteColumn] | |
if deleteRow < len(bufferOfInsertEvents) - 1: | |
nextLine = bufferOfInsertEvents[deleteRow + 1] | |
for char in nextLine: | |
bufferOfInsertEvents[deleteRow].append(char) | |
bufferOfInsertEvents.pop(deleteRow + 1) | |
else: #removing a non-newline | |
del bufferOfInsertEvents[deleteRow][deleteColumn] | |
if len(bufferOfInsertEvents[deleteRow]) == 0 and len(bufferOfInsertEvents) > 1: | |
bufferOfInsertEvents.pop(deleteRow) | |
elif deleteColumn == len(bufferOfInsertEvents[deleteRow]): | |
deleteColumn = 0 | |
deleteRow = deleteRow + 1 | |
count = count + 1 | |
self.printEvents(view) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment