def open_temp_file(self, c, d, fn, testing=False): ''' Open a temp file corresponding to fn in an external editor. d is a dictionary created from an @openwith settings node. 'args': the command-line arguments to be used to open the file. 'ext': the file extension. 'kind': the method used to open the file, such as subprocess.Popen. 'name': menu label (used only by the menu code). 'shortcut': menu shortcut (used only by the menu code). ''' trace = False and not g.unitTesting testing = testing or g.unitTesting arg_tuple = d.get('args', []) arg = ' '.join(arg_tuple) kind = d.get('kind') # This doesn't handle %ProgramFiles% # if kind in ('os.spawnl', 'subprocess.Popen'): # if not g.os_path_exists(arg): # g.trace('Executable not found', arg, arg_tuple) # return try: # All of these must be supported because they # could exist in @open-with nodes. command = '<no command>' if kind in ('os.system', 'os.startfile'): # New in Leo 5.7: # Use subProcess.Popen(..., shell=True) c_arg = self.join(arg, fn) if trace: command = '%s -> subprocess.Popen(%s)' % ( kind, g.shortFileName(c_arg)) g.trace(command) if not testing: try: subprocess.Popen(c_arg, shell=True) except OSError: g.es_print('c_arg', repr(c_arg)) g.es_exception() # Legacy code. # command = 'os.startfile(%s)' % self.join(arg, fn) # if trace: g.trace(command) # # pylint: disable=no-member # # trust the user not to use this option on Linux. # if not testing: # os.startfile(arg, fn) elif kind == 'exec': g.es_print('open-with exec no longer valid.') # command = 'exec(%s)' % self.join(arg,fn) # if trace: g.trace(command) # if not testing: # exec(self.join(arg,fn),{},{}) elif kind == 'os.spawnl': filename = g.os_path_basename(arg) command = 'os.spawnl(%s,%s,%s)' % (arg, filename, fn) if trace: g.trace(command) if not testing: os.spawnl(os.P_NOWAIT, arg, filename, fn) elif kind == 'os.spawnv': filename = os.path.basename(arg_tuple[0]) vtuple = arg_tuple[1:] vtuple.insert(0, filename) # add the name of the program as the first argument. # Change suggested by Jim Sizelove. vtuple.append(fn) command = 'os.spawnv(%s)' % (vtuple) if trace: g.trace(command) if not testing: os.spawnv(os.P_NOWAIT, arg[0], vtuple) #??? elif kind == 'subprocess.Popen': c_arg = self.join(arg, fn) command = 'subprocess.Popen(%s)' % c_arg if trace: g.trace(command) if not testing: try: subprocess.Popen(c_arg, shell=True) except OSError: g.es_print('c_arg', repr(c_arg)) g.es_exception() elif g.isCallable(kind): # Invoke openWith like this: # c.openWith(data=[func,None,None]) # func will be called with one arg, the filename if trace: g.trace('%s(%s)' % (kind, fn)) command = '%s(%s)' % (kind, fn) if not testing: kind(fn) else: command = 'bad command:' + str(kind) if not testing: g.trace(command) return command # for unit testing. except Exception: g.es('exception executing open-with command:', command) g.es_exception() return 'oops: %s' % command
def open_temp_file(self, c, d, fn, testing=False): ''' Open a temp file corresponding to fn in an external editor. d is a dictionary created from an @openwith settings node. 'args': the command-line arguments to be used to open the file. 'ext': the file extension. 'kind': the method used to open the file, such as subprocess.Popen. 'name': menu label (used only by the menu code). 'shortcut': menu shortcut (used only by the menu code). ''' trace = False and not g.unitTesting testing = testing or g.unitTesting arg_tuple = d.get('args', []) arg = ' '.join(arg_tuple) kind = d.get('kind') try: # All of these must be supported because they # could exist in @open-with nodes. command = '<no command>' if kind == 'os.startfile': command = 'os.startfile(%s)' % self.join(arg, fn) if trace: g.trace(command) # pylint: disable=no-member # trust the user not to use this option on Linux. if not testing: os.startfile(self.join(arg, fn)) elif kind == 'exec': g.es_print('open-with exec no longer valid.') # command = 'exec(%s)' % self.join(arg,fn) # if trace: g.trace(command) # if not testing: # exec(self.join(arg,fn),{},{}) elif kind == 'os.spawnl': filename = g.os_path_basename(arg) command = 'os.spawnl(%s,%s,%s)' % (arg, filename, fn) if trace: g.trace(command) if not testing: os.spawnl(os.P_NOWAIT, arg, filename, fn) elif kind == 'os.spawnv': filename = os.path.basename(arg_tuple[0]) vtuple = arg_tuple[1:] vtuple.insert(0, filename) # add the name of the program as the first argument. # Change suggested by Jim Sizelove. vtuple.append(fn) command = 'os.spawnv(%s)' % (vtuple) if trace: g.trace(command) if not testing: os.spawnv(os.P_NOWAIT, arg[0], vtuple) #??? elif kind == 'subprocess.Popen': c_arg = self.join(arg, fn) command = 'subprocess.Popen(%s)' % c_arg if trace: g.trace(command) if not testing: try: subprocess.Popen(c_arg, shell=True) except OSError: g.es_print('c_arg', repr(c_arg)) g.es_exception() elif g.isCallable(kind): # Invoke openWith like this: # c.openWith(data=[func,None,None]) # func will be called with one arg, the filename if trace: g.trace('%s(%s)' % (kind, fn)) command = '%s(%s)' % (kind, fn) if not testing: kind(fn) else: command = 'bad command:' + str(kind) if not testing: g.trace(command) return command # for unit testing. except Exception: g.es('exception executing open-with command:', command) g.es_exception() return 'oops: %s' % command
def open_file_in_external_editor(self, c, d, fn, testing=False): ''' Open a file fn in an external editor. This will be an entire external file, or a temp file for a single node. d is a dictionary created from an @openwith settings node. 'args': the command-line arguments to be used to open the file. 'ext': the file extension. 'kind': the method used to open the file, such as subprocess.Popen. 'name': menu label (used only by the menu code). 'p': the nearest @<file> node, or None. 'shortcut': menu shortcut (used only by the menu code). ''' testing = testing or g.unitTesting arg_tuple = d.get('args', []) arg = ' '.join(arg_tuple) kind = d.get('kind') try: # All of these must be supported because they # could exist in @open-with nodes. command = '<no command>' if kind in ('os.system', 'os.startfile'): # New in Leo 5.7: # Use subProcess.Popen(..., shell=True) c_arg = self.join(arg, fn) if not testing: try: subprocess.Popen(c_arg, shell=True) except OSError: g.es_print('c_arg', repr(c_arg)) g.es_exception() elif kind == 'exec': g.es_print('open-with exec no longer valid.') elif kind == 'os.spawnl': filename = g.os_path_basename(arg) command = 'os.spawnl(%s,%s,%s)' % (arg, filename, fn) if not testing: os.spawnl(os.P_NOWAIT, arg, filename, fn) elif kind == 'os.spawnv': filename = os.path.basename(arg_tuple[0]) vtuple = arg_tuple[1:] vtuple.insert(0, filename) # add the name of the program as the first argument. # Change suggested by Jim Sizelove. vtuple.append(fn) command = 'os.spawnv(%s)' % (vtuple) if not testing: os.spawnv(os.P_NOWAIT, arg[0], vtuple) #??? elif kind == 'subprocess.Popen': c_arg = self.join(arg, fn) command = 'subprocess.Popen(%s)' % c_arg if not testing: try: subprocess.Popen(c_arg, shell=True) except OSError: g.es_print('c_arg', repr(c_arg)) g.es_exception() elif g.isCallable(kind): # Invoke openWith like this: # c.openWith(data=[func,None,None]) # func will be called with one arg, the filename command = '%s(%s)' % (kind, fn) if not testing: kind(fn) else: command = 'bad command:' + str(kind) if not testing: g.trace(command) return command # for unit testing. except Exception: g.es('exception executing open-with command:', command) g.es_exception() return 'oops: %s' % command