# mprocs _mprocs_ runs multiple commands in parallel and shows output of each command separately. When you work on a project you very often need the same list of commands to be running. For example: `webpack serve`, `jest --watch`, `node src/server.js`. With mprocs you can list these command in `mprocs.yaml` and run all of them by running `mprocs`. Then you can switch between outputs of running commands and interact with them. It is similar to [concurrently](https://github.com/open-cli-tools/concurrently) but _mprocs_ shows output of each command separately and allows to interact with processes (you can even work in _vim_ inside _mprocs_). - [Screenshots](#screenshots) - [Installation](#installation) - [Download binary (Linux, Macos, Windows)](#download-binary-linux-macos-windows) - [npm (Linux, Macos, Windows)](#npm-linux-macos-windows) - [homebrew (Macos)](#homebrew-macos) - [cargo (All platforms)](#cargo-all-platforms) - [scoop (Windows)](#scoop-windows) - [AUR (Arch Linux)](#aur-arch-linux) - [MPR (Debian/Ubuntu)](#mpr-debianubuntu) - [Usage](#usage) - [Config](#config) - [Keymap](#keymap) - [$select operator](#select-operator) - [Running scripts from package.json](#running-scripts-from-packagejson) - [Default keymap](#default-keymap) - [Remote control](#remote-control) - [FAQ](#faq) - [mprocs vs tmux/screen](#mprocs-vs-tmuxscreen) ## Screenshots ## Installation [![Packaging status](https://repology.org/badge/vertical-allrepos/mprocs.svg)](https://repology.org/project/mprocs/versions) ### Download binary (Linux, Macos, Windows) [Download](https://github.com/pvolok/mprocs/releases) executable for your platform and put it into a directory included in PATH. ### npm (Linux, Macos, Windows) ```sh npm install -g mprocs ``` ```sh yarn global add mprocs ``` ### homebrew (Macos, Linux) ```sh brew install mprocs ``` ### cargo (All platforms) ```sh cargo install mprocs ``` ### scoop (Windows) ```sh scoop install mprocs ``` ### AUR (Arch Linux) ```sh yay mprocs ``` ```sh yay mprocs-bin ``` ### MPR (Debian/Ubuntu) ```sh git clone 'https://mpr.makedeb.org/mprocs' cd mprocs/ makedeb -si ``` ## Usage 1. Run `mprocs cmd1 cmd2 …` (example: `mprocs "yarn test -w" "webpack serve"`) OR 1. Create `mprocs.yaml` file 2. Run `mprocs` command Example `mprocs.yaml`: ```yaml procs: nvim: cmd: ["nvim"] server: shell: "nodemon server.js" webpack: "webpack serve" tests: shell: "jest -w" env: NODE_ENV: test ``` ### Config [JSON/YAML Configuration Schema](https://json.schemastore.org/mprocs-0.6.4.json) There are two kinds of configs: global and local. _Global_ config is loaded from `~/.config/mprocs/mprocs.yaml` (or `C:\Users\Alice\AppData\Roaming\mprocs\mprocs.yaml` on Windows). _Local_ config is loaded from `mprocs.yaml` from current directory (or set via cli argument: `mprocs --config ./cfg/mprocs.yaml`). Settings in the _local_ config override settings the _global_. - **procs**: _object_ - Processes to run. Only allowed in local config. - **shell**: _string_ - Shell command to run (exactly one of **shell** or **cmd** must be provided). - **cmd**: _array_ - Array of command and args to run (exactly one of **shell** or **cmd** must be provided). - **cwd**: _string_ - Set working directory for the process. Prefix `` will be replaced with the path of the directory where the config is located. - **env**: _object_ - Set env variables. Object keys are variable names. Assign variable to null, to clear variables inherited from parent process. - **add_path**: _string|array_ - Add entries to the _PATH_ environment variable. - **autostart**: _bool_ - Start process when mprocs starts. Default: _true_. - **autorestart**: _bool_ - Restart process when it exits. Default: false. Note: If process exits within 1 second of starting, it will not be restarted. - **stop**: _"SIGINT"|"SIGTERM"|"SIGKILL"|{send-keys: array}|"hard-kill"_ - A way to stop a process (using `x` key or when quitting mprocs). - **hide_keymap_window**: _bool_ - Hide the pane at the bottom of the screen showing key bindings. - **mouse_scroll_speed**: _integer_ - Number of lines to scrollper one mouse scroll. - **scrollback**: _integer_ - Scrollback size. Default: _1000_. - **proc_list_width**: _integer_ - Process list window width. - **keymap_procs**: _object_ - Key bindings for process list. See [Keymap](#keymap). - **keymap_term**: _object_ - Key bindings for terminal window. See [Keymap](#keymap). - **keymap_copy**: _object_ - Key bindings for copy mode. See [Keymap](#keymap). #### Keymap Default key bindings can be overridden in config using _keymap_procs_, _keymap_term_, or _keymap_copy_ fields. Available commands are documented in the [Remote control](#remote-control) section. There are three keymap levels: - Default keymaps - `~/.config/mprocs/mprocs.yaml` - `./mprocs.yaml` (can be overridden by the _-c/--config_ cli arg) Lower levers override bindings from previous levels. Key bindings from previous levels can be cleared by specifying `reset: true` field at the same level as keys. Key bindings are defined between `<` and `>`, e.g., `` (enter key), `` (down arrow), `` (up arrow), `` (CTRL + q). ```yaml keymap_procs: # keymap when process list is focused : { c: toggle-focus } : null # unbind key keymap_term: # keymap when terminal is focused reset: true : { c: toggle-focus } : c: batch cmds: - { c: focus-procs } - { c: next-proc } ``` #### `$select` operator You can define different values depending on the current operating system. Any value in config can be wrapped with a _$select_ operator. To provide different values based on current OS define an object with: - First field `$select: os` - Fields defining values for different OSes: `macos: value`. Possible values are listed here: https://doc.rust-lang.org/std/env/consts/constant.OS.html. - Field `$else: default value` will be matched if no value was defined for current OS. If current OS is not matched and field `$else` is missing, then mprocs will fail to load config. Example `mprocs.yaml`: ```yaml procs: my process: shell: $select: os windows: "echo %TEXT%" $else: "echo $TEXT" env: TEXT: $select: os windows: Windows linux: Linux macos: Macos freebsd: FreeBSD ``` #### Running scripts from package.json If you run _mprocs_ with an `--npm` argument, it will load scripts from `package.json`. But the scripts are not run by default, and you can launch desired scripts manually. ```sh # Run mprocs with scripts from package.json mprocs --npm ``` ### Default keymap Process list focused: - `q` - Quit (soft kill processes and wait then to exit) - `Q` - Force quit (terminate processes) - `C-a` - Focus output pane - `x` - Soft kill selected process (send SIGTERM signal, hard kill on Windows) - `X` - Hard kill selected process (send SIGKILL) - `s` - Start selected process, if it is not running - `r` - Soft kill selected process and restart it when it stops - `R` - Hard kill selected process and restart it when it stops - `a` - Add new process - `d` - Remove selected process (process must be stopped first) - `e` - Rename selected process - `k` or `↑` - Select previous process - `j` or `↓` - Select next process - `M-1` - `M-8` - Select process 1-8 - `C-d` or `page down` - Scroll output down - `C-u` or `page up` - Scroll output up - `C-e` - Scroll output down by 3 lines - `C-y` - Scroll output up by 3 lines - `z` - Zoom into terminal window - `v` - Enter copy mode Process output focused: - `C-a` - Focus processes pane Copy mode: - `v` - Start selecting end point - `c` - Copy selected text - `Esc` - Leave copy mode - `C-a` - Focus processes pane - `C-d` or `page down` - Scroll output down - `C-u` or `page up` - Scroll output up - `C-e` - Scroll output down by 3 lines - `C-y` - Scroll output up by 3 lines - `h` or `↑` - Move cursor up - `l` or `→` - Move cursor right - `j` or `↓` - Move cursor down - `h` or `←` - Move cursor left ### Remote control Optionally, _mprocs_ can listen on TCP port for remote commands. You have to define remote control server address in `mprocs.yaml` (`server: 127.0.0.1:4050`) or via cli argument (`mprocs --server 127.0.0.1:4050`). To send a command to running _mprocs_ instance use the **ctl** argument: `mprocs --ctl '{c: quit}'` or `mprocs --ctl '{c: send-key, key: }'`. Commands are encoded as yaml. Available commands: - `{c: quit-or-ask}` - Stop processes and quit. If any processes are running, show a confirmation dialog. - `{c: quit}` - Stop processes and quit. Does not show confirm dialog. - `{c: force-quit}` - `{c: toggle-focus}` - Toggle focus between process list and terminal. - `{c: focus-procs}` - Focus process list - `{c: focus-term}` - Focus process terminal window - `{c: zoom}` - Zoom into terminal window - `{c: next-proc}` - `{c: prev-proc}` - `{c: select-proc, index: }` - Select process by index, top process has index 0 - `{c: start-proc}` - `{c: term-proc}` - `{c: kill-proc}` - `{c: restart-proc}` - `{c: force-restart-proc}` - `{c: show-add-proc}` - `{c: add-proc, cmd: ""}` - `{c: show-remove-proc}` - `{c: remove-proc, id: ""}` - `{c: show-rename-proc}` - `{c: rename-proc, name: ""}` - Rename currently selected process - `{c: scroll-down}` - `{c: scroll-up}` - `{c: scroll-down-lines, n: }` - `{c: scroll-up-lines, n: }` - `{c: copy-mode-enter}` - Enter copy mode - `{c: copy-mode-leave}` - Leave copy mode - `{c: copy-mode-move, dir: }` - Move starting or ending position of the selection. Available directions: `up/right/down/left`. - `{c: copy-mode-end}` - Start selecting end point of the selection. - `{c: copy-mode-copy}` - Copy selected text to the clipboard and leave copy mode. - `{c: send-key, key: ""}` - Send key to current process. Key examples: ``, `` - `{c: batch, cmds: [{c: focus-procs}, …]}` - Send multiple commands ## FAQ ### mprocs vs tmux/screen _mprocs_ is meant to make it easier to run specific commands that you end up running repeatedly, such as compilers and test runners. This is in contrast with _tmux_, which is usually used to run much more long-lived processes - usually a shell - in each window/pane. Another difference is that _tmux_ runs a server and a client, which allows the client to detach and reattach later, keeping the processes running. _mprocs_ is meant more for finite lifetime processes that you keep re-running, but when _mprocs_ ends, so do the processes it is running within its windows. ### Copying doesn't work in tmux Tmux doesn't have escape sequences for copying enabled by default. To enable it add the following to `~/.tmux.conf`: ``` set -g set-clipboard on ```