Disconnected is a simple tmux session creator. Using JSON you can specify how many windows you want, and what commands to run in each of those windows.
- To setup Disconnected, ensure that you have Deno installed on your machine.
- Run the following command
deno compile --allow-read --allow-env --allow-write --allow-run --output ./dist/disconnected index.tsor you can download the most recent release in the releases.
- This will generate a disconnected executable that you can run on your machine. You can add this directory to your path, or toss it in the bin folder with your shell.
cp ./dist/disconnected /usr/local/binNOTE: Depending on your user permissions you may need to run this with sudo.
- After you have disconnected added to path run
disconnectedor
disconnected initThis will create the necessary folders and files in the ~/.config/disconnected folder so that disconnected can save settings.
- Create a new config file with
disconnected new NameOfServicewith nameOfService being whatever you would like to call the config file
- You'll be presented with a json file in your editor of choice that you can modify and edit to setup your sessions.
To have new splits open in the current pane's directory, add the following to your ~/.tmux.conf:
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
Then reload your config:
tmux source-file ~/.tmux.confdeno compile --allow-read --allow-env --allow-write --allow-run --output ./dist/disconnected index.ts
chmod +x ./dist/disconnected
| Command | Description |
|---|---|
disconnected init |
Create config directory and files |
disconnected start <name> |
Start or attach to a tmux session from a config file |
disconnected list |
List all config files |
disconnected new <name> |
Create a new config file (opens in editor) |
disconnected edit <name> |
Edit an existing config file |
disconnected rm <name> |
Delete a config file |
disconnected capture <session> [outputName] |
Capture a running tmux session into a config file |
Here is the sample config file that is generated for you
{
"name": "SampleBaseConfig",
"basePath": "~/",
"startingWindow": "1",
"windows": [
{
"name": "listfiles",
"basePath": "",
"commands": ["ls"],
"shouldCloseAfterCommand": false,
"concatenateBasePathToGlobalBasePath": false
},
{
"name": "htop",
"basePath": "",
"commands": ["htop"],
"shouldCloseAfterCommand": true,
"concatenateBasePathToGlobalBasePath": false
}
]
}
name: This will be the name of the tmux session
basePath: This will be the base path for your project you are working in.
startingWindow: The default option is 1, in my tmux config I do 1-9, and I don't use 0. This is my opinionated config for tmux.
windows:
- name: Name of the tmux window
- basePath: This may build on the global basePath, so if your basePath is set globally is
~/Softwarethis one could drill down into the tools folder by suppylingtoolsas the option here. With the concatenateBasePathToGlobalBasePath you now have to specify that value as true if you want to build off the global base path. - commands: A series of shell commands that you want run in that window.
- shouldCloseAfterCommand: tells tmux whether or not to close the window after the commands are complete.
- concatenateBasePathToGlobalBasePath: determines whether or not to concatenate the global basePath with the window basePath. Default value is false.
- panes: An optional array of panes to create within the window (see Pane Support below).
Windows can contain panes by adding a panes array to a window config:
{
"name": "mywindow",
"basePath": "~/Software/myproject",
"commands": [],
"shouldCloseAfterCommand": false,
"concatenateBasePathToGlobalBasePath": false,
"panes": [
{
"splitDirection": "horizontal",
"basePath": "",
"commands": ["npm run dev"],
"shouldCloseAfterCommand": false
},
{
"splitDirection": "vertical",
"basePath": "",
"commands": ["npm run test:watch"],
"shouldCloseAfterCommand": false
}
]
}splitDirection accepts "horizontal" or "vertical".
The capture command lets you convert a running tmux session into a disconnected config file:
disconnected capture <session-name> [output-name]This will inspect the running session, record window names, working directories, pane layouts, and active commands, then save the result as a JSON config file in ~/.config/disconnected. Useful for saving a session you built manually so you can recreate it later.
- When I run
dsc listit would nice to know which of those sessions are running. - Update this so that the name auto defaults to the name of the file.
- Support panes in the future.
- Do some name validation here to ensure no spaces are in the name
- Improve the text validation for attaching to a service that has already been started (currently it's a simple includes)