From 103fa22ea7ceb1183bdcb839b7b9b72c4b7fba82 Mon Sep 17 00:00:00 2001 From: Liu Shuo Date: Sun, 8 May 2022 22:50:17 +0800 Subject: [PATCH] [feature] add the completion of command arguments --- utils/pycli/skyeye_cli.py | 42 +++++++++++++++---- utils/pycli/skyeye_command/_base_.py | 15 +++++++ utils/pycli/skyeye_command/bp_create.py | 13 ++++++ utils/pycli/skyeye_command/bp_delete.py | 18 +++++++- utils/pycli/skyeye_command/bp_list.py | 8 ++++ utils/pycli/skyeye_command/cd.py | 11 +++++ utils/pycli/skyeye_command/define_conf.py | 14 +++++++ .../skyeye_command/disable_device_work.py | 7 ++++ utils/pycli/skyeye_command/disassemble.py | 12 ++++++ .../skyeye_command/enable_device_work.py | 7 ++++ utils/pycli/skyeye_command/fj_clear.py | 30 +++++++++++++ utils/pycli/skyeye_command/fj_set.py | 30 +++++++++++++ utils/pycli/skyeye_command/get_pc.py | 7 ++++ utils/pycli/skyeye_command/list_attr.py | 4 ++ utils/pycli/skyeye_command/list_connect.py | 4 ++ utils/pycli/skyeye_command/list_device.py | 7 ++++ utils/pycli/skyeye_command/list_iface.py | 4 ++ utils/pycli/skyeye_command/list_register.py | 15 +++++++ utils/pycli/skyeye_command/load_binary.py | 21 ++++++++++ utils/pycli/skyeye_command/load_file.py | 25 +++++++++++ utils/pycli/skyeye_command/md.py | 12 ++++++ utils/pycli/skyeye_command/mm_info.py | 8 ++++ utils/pycli/skyeye_command/reverse.py | 7 ++++ utils/pycli/skyeye_command/run_script.py | 14 +++++++ utils/pycli/skyeye_command/set_mode.py | 5 +++ utils/pycli/skyeye_command/set_pc.py | 12 ++++++ utils/pycli/skyeye_command/set_register.py | 31 +++++++++++++- utils/pycli/skyeye_command/stepi.py | 7 ++++ 28 files changed, 381 insertions(+), 9 deletions(-) diff --git a/utils/pycli/skyeye_cli.py b/utils/pycli/skyeye_cli.py index ed34ce61..e9d70b85 100755 --- a/utils/pycli/skyeye_cli.py +++ b/utils/pycli/skyeye_cli.py @@ -54,9 +54,20 @@ def add_do_command_method(cls): print('!!!BUG!!!') return do_xxx + def create_complete_method(command): + def complete_xxx(self, text, line, begidx, endidx): + return command.complete(text, line, begidx, endidx) + # try: + # return command.complete(text, line, begidx, endidx) + # except: + # return [] + return complete_xxx + for name, command in skyeye_command._commands.items(): if 'cli' in command.export: setattr(cls, 'do_'+name, create_command_method(command)) + if not getattr(cls, 'complete_'+name, None): + setattr(cls, 'complete_'+name, create_complete_method(command)) return cls @@ -97,6 +108,9 @@ class SkyEyeCli(cmd.Cmd): # 命令参数解析器 self.cmd_parsers = {} + # 参数补齐时不截断形如xxx-yyy的命令 + self.identchars += '-/' + def print_welcome_message(self): os_info = platform.system() if operator.eq(os_info, "Linux"): @@ -117,9 +131,9 @@ class SkyEyeCli(cmd.Cmd): def readline_cfg(self): import readline s = readline.get_completer_delims() - for c in '<>-': + for c in '<>-/': s = s.replace(c, '') - s += '.' + #s += '.' readline.set_completer_delims(s) self.readline = readline @@ -143,7 +157,6 @@ class SkyEyeCli(cmd.Cmd): self.readline.write_history_file(self.history_file) def precmd(self, arg): - if arg: if arg.startswith('%'): arg = 'run_py ' + arg[1:] @@ -186,11 +199,29 @@ class SkyEyeCli(cmd.Cmd): def completedefault(self, text, line, begidx, endidx): # TODO: 实现参数补齐功能 - pass + cmd, args, foo = self.parseline(line) + if '-' in cmd: + cmd = cmd.replace('-', '_') + compfunc = getattr(self, 'complete_'+cmd, None) + if compfunc: + return compfunc(text, line, begidx, endidx) + return [] def default(self, line): print('[Error] Unknown command: %s\n'%line) + def complete(self, text, state): + #print('IN complete: text = "%s"' % text, state) + return super().complete(text, state) + + # def complete_get_pc(self, text, line, begidx, endidx): + # print('HOHOH') + # config = GetGlobalConfig() + # if not config: + # return None + # cpus = config.get_cpu_list() + # return [item for item in cpus if item.startswith(text)] + # def do_t(self, arg): # args = arg.split() # print(args) @@ -201,6 +232,3 @@ class SkyEyeCli(cmd.Cmd): # except Exception as e: # print(e) # raise e - -################################################################################ - diff --git a/utils/pycli/skyeye_command/_base_.py b/utils/pycli/skyeye_command/_base_.py index 22d0ee4e..11f657c4 100644 --- a/utils/pycli/skyeye_command/_base_.py +++ b/utils/pycli/skyeye_command/_base_.py @@ -21,6 +21,21 @@ class SkyeyeCommand(ABC): def create_argparser(self): pass + def complete(self, text, line, begidx, endidx): + i = len(line.split()) + if begidx < endidx: + i -= 1 + try: + compfunc = getattr(self, 'complete_arg_%d' % i) + res = compfunc(text, line, begidx, endidx) + except AttributeError: + res = [] + except Exception as e: + print('DEBUG: COMPLETE BUG', e) + res = [] + + return res + def check_arg(self, arg): try: return self.argparser.parse_args(arg.split()) diff --git a/utils/pycli/skyeye_command/bp_create.py b/utils/pycli/skyeye_command/bp_create.py index e9f10eab..cd848662 100644 --- a/utils/pycli/skyeye_command/bp_create.py +++ b/utils/pycli/skyeye_command/bp_create.py @@ -3,6 +3,7 @@ import argparse import os from skyeye_common_module import SkyEyeCreateBreakpoint from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig class Command(SkyeyeCommand): export = ['cli'] @@ -31,3 +32,15 @@ class Command(SkyeyeCommand): def call(self, arg='', arg_ns=None, cli=None, script=None, **meta): SkyEyeCreateBreakpoint(arg_ns.cpu, arg_ns.bp_addr) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/bp_delete.py b/utils/pycli/skyeye_command/bp_delete.py index bcdf9b19..8c7f3cd9 100644 --- a/utils/pycli/skyeye_command/bp_delete.py +++ b/utils/pycli/skyeye_command/bp_delete.py @@ -1,8 +1,9 @@ from . import SkyeyeCommand, convert_int import argparse import os -from skyeye_common_module import SkyEyeDeleteBreakpointByAddr +from skyeye_common_module import * from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig class Command(SkyeyeCommand): export = ['cli'] @@ -31,3 +32,18 @@ class Command(SkyeyeCommand): def call(self, arg='', arg_ns=None, cli=None, script=None, **meta): SkyEyeDeleteBreakpointByAddr(arg_ns.cpu, arg_ns.bp_addr) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + cpu = line.split()[1] + temp = [] + n = SkyEyeGetBpNumbers(cpu) + for i in range(n): + temp.append(hex(SkyEyeGetBreakpointAddrById(cpu, i))) + return [item for item in temp if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/bp_list.py b/utils/pycli/skyeye_command/bp_list.py index 2ce24e97..4ce94791 100644 --- a/utils/pycli/skyeye_command/bp_list.py +++ b/utils/pycli/skyeye_command/bp_list.py @@ -3,6 +3,7 @@ import argparse import os from skyeye_common_module import SkyEyeGetBpNumbers, SkyEyeGetBreakpointAddrById from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig class Command(SkyeyeCommand): export = ['cli'] @@ -31,3 +32,10 @@ class Command(SkyeyeCommand): print("%-25s0x%-25x" % (arg_ns.cpu, i)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/cd.py b/utils/pycli/skyeye_command/cd.py index a1f0e42c..c0d4844c 100644 --- a/utils/pycli/skyeye_command/cd.py +++ b/utils/pycli/skyeye_command/cd.py @@ -22,3 +22,14 @@ class Command(SkyeyeCommand): def call(self, arg='', arg_ns=None, cli=None, script=None, **meta): os.chdir(arg_ns.path) return False + + def complete_arg_1(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, _, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + return [item for item in dirs if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/define_conf.py b/utils/pycli/skyeye_command/define_conf.py index 54f9ea38..6e8497c5 100644 --- a/utils/pycli/skyeye_command/define_conf.py +++ b/utils/pycli/skyeye_command/define_conf.py @@ -42,3 +42,17 @@ class Command(SkyeyeCommand): cli.open_conf_flag = True return False + + def complete_arg_1(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files + if os.path.splitext(item)[1] == '.json'] + items = files + dirs + return [item for item in items if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/disable_device_work.py b/utils/pycli/skyeye_command/disable_device_work.py index eeb40983..a08b35f2 100644 --- a/utils/pycli/skyeye_command/disable_device_work.py +++ b/utils/pycli/skyeye_command/disable_device_work.py @@ -37,3 +37,10 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException(['0x40050000', e]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + dl = config.get_device_list() + return [item for item in dl if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/disassemble.py b/utils/pycli/skyeye_command/disassemble.py index 8ada4ab3..102e20b5 100644 --- a/utils/pycli/skyeye_command/disassemble.py +++ b/utils/pycli/skyeye_command/disassemble.py @@ -41,3 +41,15 @@ class Command(SkyeyeCommand): print ("%-20x%-20s" % (arg_ns.addr, disas_str)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/enable_device_work.py b/utils/pycli/skyeye_command/enable_device_work.py index 599a8e16..5b761f5f 100644 --- a/utils/pycli/skyeye_command/enable_device_work.py +++ b/utils/pycli/skyeye_command/enable_device_work.py @@ -38,3 +38,10 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException(['0x40080000', e]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + dl = config.get_device_list() + return [item for item in dl if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/fj_clear.py b/utils/pycli/skyeye_command/fj_clear.py index ebd4a9f5..8dc03b86 100644 --- a/utils/pycli/skyeye_command/fj_clear.py +++ b/utils/pycli/skyeye_command/fj_clear.py @@ -59,3 +59,33 @@ class Command(SkyeyeCommand): print('Failure deletion successful.') return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] + + def complete_arg_4(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(8)] + return [] + + def complete_arg_5(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(3)] + return [] diff --git a/utils/pycli/skyeye_command/fj_set.py b/utils/pycli/skyeye_command/fj_set.py index c83b9faa..26f1cdee 100644 --- a/utils/pycli/skyeye_command/fj_set.py +++ b/utils/pycli/skyeye_command/fj_set.py @@ -59,3 +59,33 @@ class Command(SkyeyeCommand): print("Injection failure success") return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] + + def complete_arg_4(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(8)] + return [] + + def complete_arg_5(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(3)] + return [] diff --git a/utils/pycli/skyeye_command/get_pc.py b/utils/pycli/skyeye_command/get_pc.py index 34fe9ff3..990586be 100644 --- a/utils/pycli/skyeye_command/get_pc.py +++ b/utils/pycli/skyeye_command/get_pc.py @@ -39,3 +39,10 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException(['0x40200000', e]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_attr.py b/utils/pycli/skyeye_command/list_attr.py index ef2858eb..8e2b39cb 100644 --- a/utils/pycli/skyeye_command/list_attr.py +++ b/utils/pycli/skyeye_command/list_attr.py @@ -47,3 +47,7 @@ class Command(SkyeyeCommand): print("%-20s%-20s%s" % (info_l[0], info_l[1], destription)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + cls_l = SkyEyeGetClassList() + return [item for item in cls_l if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_connect.py b/utils/pycli/skyeye_command/list_connect.py index 731523ce..f8a9c9d0 100644 --- a/utils/pycli/skyeye_command/list_connect.py +++ b/utils/pycli/skyeye_command/list_connect.py @@ -33,3 +33,7 @@ class Command(SkyeyeCommand): table_print(connect_l) return False + + def complete_arg_1(self, text, line, begidx, endidx): + cls_l = SkyEyeGetClassList() + return [item for item in cls_l if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_device.py b/utils/pycli/skyeye_command/list_device.py index 09038de0..1af8b05e 100644 --- a/utils/pycli/skyeye_command/list_device.py +++ b/utils/pycli/skyeye_command/list_device.py @@ -51,3 +51,10 @@ class Command(SkyeyeCommand): print ("%-30s%-30s" % (i+1, device_list[i])) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_iface.py b/utils/pycli/skyeye_command/list_iface.py index 569f64a6..37656a61 100644 --- a/utils/pycli/skyeye_command/list_iface.py +++ b/utils/pycli/skyeye_command/list_iface.py @@ -34,3 +34,7 @@ class Command(SkyeyeCommand): table_print(iface_l) return False + + def complete_arg_1(self, text, line, begidx, endidx): + cls_l = SkyEyeGetClassList() + return [item for item in cls_l if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/list_register.py b/utils/pycli/skyeye_command/list_register.py index e16af193..a350a4bc 100644 --- a/utils/pycli/skyeye_command/list_register.py +++ b/utils/pycli/skyeye_command/list_register.py @@ -44,3 +44,18 @@ class Command(SkyeyeCommand): print ("%-20s%-20x%-20x" % (i, ret[i]["value"], ret[i]["addr"])) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/load_binary.py b/utils/pycli/skyeye_command/load_binary.py index a3f716fa..d8e7ea87 100644 --- a/utils/pycli/skyeye_command/load_binary.py +++ b/utils/pycli/skyeye_command/load_binary.py @@ -47,3 +47,24 @@ class Command(SkyeyeCommand): binary_l[arg_ns.cpu] = path return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files] + items = files + dirs + return [item for item in items if item.startswith(text)] + diff --git a/utils/pycli/skyeye_command/load_file.py b/utils/pycli/skyeye_command/load_file.py index 80be4163..e5a1401c 100644 --- a/utils/pycli/skyeye_command/load_file.py +++ b/utils/pycli/skyeye_command/load_file.py @@ -58,3 +58,28 @@ class Command(SkyeyeCommand): SkyEyeLoadFile(arg_ns.cpu, path, arg_ns.addr) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files] + items = files + dirs + return [item for item in items if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/md.py b/utils/pycli/skyeye_command/md.py index 138aa5f5..6c7d0b19 100644 --- a/utils/pycli/skyeye_command/md.py +++ b/utils/pycli/skyeye_command/md.py @@ -41,3 +41,15 @@ class Command(SkyeyeCommand): print ("%-20x%-20x" % (arg_ns.addr, ret)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/mm_info.py b/utils/pycli/skyeye_command/mm_info.py index cd1e502e..f942e664 100644 --- a/utils/pycli/skyeye_command/mm_info.py +++ b/utils/pycli/skyeye_command/mm_info.py @@ -28,3 +28,11 @@ class Command(SkyeyeCommand): SkyEyeMemoryInfo(arg_ns.func) return False + + def complete_arg_1(self, text, line, begidx, endidx): + funcs = [ + 'mm', 'mm_zero', 'strdup', 'mm_align', + 'align_free', 'free', 'realloc', + ] + + return [item for item in funcs if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/reverse.py b/utils/pycli/skyeye_command/reverse.py index 024fc14d..5704601e 100644 --- a/utils/pycli/skyeye_command/reverse.py +++ b/utils/pycli/skyeye_command/reverse.py @@ -85,3 +85,10 @@ class Command(SkyeyeCommand): SkyEyeStepi(core, "%d" % run_steps) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/run_script.py b/utils/pycli/skyeye_command/run_script.py index af8e91dc..454cc103 100644 --- a/utils/pycli/skyeye_command/run_script.py +++ b/utils/pycli/skyeye_command/run_script.py @@ -56,3 +56,17 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException([ERROR_ALL_F, msg]) commands.append((command, arg)) return commands + + def complete_arg_1(self, text, line, begidx, endidx): + dir_name, last = os.path.split(text) + top = dir_name if dir_name else '.' + _, dirs, files, _ = next(os.fwalk(top)) + if last == '.': + dirs += ['.', '..'] + elif last == '..': + dirs += ['..'] + dirs = [(os.path.join(dir_name, item))+'/' for item in dirs] + files = [(os.path.join(dir_name, item)) for item in files + if os.path.splitext(item)[1] == '.skyeye'] + items = files + dirs + return [item for item in items if item.startswith(text)] diff --git a/utils/pycli/skyeye_command/set_mode.py b/utils/pycli/skyeye_command/set_mode.py index 1fbadb43..c58da6c9 100644 --- a/utils/pycli/skyeye_command/set_mode.py +++ b/utils/pycli/skyeye_command/set_mode.py @@ -34,3 +34,8 @@ class Command(SkyeyeCommand): print ("--%d--" % arg_ns.mode) SetAllToDyncom(arg_ns.mode) return False + + def complete_arg_1(self, text, line, begidx, endidx): + if begidx == endidx: + return [str(i) for i in range(4)] + return [] diff --git a/utils/pycli/skyeye_command/set_pc.py b/utils/pycli/skyeye_command/set_pc.py index aed30838..705aabc4 100644 --- a/utils/pycli/skyeye_command/set_pc.py +++ b/utils/pycli/skyeye_command/set_pc.py @@ -39,3 +39,15 @@ class Command(SkyeyeCommand): raise SkyeyeAPIException([ERROR_ALL_F, msg]) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/set_register.py b/utils/pycli/skyeye_command/set_register.py index 6118a126..e265d70d 100644 --- a/utils/pycli/skyeye_command/set_register.py +++ b/utils/pycli/skyeye_command/set_register.py @@ -31,7 +31,7 @@ class Command(SkyeyeCommand): parser.add_argument( 'register', metavar='', - help='device name', + help='register name', ) parser.add_argument( @@ -48,3 +48,32 @@ class Command(SkyeyeCommand): ret = SkyEyeSetDevRegValueById(arg_ns.machine, arg_ns.device, arg_ns.value, regid) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + ml = config.get_mach_list() + return [item for item in ml if item.startswith(text)] + + def complete_arg_2(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + mach = line.split()[1] + device_list = config.get_device_list_by_mach(mach) + return [item for item in device_list if item.startswith(text)] + + def complete_arg_3(self, text, line, begidx, endidx): + _, mach, device, *_ = line.split() + ret = sfi.get_device_register_info(mach, device) + if not ret: + return [] + # FIXME + items = [item.decode('utf-8') for item in ret] + return [item for item in items if item.startswith(text)] + + def complete_arg_4(self, text, line, begidx, endidx): + if '0x'.startswith(text): + return ['0x'] + return [] diff --git a/utils/pycli/skyeye_command/stepi.py b/utils/pycli/skyeye_command/stepi.py index f4741aac..76ee1b91 100644 --- a/utils/pycli/skyeye_command/stepi.py +++ b/utils/pycli/skyeye_command/stepi.py @@ -35,3 +35,10 @@ class Command(SkyeyeCommand): SkyEyeStepi(arg_ns.cpu, str(arg_ns.size)) return False + + def complete_arg_1(self, text, line, begidx, endidx): + config = GetGlobalConfig() + if not config: + return [] + cpus = config.get_cpu_list() + return [item for item in cpus if item.startswith(text)] -- Gitee