diff --git a/relational_readline/linegui.py b/relational_readline/linegui.py
new file mode 100644
index 0000000..099019a
--- /dev/null
+++ b/relational_readline/linegui.py
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+# coding=UTF-8
+# Relational
+# Copyright (C) 2010 Salvo "LtWorf" Tomaselli
+#
+# Relational is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# author Salvo "LtWorf" Tomaselli
+# Initial readline code from http://www.doughellmann.com/PyMOTW/readline/index.html
+
+import readline
+import logging
+import os.path
+import sys
+
+from relational import relation, parser, optimizer
+
+class SimpleCompleter(object):
+ '''Handles completion'''
+
+ def __init__(self, options):
+ '''Takes a list of valid completion options'''
+ self.options = sorted(options)
+ return
+
+ def add_completion(self,option):
+ '''Adds one string to the list of the valid completion options'''
+ self.options.append(option)
+ self.options.sort()
+
+ def remove_completion(self,option):
+ '''Removes one completion from the list of the valid completion options'''
+ #//TODO
+ pass
+
+ def complete(self, text, state):
+ response = None
+ if state == 0:
+ # This is the first time for this text, so build a match list.
+ if text:
+ self.matches = [s
+ for s in self.options
+ if s and s.startswith(text)]
+ logging.debug('%s matches: %s', repr(text), self.matches)
+ else:
+ self.matches = self.options[:]
+ logging.debug('(empty input) matches: %s', self.matches)
+
+ # Return the state'th item from the match list,
+ # if we have that many.
+ try:
+ response = self.matches[state]
+ except IndexError:
+ response = None
+ logging.debug('complete(%s, %s) => %s',
+ repr(text), state, repr(response))
+ return response
+
+
+relations={}
+completer=SimpleCompleter(['LIST','LOAD ','UNLOAD ','HELP','QUIT','SAVE '])
+
+
+
+def load_relation(filename,defname=None):
+ if not os.path.isfile(filename):
+ print >> sys.stderr, "%s is not a file" % filename
+ return None
+
+ f=filename.split('/')
+ if defname==None:
+ defname=f[len(f)-1].lower()
+ if (defname.endswith(".csv") or defname.endswith(".tlb")): #removes the extension
+ defname=defname[:-4]
+
+ try:
+ relations[defname]=relation.relation(filename)
+ return defname
+ except Exception, e:
+ print e
+ return None
+
+def exec_line(command):
+ command=command.strip()
+ if command=='QUIT':
+ sys.exit(0)
+ elif command=='HELP':
+ #//TODO
+ pass
+ elif command=='LIST': #Lists all the loaded relations
+ for i in relations:
+ print i
+ elif command.startswith('LOAD '): #Loads a relation
+ pars=command.split(' ')
+ filename=pars[1]
+ if len(pars)>2:
+ defname=pars[2]
+ else:
+ defname=None
+ defname=load_relation(filename,defname)
+ if defname==None: return
+
+ completer.add_completion(defname)
+ print "Loaded relation %s"% defname
+
+ elif command=='UNLOAD ':
+ #//TODO
+ pass
+ #elif command=='SAVE': //TODO
+ else:
+ print "Invalid command %s" % command
+def main(files=[]):
+ readline.set_completer(completer.complete)
+
+ readline.parse_and_bind('tab: complete')
+ readline.parse_and_bind('set editing-mode vi')
+
+ while True:
+ line = raw_input('> ')
+ exec_line(line)
+
+
+
+
+main()
\ No newline at end of file