From c829cbc4a4148c58c38e39bb40e3d9da860b077a Mon Sep 17 00:00:00 2001 From: Keegi Date: Wed, 1 Jun 2011 19:22:38 +0300 Subject: [PATCH 1/4] Proper alias support (no tab completion yet) --- .pronsolerc | 2 +- pronsole.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/.pronsolerc b/.pronsolerc index 497a67b..d3028c0 100644 --- a/.pronsolerc +++ b/.pronsolerc @@ -1,5 +1,5 @@ # Sample .pronsolerc file - copy this into your home directory -!self.do_alias = lambda aarg,self=self: setattr(self,"do_"+aarg.split()[0],lambda arg,self=self,a=aarg.split(None,1)[1]:self.onecmd(" ".join((a,arg)))) alias up move Z 10 alias loud !self.loud = 1 alias quiet !self.loud = 0 +alias home_all G28 diff --git a/pronsole.py b/pronsole.py index deab8f1..da3ac91 100644 --- a/pronsole.py +++ b/pronsole.py @@ -39,6 +39,7 @@ class pronsole(cmd.Cmd): self.bedtemps={"pla":"60","abs":"110","off":"0"} self.percentdone=0 self.tempreadings="" + self.aliases=[] def scanserial(self): """scan for available ports. return a list of device names.""" @@ -69,6 +70,47 @@ class pronsole(cmd.Cmd): def help_gcodes(self): print "Gcodes are passed through to the printer as they are" + def do_alias(self,l): + if l == "": + # list aliases + if len(self.aliases): + self.print_topics("Aliases, to display type: alias ",self.aliases,15,80) + else: + print "No aliases defined, to define see: help alias" + return + alias_l = l.split(None,1) + alias_name = alias_l[0] + if len(alias_l) < 2: + # display alias + if alias_name in self.aliases: + print self.__dict__["do_"+alias_name].func_doc + else: + print "Alias '"+alias_name+"' is not defined" + return + alias_name,alias_def = alias_l + if alias_def.lower() == "/d": + # delete alias + if alias_name in self.aliases: + delattr(self,"do_"+alias_name) + self.aliases.remove(alias_name) + print "Alias '"+alias_name+"' removed" + return + else: + print "Alias '"+alias_name+"' is not defined" + return + # (re)define an alias + func = lambda args,self=self,alias_def=alias_def: self.onecmd(" ".join((alias_def,args))) + func.func_doc = "Alias '"+alias_name+"' stands for '"+alias_def+"'" + setattr(self,"do_"+alias_name,func) + if alias_name not in self.aliases: + self.aliases.append(alias_name) + + def help_alias(self): + print "Create/modify/view aliases: alias []" + print "if is not specified, displays the alias definition" + print "without arguments, displays list of all defined aliases" + print "To remove an alias: alias /d" + def postloop(self): self.p.disconnect() cmd.Cmd.postloop(self) From efaf64de42fe049a41b82eafe460063c6f9d9002 Mon Sep 17 00:00:00 2001 From: Keegi Date: Wed, 1 Jun 2011 19:31:02 +0300 Subject: [PATCH 2/4] Avoid using func_doc to store alias definition --- pronsole.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/pronsole.py b/pronsole.py index da3ac91..4c7dc50 100644 --- a/pronsole.py +++ b/pronsole.py @@ -39,7 +39,7 @@ class pronsole(cmd.Cmd): self.bedtemps={"pla":"60","abs":"110","off":"0"} self.percentdone=0 self.tempreadings="" - self.aliases=[] + self.aliases={} def scanserial(self): """scan for available ports. return a list of device names.""" @@ -74,7 +74,7 @@ class pronsole(cmd.Cmd): if l == "": # list aliases if len(self.aliases): - self.print_topics("Aliases, to display type: alias ",self.aliases,15,80) + self.print_topics("Aliases, to display type: alias ",self.aliases.keys(),15,80) else: print "No aliases defined, to define see: help alias" return @@ -82,17 +82,17 @@ class pronsole(cmd.Cmd): alias_name = alias_l[0] if len(alias_l) < 2: # display alias - if alias_name in self.aliases: - print self.__dict__["do_"+alias_name].func_doc + if alias_name in self.aliases.keys(): + print "Alias '"+alias_name+"' stands for '"+self.aliases[alias_name]+"'" else: print "Alias '"+alias_name+"' is not defined" return alias_name,alias_def = alias_l if alias_def.lower() == "/d": # delete alias - if alias_name in self.aliases: + if alias_name in self.aliases.keys(): delattr(self,"do_"+alias_name) - self.aliases.remove(alias_name) + del self.aliases[alias_name] print "Alias '"+alias_name+"' removed" return else: @@ -100,10 +100,8 @@ class pronsole(cmd.Cmd): return # (re)define an alias func = lambda args,self=self,alias_def=alias_def: self.onecmd(" ".join((alias_def,args))) - func.func_doc = "Alias '"+alias_name+"' stands for '"+alias_def+"'" + self.aliases[alias_name] = alias_def setattr(self,"do_"+alias_name,func) - if alias_name not in self.aliases: - self.aliases.append(alias_name) def help_alias(self): print "Create/modify/view aliases: alias []" From d2c1b08e31e71a3f05e9624d88b402fdcc01d734 Mon Sep 17 00:00:00 2001 From: Keegi Date: Wed, 1 Jun 2011 20:00:35 +0300 Subject: [PATCH 3/4] alias tab-completion and better integration to built-in help --- pronsole.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/pronsole.py b/pronsole.py index 4c7dc50..75611c8 100644 --- a/pronsole.py +++ b/pronsole.py @@ -91,7 +91,7 @@ class pronsole(cmd.Cmd): if alias_def.lower() == "/d": # delete alias if alias_name in self.aliases.keys(): - delattr(self,"do_"+alias_name) + delattr(self.__class__,"do_"+alias_name) del self.aliases[alias_name] print "Alias '"+alias_name+"' removed" return @@ -99,15 +99,27 @@ class pronsole(cmd.Cmd): print "Alias '"+alias_name+"' is not defined" return # (re)define an alias - func = lambda args,self=self,alias_def=alias_def: self.onecmd(" ".join((alias_def,args))) + func = lambda self,args,alias_def=alias_def: self.onecmd(" ".join((alias_def,args))) self.aliases[alias_name] = alias_def - setattr(self,"do_"+alias_name,func) + setattr(self.__class__,"do_"+alias_name,func) + setattr(self.__class__,"help_"+alias_name,lambda self=self,alias_name=alias_name: self.subhelp_alias(alias_name)) def help_alias(self): print "Create/modify/view aliases: alias []" print "if is not specified, displays the alias definition" print "without arguments, displays list of all defined aliases" print "To remove an alias: alias /d" + + def complete_alias(self,text,line,begidx,endidx): + if (len(line.split())==2 and line[-1] != " ") or (len(line.split())==1 and line[-1]==" "): + return [i for i in self.aliases.keys() if i.startswith(text)] + elif(len(line.split())==3 or (len(line.split())==2 and line[-1]==" ")): + return self.completenames(text) + else: + return [] + + def subhelp_alias(self,alias_name): + print "'"+alias_name+"' is alias for '"+self.aliases[alias_name]+"'" def postloop(self): self.p.disconnect() From cb2ddfbcbf9e7afd211491a553191fe5508f9cb9 Mon Sep 17 00:00:00 2001 From: Keegi Date: Wed, 1 Jun 2011 20:49:12 +0300 Subject: [PATCH 4/4] Prevent overwriting built-in commands with aliases, as it would delete access to the built-in command permanently --- pronsole.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pronsole.py b/pronsole.py index 75611c8..cae06e0 100644 --- a/pronsole.py +++ b/pronsole.py @@ -99,6 +99,9 @@ class pronsole(cmd.Cmd): print "Alias '"+alias_name+"' is not defined" return # (re)define an alias + if alias_name not in self.aliases.keys() and hasattr(self.__class__,"do_"+alias_name): + print "Name '"+alias_name+"' is already being used by built-in command" + return func = lambda self,args,alias_def=alias_def: self.onecmd(" ".join((alias_def,args))) self.aliases[alias_name] = alias_def setattr(self.__class__,"do_"+alias_name,func)