def _new_file(view: View, defx: Defx, context: Context) -> None: """ Create a new file and it's parent directories. """ candidate = view.get_cursor_candidate(context.cursor) if not candidate: return if candidate['is_opened_tree'] or candidate['is_root']: cwd = str(candidate['action__path']) else: cwd = str(Path(candidate['action__path']).parent) new_filename = cwd_input( view._vim, cwd, 'Please input a new filename: ', '', 'file') if not new_filename: return isdir = new_filename[-1] == '/' filename = Path(cwd).joinpath(new_filename) if not filename: return if filename.exists(): error(view._vim, f'{filename} already exists') return if isdir: filename.mkdir(parents=True) else: filename.parent.mkdir(parents=True, exist_ok=True) filename.touch() view.redraw(True) view.search_recursive(filename, defx._index)
def _paste(view: View, defx: Defx, context: Context) -> None: candidate = view.get_cursor_candidate(context.cursor) if not candidate: return cwd = str(Path(candidate['action__path']).parent) action = view._clipboard.action dest = None for index, candidate in enumerate(view._clipboard.candidates): path = candidate['action__path'] dest = Path(cwd).joinpath(path.name) if dest.exists(): overwrite = check_overwrite(view, dest, path) if overwrite == Path(''): continue dest = overwrite if path == dest: continue view.print_msg( f'[{index + 1}/{len(view._clipboard.candidates)}] {path}') if action == ClipboardAction.COPY: if path.is_dir(): shutil.copytree(str(path), dest) else: shutil.copy2(str(path), dest) elif action == ClipboardAction.MOVE: shutil.move(str(path), cwd) view._vim.command('redraw') view._vim.command('echo') view.redraw(True) if dest: view.search_file(dest, defx._index)
def _new_directory(self, view: View, defx: Defx, context: Context) -> None: """ Create a new directory. """ candidate = view.get_cursor_candidate(context.cursor) if not candidate: return if candidate['is_opened_tree'] or candidate['is_root']: cwd = str(candidate['action__path']) else: cwd = str(Path(candidate['action__path']).parent) new_filename = self.input(view, defx, cwd, 'Please input a new directory name: ', '', 'file') if not new_filename: return filename = self.path_maker(cwd).joinpath(new_filename) if not filename: return if filename.exists(): error(view._vim, f'{filename} already exists') return filename.mkdir(parents=True) view.redraw(True) view.search_recursive(filename, defx._index)
def _new_multiple_files(self, view: View, defx: Defx, context: Context) -> None: """ Create multiple files. """ candidate = view.get_cursor_candidate(context.cursor) if not candidate: return if candidate['is_opened_tree'] or candidate['is_root']: cwd = str(candidate['action__path']) else: cwd = str(Path(candidate['action__path']).parent) isopen = len(context.args) > 0 and context.args[0] == 'open' command = context.args[1] if len(context.args) > 1 else 'edit' str_filenames = self.input(view, defx, cwd, 'Please input new filenames: ', '', 'file') if not str_filenames: return None for name in shlex.split(str_filenames): isdir = name[-1] == '/' filename = self.path_maker(cwd).joinpath(name) if filename.exists(): error(view._vim, f'{filename} already exists') continue self.create_open(view, defx, context, filename, command, isdir, isopen)
def _new_file(self, view: View, defx: Defx, context: Context) -> None: """ Create a new file and it's parent directories. """ candidate = view.get_cursor_candidate(context.cursor) if not candidate: return if candidate['is_opened_tree'] or candidate['is_root']: cwd = str(candidate['action__path']) else: cwd = str(Path(candidate['action__path']).parent) new_filename = self.input(view, defx, cwd, 'Please input a new filename: ', '', 'file') if not new_filename: return isdir = new_filename[-1] == '/' filename = self.path_maker(cwd).joinpath(new_filename) if not filename: return if filename.exists(): error(view._vim, f'{filename} already exists') return isopen = len(context.args) > 0 and context.args[0] == 'open' command = context.args[1] if len(context.args) > 1 else 'edit' self.create_open(view, defx, context, filename, command, isdir, isopen)
def _paste(view: View, defx: Defx, context: Context) -> None: candidate = view.get_cursor_candidate(context.cursor) if not candidate: return if candidate['is_opened_tree'] or candidate['is_root']: cwd = str(candidate['action__path']) else: cwd = str(Path(candidate['action__path']).parent) action = view._clipboard.action dest = None for index, candidate in enumerate(view._clipboard.candidates): path = candidate['action__path'] dest = Path(cwd).joinpath(path.name) if dest.exists(): overwrite = check_overwrite(view, dest, path) if overwrite == Path(''): continue dest = overwrite if not path.exists() or path == dest: continue view.print_msg( f'[{index + 1}/{len(view._clipboard.candidates)}] {path}') if action == ClipboardAction.COPY: if path.is_dir(): shutil.copytree(str(path), dest) else: shutil.copy2(str(path), dest) elif action == ClipboardAction.MOVE: if dest.exists(): # Must remove dest before if dest.is_dir(): shutil.rmtree(str(dest)) else: dest.unlink() shutil.move(str(path), cwd) # Check rename if not path.is_dir(): view._vim.call('defx#util#buffer_rename', view._vim.call('bufnr', str(path)), str(dest)) view._vim.command('redraw') if action == ClipboardAction.MOVE: # Clear clipboard after move view._clipboard.candidates = [] view._vim.command('echo') view.redraw(True) if dest: view.search_recursive(dest, defx._index)
def _preview(view: View, defx: Defx, context: Context) -> None: candidate = view.get_cursor_candidate(context.cursor) if not candidate or candidate['action__path'].is_dir(): return filepath = str(candidate['action__path']) guess_type = mimetypes.guess_type(filepath)[0] if (guess_type and guess_type.startswith('image/') and shutil.which('ueberzug') and shutil.which('bash')): _preview_image(view, defx, context, candidate) return _preview_file(view, defx, context, candidate)
def do_action(view: View, defx: Defx, action_name: str, context: Context) -> bool: """ Do "action_name" action. """ if not defx._source: return True actions: typing.Dict[str, ActionTable] = defx._source.kind.get_actions() if action_name not in actions: return True action = actions[action_name] selected_candidates = [x for x in view._candidates if x['is_selected']] if (selected_candidates and ActionAttr.NO_TAGETS not in action.attr and ActionAttr.TREE not in action.attr): # Clear marks for candidate in selected_candidates: candidate['is_selected'] = False view.redraw() if ActionAttr.CURSOR_TARGET in action.attr: # Use cursor candidate only cursor_candidate = view.get_cursor_candidate(context.cursor) if not cursor_candidate: return True context = context._replace( targets=[cursor_candidate], ) action.func(view, defx, context) if action_name != 'repeat': view._prev_action = action_name if ActionAttr.MARK in action.attr: # Update marks view.update_candidates() view.redraw() elif ActionAttr.TREE in action.attr: view.update_candidates() view.redraw() elif ActionAttr.REDRAW in action.attr: # Redraw view.redraw(True) return False
def _paste(self, view: View, defx: Defx, context: Context) -> None: candidate = view.get_cursor_candidate(context.cursor) action = view._clipboard.action if not candidate or action == ClipboardAction.NONE: return if candidate['is_opened_tree'] or candidate['is_root']: cwd = str(candidate['action__path']) else: cwd = str(Path(candidate['action__path']).parent) dest = None for index, candidate in enumerate(view._clipboard.candidates): path = candidate['action__path'] dest = self.path_maker(cwd).joinpath(path.name) if dest.exists(): overwrite = self.check_overwrite(view, dest, path) if overwrite == self.path_maker(''): continue dest = overwrite if not path.exists() or path == dest: continue view.print_msg( f'[{index + 1}/{len(view._clipboard.candidates)}] {path}') if dest.exists() and action != ClipboardAction.MOVE: # Must remove dest before if not dest.is_symlink() and dest.is_dir(): self.rmtree(dest) else: dest.unlink() self.paste(view, path, dest, cwd) view._vim.command('redraw') if action == ClipboardAction.MOVE: # Clear clipboard after action view._clipboard.action = ClipboardAction.NONE view._clipboard.candidates = [] view._vim.command('echo') view.redraw(True) if dest: view.search_recursive(dest, defx._index)
def _new_directory(view: View, defx: Defx, context: Context) -> None: """ Create a new directory. """ candidate = view.get_cursor_candidate(context.cursor) if not candidate: return filename = cwd_input(view._vim, str(Path(candidate['action__path']).parent), 'Please input a new filename: ', '', 'file') if not filename: return if filename.exists(): error(view._vim, f'{filename} already exists') return filename.mkdir(parents=True) view.redraw(True) view.search_file(filename, defx._index)
def _new_multiple_files(view: View, defx: Defx, context: Context) -> None: """ Create multiple files. """ candidate = view.get_cursor_candidate(context.cursor) if not candidate: return if candidate['is_opened_tree'] or candidate['is_root']: cwd = str(candidate['action__path']) else: cwd = str(Path(candidate['action__path']).parent) save_cwd = view._vim.call('getcwd') cd(view._vim, cwd) str_filenames: str = view._vim.call('input', 'Please input new filenames: ', '', 'file') cd(view._vim, save_cwd) if not str_filenames: return None for name in str_filenames.split(): is_dir = name[-1] == '/' filename = Path(cwd).joinpath(name) if filename.exists(): error(view._vim, f'{filename} already exists') continue if is_dir: filename.mkdir(parents=True) else: if not filename.parent.exists(): filename.parent.mkdir(parents=True) filename.touch() view.redraw(True) view.search_recursive(filename, defx._index)
def _toggle_select(self, view: View, defx: Defx, context: Context) -> None: candidate = view.get_cursor_candidate(context.cursor) if not candidate: return candidate['is_selected'] = not candidate['is_selected']
def _preview(self, view: View, defx: Defx, context: Context) -> None: candidate = view.get_cursor_candidate(context.cursor) if not candidate or candidate['action__path'].is_dir(): return self.preview_file(view, defx, context, candidate)