Skip to content

Instantly share code, notes, and snippets.

@Enteleform
Created March 24, 2016 04:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Enteleform/8668f13319100a73066d to your computer and use it in GitHub Desktop.
Save Enteleform/8668f13319100a73066d to your computer and use it in GitHub Desktop.
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