예제 #1
0
class TmuxDirPlugin:
    """TmuxDirPlugin."""
    def __init__(self, nvim: nvim.Nvim) -> None:
        """Constructor of TmuxDirPlugin."""
        self.nvim = nvim
        self.plugin_name = "tmuxdir"

        # nvim settings
        self.root_markers: List[str] = self.nvim.eval("TmuxdirRootMarkers()")
        self.base_dirs: List[str] = self.nvim.eval("TmuxdirBaseDirs()")
        self._eager_mode: bool = self.nvim.eval("TmuxdirEagerMode()")

        self.dir_mngr = DirMngr(
            base_dirs=self.base_dirs,
            root_markers=self.root_markers,
            eager_mode=self._eager_mode,
        )

        self.tmux_dir = TmuxDirFacade(self.base_dirs, self.root_markers)
        try:
            self.tmux_dir._check_tmux_bin()
        except TmuxFacadeException as e:
            echoerr(self.nvim, str(e), self.plugin_name)

    def tmuxdir_add(self, args: List) -> List[str]:
        root_dir = expanduser_raise_if_not_dir(args[0])
        return self.tmux_dir.add(root_dir)

    def tmuxdir_clear_added(self, args: List) -> bool:
        root_dir = expanduser_raise_if_not_dir(args[0])
        return self.tmux_dir.clear_added_dir(root_dir)

    def tmuxdir_list_added(self) -> List[str]:
        return list(self.tmux_dir.dirs.keys())

    def tmuxdir_clear_added_dirs(self) -> bool:
        return self.tmux_dir.clear_added_dirs()

    def tmuxdir_ignore(self, args: List) -> bool:
        root_dir = expanduser_raise_if_not_dir(args[0])
        return self.tmux_dir.ignore(root_dir)

    def tmuxdir_clear_ignored(self, args: List) -> bool:
        root_dir = expanduser_raise_if_not_dir(args[0])
        return self.tmux_dir.clear_ignored_dir(root_dir)

    def tmuxdir_list_ignored(self) -> List[str]:
        return list(self.tmux_dir.ignored_dirs.keys())

    def tmuxdir_clear_ignored_dirs(self, args: List) -> bool:
        return self.tmux_dir.clear_ignored_dirs()

    def check_tmux_bin(self) -> bool:
        return self.tmux_dir._check_tmux_bin()
예제 #2
0
class Source(Base):
    def __init__(self, vim):
        super().__init__(vim)

        self.name: str = "tmux_dir"
        self.kind: str = "tmux_dir"
        self.vim = vim
        self.sort_by: str = "word"
        self.sort_reversed: bool = True

    def highlight(self):
        self.vim.command("highlight default link {} Special".format(
            self.syntax_name))

    def define_syntax(self):
        super().define_syntax()

    def gather_candidates(self, context):

        try:
            self.tmuxf = TmuxDirFacade(
                base_dirs=self.vim.eval("TmuxdirBaseDirs()"),
                root_markers=self.vim.eval("TmuxdirRootMarkers()"),
            )
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))

        candidates = []
        for dir_path in self.tmuxf.list_dirs():
            candidates.append({"word": dir_path})
        return sorted(candidates,
                      key=lambda x: x[self.sort_by],
                      reverse=self.sort_reversed)
예제 #3
0
    def gather_candidates(self, context):

        try:
            self.tmuxf = TmuxDirFacade(
                base_dirs=self.vim.eval("TmuxdirBaseDirs()"),
                root_markers=self.vim.eval("TmuxdirRootMarkers()"),
            )
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))

        candidates = []
        for dir_path in self.tmuxf.list_dirs():
            candidates.append({"word": dir_path})
        return sorted(candidates,
                      key=lambda x: x[self.sort_by],
                      reverse=self.sort_reversed)
예제 #4
0
    def __init__(self, vim) -> None:
        super().__init__(vim)

        self.name = "tmux_dir"
        self.default_action = "open"
        self.vim = vim
        self.has_nvim = self.vim.eval("has('nvim')")
        self.vim_bin_path = "vim"
        if self.has_nvim:
            self.vim_bin_path = "nvim"
        try:
            self.root_markers: List[str] = self.vim.eval(
                "TmuxdirRootMarkers()")
            self.base_dirs: List[str] = self.vim.eval("TmuxdirBaseDirs()")
            self.tmux_dir = TmuxDirFacade(self.base_dirs, self.root_markers)
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))
예제 #5
0
    def __init__(self, vim: vim.Nvim) -> None:
        """Constructor of TmuxDirPlugin."""
        self.vim = vim
        self.plugin_name = "tmuxdir"

        # vim settings
        self.root_markers: List[str] = self.vim.eval("TmuxdirRootMarkers()")
        self.base_dirs: List[str] = self.vim.eval("TmuxdirBaseDirs()")

        self.dir_mngr = DirMngr(
            base_dirs=self.base_dirs, root_markers=self.root_markers
        )

        self.tmux_dir = TmuxDirFacade(self.base_dirs, self.root_markers)
        try:
            self.tmux_dir._check_tmux_bin()
        except TmuxFacadeException as e:
            echoerr(self.vim, str(e), self.plugin_name)
예제 #6
0
class Kind(Openable):
    def __init__(self, vim) -> None:
        super().__init__(vim)

        self.name = "tmux_dir"
        self.default_action = "open"
        self.vim = vim
        self.has_nvim = self.vim.eval("has('nvim')")
        self.vim_bin_path = "vim"
        if self.has_nvim:
            self.vim_bin_path = "nvim"
        try:
            self.root_markers: List[str] = self.vim.eval(
                "TmuxdirRootMarkers()")
            self.base_dirs: List[str] = self.vim.eval("TmuxdirBaseDirs()")
            self.tmux_dir = TmuxDirFacade(self.base_dirs, self.root_markers)
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))

    def action_open(self, context) -> None:
        """Open project dir in a tmux session. If the tmux dir session is already
        open, it switches to the session."""

        dir_path = context["targets"][0]["word"]
        session_name = self.tmux_dir.dir_to_session_name(dir_path=dir_path)

        if not self.tmux_dir.sessions().get(session_name):
            self.tmux_dir.create(
                session_name=session_name,
                vim_bin_path=self.vim_bin_path,
                start_directory=dir_path,
            )
        try:
            self.tmux_dir.switch(session_name=session_name)
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))

    def action_delete(self, context) -> None:
        """Ignore selected directory tmux session(s)."""
        if not util.confirm(
                self.vim,
                "Ignoring directory {}. Proceed?".format(
                    [dirs["word"] for dirs in context["targets"]]),
        ):
            return
        try:
            for item in context["targets"]:
                dir_path = item["word"]
                self.tmux_dir.ignore(input_dir=dir_path)
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))
예제 #7
0
class Kind(Openable):
    def __init__(self, vim) -> None:
        super().__init__(vim)

        self.name = "tmux_dir"
        self.default_action = "open"
        self.vim = vim
        self.has_nvim = self.vim.eval("has('nvim')")
        self.vim_bin_path = "vim"
        self.max_sessions = 10
        if self.has_nvim:
            self.vim_bin_path = "nvim"
        try:
            self.root_markers: List[str] = self.vim.eval("TmuxdirRootMarkers()")
            self.base_dirs: List[str] = self.vim.eval("TmuxdirBaseDirs()")
            self.tmux_dir = TmuxDirFacade(self.base_dirs, self.root_markers)
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))

    def action_open(self, context: dict) -> None:
        """Open project dir in a tmux session. If the tmux dir session is already
        open, it switches to the session."""

        dir_path = context["targets"][0]["word"]
        session_name = self.tmux_dir.dir_to_session_name(dir_path=dir_path)

        if not self.tmux_dir.sessions().get(session_name):
            self.tmux_dir.create(
                session_name=session_name,
                vim_bin_path=self.vim_bin_path,
                start_directory=os.path.expanduser(dir_path),
            )
        try:
            self.tmux_dir.switch(session_name=session_name)
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))

    def action_new(self, context: dict) -> None:
        """Open the project dir in a new tmux session."""

        dir_path = context["targets"][0]["word"]
        session_name = self.tmux_dir.dir_to_session_name(dir_path=dir_path)

        for i in range(self.max_sessions + 1):
            if i == 0:
                new_session_name = session_name
            else:
                new_session_name = f"{session_name}-{i}"

            if not self.tmux_dir.sessions().get(new_session_name):
                if dir_path.endswith(f"-{i}"):
                    dir_path = dir_path[:-len(f"-{i}")]
                self.tmux_dir.create(
                    session_name=new_session_name,
                    vim_bin_path=self.vim_bin_path,
                    start_directory=os.path.expanduser(dir_path),
                )
                try:
                    self.tmux_dir.switch(session_name=new_session_name)
                except TmuxDirFacadeException as e:
                    util.error(self.vim, str(e))
                return

        util.error(
            self.vim,
            f"Maximum number of sessions {self.max_sessions} for this dir "
            f"{dir_path} has been reached.",
        )

    def action_delete(self, context: dict) -> None:
        """Ignore selected directory tmux session(s)."""
        if not util.confirm(
            self.vim,
            "Ignoring directory {}. Proceed?".format(
                [dirs["word"] for dirs in context["targets"]]
            ),
        ):
            return
        try:
            for item in context["targets"]:
                dir_path = item["word"]
                self.tmux_dir.ignore(input_dir=dir_path)
        except TmuxDirFacadeException as e:
            util.error(self.vim, str(e))