# Rusmux - tmux automation
The main purpose of this project is to serve as a substitute for [tmuxinator](https://github.com/tmuxinator/tmuxinator), while still utilizing its yaml files.
`tmuxinator`, which is written in Ruby, has had instances of breaking due to updates in packages/gems,
having me scrambling for a solution.
Furthermore, the process of installing it on different servers that lack a Ruby installation proved to be tedious.
Hence, [rusmux](https://github.com/MeirKriheli/rusmux) was created. It served as a chance for me to:
* Utilize the existing `.yml` project files from `tmuxinator`.
* Generate a standalone binary that can be easily distributed.
* Enhance my skills and comprehension of [Rust](https://www.rust-lang.org/) and its associated tools.
## Example
```sh
cat ~/.config/rusmux/demo.yml
```
```yaml
project_name: demo # can also use name
project_root: ~/src/demo
on_project_start:
- sudo systemctl start postgresql
- sudo systemctl start mysqld
# on_project_stop:
pre_window:
- workon demo
- cd demo
windows:
- editor: vim
- shells:
layout: main-vertical
root: ~/src/demo/code # Optional per window root overriding `project_root`
options: # per window options
main-pane-width: 60%
panes:
- #
- grunt serve
- remote-log: # name is meaningless, for multi commands
- ssh me@example.com
- cd /var/logs
- tail -f project.log
- mail: python -m smtpd -n -c DebuggingServer localhost:1025
```
## Install
* Arch Linux users can install [rusmux from AUR](https://aur.archlinux.org/packages/rusmux),
e.g. (using `paru`):
```sh
paru -S rusmux
```
* Get a compiled binary from the
[Releases](https://github.com/MeirKriheli/rusmux/releases) page and place it
in your `$PATH`.
* With `cargo`:
```sh
cargo install rusmux
```
* With shell script, for the specific version, see the [release page](https://github.com/MeirKriheli/rusmux/releases/latest/), e.g:
```sh
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/MeirKriheli/rusmux/releases/download/v0.x.y/rusmux-installer.sh | sh
```
## Commands
* Run a project
```sh
rusmux run [project]
rusmux start [project]
```
* List all existing projects
```sh
rusmux list
```
* Output shell commands for a project
```sh
rusmux debug [project]
```
* Edit an existing project (`$EDITOR` should be set)
```sh
rusmux edit [project]
```
* Stop project's session
```sh
rusmux stop [project]
rusmux kill [project]
```
* Delete an existing project (after confirmation)
```sh
rusmux delete [project]
```
* Create a new project, and open it in an editor (`$EDITOR` should be set)
```sh
rusmux new [project]
```
This creates the project from default template. To create one with just the
project name:
```sh
rusmux new [project] --blank
```
* Copy an existing project to a new one and edit it (`$EDITOR` should be set)
```sh
rusmux copy [existing] [new]
```
* Check your environment for potential issues
```sh
rusmux doctor
```
Checks for `tmux` in `$PATH` and `$SHELL` & `$EDITOR` are set.
> **NOTE** In the commands above, `project`, `existing` and `new` can be:
>
> * A simple name, like `my_project`, `awesome_server`, which will be created with a `yaml` extension in the config directory.
> * A path to a file (determined by an extension and/or path separator), e.g. `~/projects/my_project/session.yaml`.