Thursday, August 16, 2012

Matrixify - a Sublime text 2 plugin

May Allah`s peace , mercy and blessing be upon you

Back to blogging ? No and yes , No because I never quit blogging and yes because I wasn't working on any exciting thing  that worths sharing. for the past months I spent time on Android development - just some basic stuff - , and reading some C++ books . I found C++ very interesting whatever what people said about how complex it is , it's expressive and efficient that's what matters !!

Back to our talk for today, I was trying to build a Gameboy emulator with C++ . I am new to the experience of emulation so I decided to read a source code to understand the architecture of the device.
There is a lot of open source emulators but I couldn't found a simple documented one , here comes Imran Nazar he tried to write an emulator using javascript, so I'am translating the code into C++.

The implementation of the Z80 - cpu of the Gameboy - requires a set of cpu instructions each implemented as a method of the Cpu class. This set of functions is declared in the .h file of the class and that's more than 600 function prototype !!!!
It's a wast of space and lack of readability to put a prototype per line or all in a single line , so I thought to format the code like a matrix.

I am using Sublime Text 2 because it's awesome ,I am not even going to argue about that, So I think I am lazy enough to write a plugin to do that for me. Python, I started reading a book but I didn't finish it because I found out that's it's a natural language, it doesn't need a book just a cheat sheet and internet connection !!

This article from Nettuts+ is the best reference on the web on building ST2 plugins. The problem that I faced is input , how can I pass an input to my plugin ? I don't have limited number of inputs to use different commands , I think there is a prompt window but even if it exists it's not a good choice because I want to support multiple selections :/ .

My approach is to use the first line of each selection as an input and parse it to specify the format of the matrix, the code is simple :
import sublime, sublime_plugin

class MatrixifyCommand(sublime_plugin.TextCommand):
 def run(self, edit):
  sels = self.view.sel()
  for sel in sels:
   lines = []
   separators = []
   lengths = []
   dim = 0
   lines = self.view.substr(sel)
   lines = lines.splitlines()
   lines = filter(None, lines)
   lines = [i.strip() for i in lines]
   separators = lines[0].split('%')
   dim = len(separators) - 1
   lengths = [0] * dim
   for i in range(dim):
    for l in range(i+1,len(lines)-1,dim):
     lengths[i] = max(lengths[i] , len(lines[l]))
   output = ""
   for i in range(1,len(lines)):
    index = dim-1 if (i%dim)==0 else (i%dim)-1
    line = lines[i]
    output += separators[index] + line + (lengths[(i%dim) -1] - len(line))*" "
    if (i%dim) == 0:
     output += separators[dim] + "\n"
   self.view.replace(edit, sel, output)

On my Github repository you can find other files used to specify the command , the Edit menu item and the keyboard shortcut. I sent a pull request to sublime package control , when it's accepted I'll update.

No comments:

Post a Comment

Zoli Issam's blog proudly powered by Blogger | All rights reserved Jaw,B 2010-2013