{"id":18423473,"url":"https://github.com/wabri/tmux-tsaheylu","last_synced_at":"2025-09-11T22:31:34.582Z","repository":{"id":176962701,"uuid":"659783580","full_name":"Wabri/Tmux-tsaheylu","owner":"Wabri","description":"A tmux plugin to connect you with tmux","archived":false,"fork":false,"pushed_at":"2025-02-21T14:23:12.000Z","size":7904,"stargazers_count":7,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-06T12:45:36.955Z","etag":null,"topics":["automate","bash","environment","linux","shell","tmux","tmux-plugins","tpm"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Wabri.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-06-28T14:50:12.000Z","updated_at":"2025-02-21T14:23:16.000Z","dependencies_parsed_at":"2024-11-06T04:37:27.368Z","dependency_job_id":"9a9bd41e-6703-41aa-9d90-9057a04c2d2d","html_url":"https://github.com/Wabri/Tmux-tsaheylu","commit_stats":null,"previous_names":["wabri/tmux-temp","wabri/tsaheylu"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Wabri/Tmux-tsaheylu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wabri%2FTmux-tsaheylu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wabri%2FTmux-tsaheylu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wabri%2FTmux-tsaheylu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wabri%2FTmux-tsaheylu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Wabri","download_url":"https://codeload.github.com/Wabri/Tmux-tsaheylu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wabri%2FTmux-tsaheylu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274717431,"owners_count":25336891,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-11T02:00:13.660Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automate","bash","environment","linux","shell","tmux","tmux-plugins","tpm"],"created_at":"2024-11-06T04:37:24.236Z","updated_at":"2025-09-11T22:31:33.731Z","avatar_url":"https://github.com/Wabri.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eTmux Tsaheylu\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/wabri/tmux-tsaheylu/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/wabri/tmux-tsaheylu?color=c678dd\u0026logoColor=e06c75\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/wabri/tmux-tsaheylu/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/wabri/tmux-tsaheylu?color=%23d19a66\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/wabri/tmux-tsaheylu/blob/main/LICENSE.md\"\u003e\u003cimg src=\"https://img.shields.io/github/license/wabri/tmux-tsaheylu?style=for-the-badge\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nYou can find the explanation of the name in the foot of this readme =\u003e \u003ca href=\"https://github.com/Wabri/Tmux-tsaheylu/tree/main#page_with_curl-the-name\"\u003ehere\u003c/a\u003e\n\u003c/p\u003e\n\n## :sparkles: Features\n\n### :rocket: Open Project\n\nIn the gif you can see the open_project feature in action:\n\n![open_project.gif](resources/open_project.gif)\n\nThose are the steps:\n\n- `prefix`–`W` =\u003e open the project selection\n- Select a project in the workspaces\n- Open a session with the name of project in the correct path\n\nWhen a project is selected, tsaheylu create, if not already exists, a session with name `workspace/group/project` that we have selected and set the directory of the window with that path.\n\n***Note: after the issue [#41](https://github.com/Wabri/Tmux-tsaheylu/issues/41) all the path containing : will be threated as a non worktree project***\n\n### :rocket: New Project\n\n![new.gif](resources/new.gif)\n\nThose are the steps:\n\n- `prefix`–`N` =\u003e open the type the name popup\n- Type the name of the project\n- Select a workspace (it is possible to create a new one)\n- Select a group of the workspace (it is possible to create a new one)\n\nThe project newly created have the git initialization already done without any remote.\n\n### :rocket: Clone a project\n\n![cloning_project.gif](resources/cloning_project.gif)\n\nThose are the steps:\n\n- `prefix`–`G` =\u003e open the cloning popup\n- Paste the url\n- Select a workspace (it is possible to create a new one)\n- Select a group of the workspace (it is possible to create a new one)\n\nAfter those selection the project will be clone as expected and once the project is correctly cloned than create a new session with the same rules used for [open project](#rocket-open-project).\n\n### :rocket: Manage gitworktree\n\n#### Add feature\n\n![add.gif](resources/add.gif)\n\nThose are the steps:\n\n- `prefix`–`g` =\u003e open the worktree manager\n- Type `add` =\u003e create a new worktree\n- Select the branch to checkout into that worktree\n\nAfter that last step a new worktree will be open and tmux move into it.\n\n#### List and move features\n\n![listandmove.gif](resources/listandmove.gif)\n\nThose are the steps:\n\n- `prefix`–`g` =\u003e open the worktree manager\n- Type `list` =\u003e list all the worktree active\n- Type `y` to do something else\n- Type `move` =\u003e move to an active worktree\n\n#### Remove feature\n\n![remove.gif](resources/remove.gif)\n\nThose are the steps:\n\n- `prefix`–`g` =\u003e open the worktree manager\n- Type `remove` =\u003e remove an existing worktree\n- Select the worktree to remove\n- Confirm the action with `y` =\u003e remove worktree and directory used for it\n\n### :rocket: Manage templates\n\nA template is a directory with files that are needed to be apply.\n\n![template.gif](resources/template.gif)\n\nThose are the steps:\n\n- `prefix`–`T` =\u003e open the template manager\n- Type `golang` =\u003e search the golang template\n- Apply the template\n  - In these case my template have only 1 change to apply\n  - Every changes will append the files if the file already exists, below the extended example:\n    ![template.gif](resources/template2.gif)\n\nBy default the directory where the template must be is `~/Templates/Tmux-Tsaheylu`, for example in my case I have those:\n\n```\n.\n└── Tmux-Tsaheylu\n    ├── Bash\n    ├── default\n    ├── GitCredentials\n    ├── Golang\n    └── Python3\n```\n\nWhen a template is added the file `.template.tsaheylu` is update with the name of the template in order to keep track of every template used in the project.\n\nNB: When a new [Worktree](#rocket-manage-gitworktree) is created all the template found in the worktree will be apply to the new one.\n\nNB2: Whenever a new [Clone](#rocket-clone-a-project) is done the default template is apply.\n\n## :wrench: Configuration\n\nThe default configuration:\n\n```bash\nset -g @workspace_dir '~/Workspaces'                # Set the workspaces bucket\nset -g @template_dir '~/Templates/Tmux-Tsaheylu'    # Set the templates bucket\nset -g @worktree_abilitate 'true'                   # Abilitate or not the worktree (true|false)\nset -g @bind_open_project 'W'                       # Change binding of [open project](#rocket-open-project)\nset -g @bind_cloning_project 'G'                    # Change binding of [cloning project](#rocket-clone_a_project)\nset -g @bind_template_selection 'T'                 # Change binding of [manage template](#rocket-manage-templates)\n```\n\n## :package: Installation\n\n### Via TPM (recommended)\n\nThe easiest way to install `tmux-tsaheylu` is via the [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm).\n\n1.  Add plugin to the list of TPM plugins in `.tmux.conf`:\n\n    ```tmux\n    set -g @plugin 'wabri/tmux-tsaheylu'\n    ```\n\n2.  Use `prefix`–`I` install `tmux-tsaheylu`. You should now be able to `tmux-tsaheylu` immediately.\n3.  When you want to update `tmux-tsaheylu` use `prefix`–`U`.\n\n### Manual Installation\n\n1.  Clone the repository\n\n    ```sh\n    $ git clone https://github.com/wabri/tmux-tsaheylu ~/clone/path\n    ```\n\n2.  Add this line to the bottom of `.tmux.conf`\n\n    ```tmux\n    run-shell ~/clone/path/tsaheylu.tmux\n    ```\n\n3.  Reload the `tmux` environment\n\n    ```sh\n    # type this inside tmux\n    $ tmux source-file ~/.tmux.conf\n    ```\n\nYou should now be able to use `tmux-tsaheylu` immediately.\n\n### Requirements\n\nIn order for `tmux-tsaheylu` to work, there must be [fzf](https://github.com/junegunn/fzf) installed.\n\n## :microscope: Method use to manage workspaces\n\n### Workspace structure\n\nThis plugin can manage workspaces that have at least 3 level consist in:\n\n- level 1: workspace\n- level 2: group\n- level 3: project\n- level 4(optional): worktree\n\nBelow you can find some explanation!\n\n### Top down explanation\n\n#### The workspaces bucket\n\n![workspace_bucket](resources/workspace_bucket.png)\n\n#### Inside the bucket there are a lot of workspaces\n\n![workspaces](resources/workspaces.png)\n\n#### Inside a single workspace there are a lot of groups\n\n![groups](resources/groups.png)\n\n#### Inside a group there are a lot of projects\n\n![projects](resources/projects.png)\n\n#### Inside a project there are one or more worktrees\n\n![worktree](resources/worktree.png)\n\nAnd yes the worktrees are rapresented as triangles because they are trees.\n\n### The problems\n\nOn my daily job I have 3 main problem:\n\n1. many hosting server or clients where i need to work on (including my personal projects), let's call them **Workspaces**\n2. on every workspaces I need to sort every projects based on the ownership, let's call them **Groups**\n3. I work on different **Projects**\n   - some of them needs time to be accepted or tested and this could take a lot of times\n   - some of them have different static branches and don't want to checkout everytime in one to another\n   - more that don't remember :)\n\nTo solve this I create the **WGPW** method (I swear that the fact that my alias is **W**abri and my real name is **G**abriele **P**uliti is a coincidence). This method consist in organize every single project in directory and subdirectory like this:\n\n**W**orkspace/**G**roup/**P**roject/**W**orktree\n\nWGPW is a method (I'm still thinking about change the name with a more easy to remember one) of micromanaging the projects: every project is open as a [git-worktree](https://git-scm.com/docs/git-worktree) in a related group of a defined workspace.\n\n### Why works? (at least for me)\n\n- Because if I do not remember the name of the project, maybe I remember the owner or the client\n- Because if I need to copy paste something from a branch to another I do not want to stash, checkout, copy, checkout, pop the stash, paste (yes the existence of cherry-pic solve this issue, but not when you need only a part of the commit)\n- More then one clients means more than one git authentication and/or ssh keys. using this method is possible to use direnv or gitconfig sourcing without micromanaging or solve a bad commit sign\n- This method fit perfectly with management through direnv and asdf (and I use both of them)\n\n## :page_with_curl: The name\n\nThe name comes from the Avatar film:\n\n```\nThe Na'vi can commune with animals on their planet by literally plugging their\nbraid into the creatures' nerve systems.\n\nTo become a warrior, a Na'vi must tame and ride a flying creature known as\nIkran.\n\nThe Na'vi also use this neural bonding system, called \"tsaheylu\", to mate with\na \"life partner\", a bond that, when made, cannot be broken in the Na'vi's\nlifetime.\n```\n\nIn this case Ikran is rappresented by Tmux. This plugin recall the connection from us and tmux, but also from all the tool we use in our personal development environment such direnv and asdf, but also neovim and lsp.\n\nI tend to be very precise in the organization of projects, this allow me to make the best use of tools such as asdf and direnv. Using the method I explained above ([Method use to manage workspaces](#microscope-method-use-to-manage-workspaces)) I can define an environment for each level so that I can move from one project to the next without problems and without worrying about: environment variables, create commits with the wrong user or run something in the wrong cloud.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwabri%2Ftmux-tsaheylu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwabri%2Ftmux-tsaheylu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwabri%2Ftmux-tsaheylu/lists"}