path completion

This commit is contained in:
Ian Jauslin 2021-10-16 02:09:53 -04:00
parent 1a816166b6
commit 99ad0407b8
2 changed files with 66 additions and 3 deletions

View File

@ -1,6 +1,10 @@
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.graphics import Color,Rectangle
import glob
import os.path
from tools import common_substr
class Command_prompt(Label):
@ -47,15 +51,18 @@ class Command_prompt(Label):
def on_key_down(self, keyboard, keycode, text, modifiers):
print(keycode,text,modifiers)
#print(keycode,text,modifiers)
if self.insert:
# process modifiers
mods=self.process_modifiers(modifiers)
# clear status bar
self.app.status_bar.text=""
# process command
if keycode[1]=="enter":
self.insert=False
self.parse_command()
self.parse_argv()
self.set_text("")
# move
@ -76,6 +83,10 @@ class Command_prompt(Label):
elif mods==['c'] and text=="k":
self.delete_all_forward()
# tab completion
elif keycode[1]=="tab":
self.tab_complete()
def on_textinput(self,window,text):
#print(text)
if self.insert:
@ -165,10 +176,13 @@ class Command_prompt(Label):
# parse text as argv
def parse_command(self):
def parse_argv(self):
# init
self.argv=[""]
# return position of cursor
cursor=(0,0)
# whether inside quotes
single_quoted=False
double_quoted=False
@ -199,5 +213,41 @@ class Command_prompt(Label):
# reset backslash
backslashed=False
# record position of cursor
if self.cursor==i+1:
cursor=(len(self.argv)-1,len(self.argv[len(self.argv)-1]))
return cursor
# tab completion
def tab_complete(self):
# parse argv
cursor=self.parse_argv()
# write and edit commands
if self.argv[0]=="w" or self.argv[0]=="e":
# check that cursor is in first argument
if cursor[0]==1:
# complete filesystem path
self.append_text_at_cursor(self.complete_path(self.argv[1],cursor[1]))
# complete filesystem path
def complete_path(self,base,end):
paths=glob.glob(glob.escape(base[:end])+"*")
print(glob.escape(base[:end])+"*", paths)
if len(paths)==0:
return ""
elif len(paths)==1:
# append '/' to directories
if os.path.isdir(paths[0]):
return paths[0][end:]+"/"
else:
return paths[0][end:]
else:
# display in status bar
self.app.status_bar.text=""
for path in paths:
self.app.status_bar.text+="\""+path+"\" "
return common_substr(paths)[end:]

View File

@ -9,3 +9,16 @@ def isint_nonzero(x):
if abs(x)<1e-11:
return False
return abs(round(x)-x)<1e-11
# find the common substring in a list of strings
def common_substr(strings):
out=""
if len(strings)==0:
return out
for i in range(len(strings[0])):
for j in range(1,len(strings)):
if strings[j][i]!=strings[0][i]:
return out
out+=strings[0][i]
return out