Crates.io | rmuxinator |
lib.rs | rmuxinator |
version | 2.0.0 |
source | src |
created_at | 2020-12-10 20:45:59.108548 |
updated_at | 2024-04-12 18:38:59.244195 |
description | tmux project configuration utility |
homepage | |
repository | https://github.com/ethagnawl/rmuxinator |
max_upload_size | |
id | 321584 |
size | 131,941 |
This project aims to be a successor to tmuxinator, which allows users to define tmux project profiles (e.g. open two windows, split each into three panes and run a series of commands in each). It is written in Rust and will be more dependable (config is typechecked where possible) and simpler to install. It's also a great excuse for me to learn more about Rust, its ecosystem and compiling/distributing binaries for various platforms.
cargo install rmuxinator
rmuxinator start samples/Example.toml
cargo build
cargo build && ./target/debug/rmuxinator start samples/Example.toml
./target/debug/rmuxinator start samples/Example.toml
cargo run
cargo run start samples/Example.toml
Projects are defined using toml.
For example:
attached = true
layout = "main-horizontal"
name = "example"
pane_name_user_option = "custom_pane_title"
start_directory = "/home/peter/projects/vim"
tmux_options = "-f /tmp/tmux.work.conf -L work-socket"
[[hooks]]
command = "run-shell \"tmux display-message 'Hi from pane-focus-in hook!'\""
name = "pane-focus-in"
[[windows]]
layout = "tiled"
name = "one"
start_directory = "/home/peter/projects/sample-project"
[[windows.panes]]
commands = ["echo pane-one"]
name = "Work"
[[windows.panes]]
commands = ["echo pane-two"]
name = "Music"
start_directory = "/home/peter/projects/rmuxinator/src"
[[windows.panes]]
commands = ["echo pane-three"]
name = "RSS"
[[windows.panes]]
commands = ["echo hi one", "echo intermediate one", "echo bye one"]
[[windows]]
name = "two"
start_directory = "/home/peter/projects/sample-project"
[[windows.panes]]
commands = ["echo pane-one"]
[[windows.panes]]
commands = ["echo pane-two"]
start_directory = "/home/peter/projects/rmuxinator/src"
[[windows.panes]]
commands = ["echo pane-three"]
[[windows.panes]]
commands = ["echo hi one", "echo intermediate one", "echo bye one"]
Optional attributes will be noted below.
name
(string)windows
(array; see dedicated entry)attached
(bool; defaults to true
; whether or not to attach to newly created tmux session)hooks
(array; see dedicated entry)layout
(string; preset tmux layouts: "even-horizontal", "even-vertical", "main-horizontal", "main-vertical", "tiled")pane_name_user_option
(string; must have matching entry in .tmux.conf (e.g. set -g pane-border-format "#{@custom_pane_title}"
)start_directory
(string)tmux_options
(string; CLI flags to pass through to tmux)command
(string; must use tmux's run_shell
; see tmux docs)name
(string; must match existing tmux hook (e.g. after-select-pane
); see tmux docs)panes
(array; see dedicated entry)layout
(string; preset tmux layouts: "even-horizontal", "even-vertical", "main-horizontal", "main-vertical", "tiled")name
(string)start_directory
(string)commands
(array of strings)name
(string)start_directory
(string)debug
Print the tmux commands that would be used to start and configure a tmux
session using a path to a project config file:
rmuxinator debug samples/Example.toml
start
Start a tmux session using a path to a project config file:
rmuxinator start samples/Example.toml
rmuxinator can also be used as a library by other programs.
There are two ways to achieve this:
This option accepts a path to an rmuxinator config file and is how the rmuxinator binary works. This is how this project's binary entrypoint works.
Example:
let config = rmuxinator::Config::new_from_config_path(&String::from("/home/pi/foo.toml")).map_err(|error| format!("Problem parsing config file: {}", error))?;
rmuxinator::run_start(config).map_err(|error| format!("Rmuxinator error: {}", error));
This option allows the caller to create an rmuxinator Config
struct and then pass it to the run_start
function.
The pi-wall-utils project (also maintained by ethagnawl) does this and can be used as a reference.
Example:
let rmuxinator_config = rmuxinator::Config {
attached: true,
hooks: vec![],
layout: None,
name: String::from("rmuxinator-library-example"),
windows: vec![
rmuxinator::Window {
layout: None,
name: None,
panes: vec![rmuxinator::Pane {
commands: vec![
String::from("echo 'hello!'"),
],
name: None,
start_directory: None,
}],
start_directory: None,
}
];
};
rmuxinator::run_start(rmuxinator_config).map_err(|error| format!("Rmuxinator error: {}", error))
If you provide a custom tmux config file via tmux_options, you may need to
restart your tmux server (tmux kill-server
) before some/all of its changes
will take effect. For example, changes to base-index
and pane-base-index
are known to require a restart in order to be detected and used as expected.
It might be possible to work around this issue but it needs more thought. The heavy handed option would be to have this library explicitly kill and restart the tmux server but that could have unintended consequences if other tmux sessions are in use.
This project is currently a proof of concept and I'll be duplicating tmuxinator features and adding additional improvements as I can find time. Right now, it's capable of:
tmux kill-window
was failing silentlyHere are the platforms rmuxinator is known to work on: