Hoi,
Ik heb het inmiddels opgelost en het is best wel wat code geworden. Voor diegene die hierin ook geïnteresseerd zijn heb ik hieronde mijn completer class gezet:
#!/usr/bin/env python
import readline
import glob
n='_' #prefix voor programma-eigen commando's
#class voor readline completion:
class completer():
def complete(self, text, index):
'''Geeft de volgende mogelijke aanvulling.
De functie wordt aangeroepen met index=0,1,2 etc.
Telkens wordt er een match gereturned met als laatste waarde None
Dit is het signaal voor readline om te stoppen.
'''
if index == 0: # Alleen uitvoeren bij de eerste aanroep
self.matches = []
start = readline.get_begidx(); pos = 0
#Het eerste woord is altijd een commando (bash of programma-eigen)
#Dus als cursor in het eerste woord dan
if start == 0:
findmode = 'ex' #het is een commando
else: # Bij event. spaties aan het begin, dan juiste start vinden.
for i, char in enumerate(readline.get_line_buffer()):
if char not in [" "]:
pos = i; break
if start == pos:
findmode = 'ex'
else:
findmode = 'file' # else file mode
#
if findmode == 'ex':
#alle 'eigen' commando's beginnen met een prefix die is opgeslagen in variabele n
if text[0]==n: #als beginletter gelijk aan n, dan is het eigen commando
self.matches=self.shell(text)
elif text[0:2]=='./': #uitvoern executable, niet in PATH
self.matches=self.doc(self,text[2:])
else: #executable uit PATH
self.matches=self.bash(text)
else: # file
self.matches=self.doc(text)
try:
return self.matches[index]
except IndexError:
return None
except Exception, why:
print '\nps_completer err:', str(why)
return None
#eigen commando'a aanvullen
def shell(self,text):
global commands
keys=commands.keys()
keys.sort()
matches=[]
for k in keys:
if k.startswith(text):
matches+=[k]
return matches
#commando's (eerste positie) aanvullen
def bash(self,text):
ret=[]
if os.environ.has_key('PATH'):
for folder in os.environ['PATH'].split(os.pathsep):
matches =glob.glob(os.path.join(folder, text) + '*')
#print matches
for match in matches:
if os.access(os.path.expanduser(match),os.X_OK):
ret += [os.path.basename(match)]
else: ret += glob.glob(text + '*')
return ret
def doc(self,text):
#Aanvullen files en directories
ret=[]
matches = glob.glob(os.path.expanduser(text) + '*')
for match in matches:
if os.path.isdir(match): match = match + '/'
ret += [match]
return ret
#Tab completion instellen en
#readline instellen op nieuwe completer
readline.parse_and_bind("tab: complete")
readline.set_completer_delims('\r\n`~!@#$%^&*()-=+[{]}\|;:\'",<>? ')
readline.set_completer(ps_completer().complete)
#hier de interactie met de gebruiker
while True:
#gebruikt nieuwe bovenstaande functie als raw_input vervanger
inp=raw_input('geef commando:')
#Niets invoeren stopt het script
#anders wordt het uitgevoerd
if inp=='':
break
elif inp[0]=n:
pass #eigen code om prog-eigen commando's uit te voeren
else:
os.system(inp) #uitvoeren van systeem commando
Dit werkt best goed. Ik heb nog niet de moeite genomen om bij ./ alleen uitvoerbare scripts te zoeken, maar dit is voor mij goed genoeg.