def __call__( # pylint: disable=too-many-branches,too-many-statements # pylint: disable=too-many-arguments,too-many-locals self, action=None, try_app_first=False, app='default', files=None, mode=0, flags='', wait=True, **popen_kws): """Run the application in the way specified by the options. Returns False if nothing can be done, None if there was an error, otherwise the process object returned by Popen(). This function tries to find an action if none is defined. """ # Find an action if none was supplied by # creating a Context object and passing it to # an Application object. context = Context(app=app, files=files, mode=mode, fm=self.fm, flags=flags, wait=wait, popen_kws=popen_kws, file=files and files[0] or None) if action is None: return self._log("No way of determining the action!") # Preconditions context.squash_flags() popen_kws = context.popen_kws # shortcut toggle_ui = True pipe_output = False wait_for_enter = False devnull = None if 'shell' not in popen_kws: popen_kws['shell'] = isinstance(action, str) # Set default shell for Popen if popen_kws['shell']: # This doesn't work with fish, see #300 if 'fish' not in os.environ['SHELL']: popen_kws['executable'] = os.environ['SHELL'] if 'stdout' not in popen_kws: popen_kws['stdout'] = sys.stdout if 'stderr' not in popen_kws: popen_kws['stderr'] = sys.stderr # Evaluate the flags to determine keywords # for Popen() and other variables if 'p' in context.flags: popen_kws['stdout'] = PIPE popen_kws['stderr'] = PIPE toggle_ui = False pipe_output = True context.wait = False if 's' in context.flags: devnull_writable = open(os.devnull, 'w') devnull_readable = open(os.devnull, 'r') for key in ('stdout', 'stderr'): popen_kws[key] = devnull_writable toggle_ui = False popen_kws['stdin'] = devnull_readable if 'f' in context.flags: toggle_ui = False context.wait = False if 'w' in context.flags: if not pipe_output and context.wait: # <-- sanity check wait_for_enter = True if 'r' in context.flags: # TODO: make 'r' flag work with pipes if 'sudo' not in get_executables(): return self._log("Can not run with 'r' flag, sudo is not installed!") f_flag = ('f' in context.flags) if isinstance(action, str): action = 'sudo ' + (f_flag and '-b ' or '') + action else: action = ['sudo'] + (f_flag and ['-b'] or []) + action toggle_ui = True context.wait = True if 't' in context.flags: if 'DISPLAY' not in os.environ: return self._log("Can not run with 't' flag, no display found!") term = get_term() if isinstance(action, str): action = term + ' -e ' + action else: action = [term, '-e'] + action toggle_ui = False context.wait = False popen_kws['args'] = action # Finally, run it if toggle_ui: self._activate_ui(False) try: error = None process = None self.fm.signal_emit('runner.execute.before', popen_kws=popen_kws, context=context) try: if 'f' in context.flags: # This can fail and return False if os.fork() is not # supported, but we assume it is, since curses is used. Popen_forked(**popen_kws) else: process = Popen(**popen_kws) except OSError as ex: error = ex self._log("Failed to run: %s\n%s" % (str(action), str(ex))) else: if context.wait: process.wait() elif process: self.zombies.add(process) if wait_for_enter: press_enter() finally: self.fm.signal_emit('runner.execute.after', popen_kws=popen_kws, context=context, error=error) if devnull: devnull.close() if toggle_ui: self._activate_ui(True) if pipe_output and process: return self(action='less', app='pager', # pylint: disable=lost-exception try_app_first=True, stdin=process.stdout) return process # pylint: disable=lost-exception
def execute(self): from ranger.ext.get_executables import get_term self.fm.run(get_term(), flags='f')
def execute(self): from ranger.ext.get_executables import get_term print(get_term()) self.fm.run("alacritty ", flags='f')