Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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
Beispiel #9
0
    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)
Beispiel #10
0
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)
Beispiel #11
0
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)
Beispiel #12
0
    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']
Beispiel #13
0
    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)