def run(self, qAndaDict=None, **kwds):
        _async = kwds.pop("async", True)
        commands = kwds.pop("commands")
        run_mode = kwds.pop("run_mode", "capture_both")
        win_mode = kwds.pop("win_mode", "hide")
        run_opts = kwds.pop("run_opts", {})
        dyn_report_mul = kwds.pop("dyn_report_mul", True)

        if qAndaDict:
            commands = [Str.renderText(cmd, **qAndaDict) for cmd in commands]

        commands = Setting.expandVariables(self.window, *commands)
        cwd, = Setting.expandVariables(self.window, run_opts.get("cwd", "${file_path}"))
        if cwd:
            run_opts["cwd"] = cwd

        workParams = dict(commands=commands,
                          run_mode=run_mode,
                          win_mode=win_mode,
                          run_opts=run_opts,
                          dyn_report_mul=dyn_report_mul
                         )
        print(workParams)
        if _async:
            view = self.window.active_view()
            self.asncCmdCount += 1
            if run_mode != "run":
                view.set_status(ASYNC_STATUS_KEY, "***asnc command running***")

            self.doWorkAsnc(view, workParams, **kwds)
        else:
            self.doWork(**Data.mergeDicts(kwds, workParams))
 def doWorkAsnc(self, view, workParams, **kwds):
     self.doWork(**Data.mergeDicts(kwds, workParams))
     self.asncCmdCount -= 1
     if self.asncCmdCount == 0:
         view.erase_status(ASYNC_STATUS_KEY)