├── version.txt ├── .release-please-manifest.json ├── .gitignore ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature_request.yml │ └── bug_report.yml └── workflows │ └── release.yml ├── examples ├── README.md └── docker │ ├── Dockerfile │ ├── docker_test.bash │ ├── README.md │ └── docker-compose.yml ├── release-please-config.json ├── scripts ├── cancel.sh ├── variables.sh ├── notify.sh └── helpers.sh ├── CHANGELOG.md ├── tnotify.tmux ├── LICENSE ├── CONTRIBUTING.md ├── README.md └── resources ├── tmux-notify-icon.svg └── tmux-notify-logo.svg /version.txt: -------------------------------------------------------------------------------- 1 | 1.6.0 2 | -------------------------------------------------------------------------------- /.release-please-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | ".": "1.6.0" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Folders to ignore 2 | .vscode 3 | 4 | # Files to ignore 5 | *.swp 6 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [rickstaa] 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: Question 4 | url: https://github.com/rickstaa/tmux-notify/discussions 5 | about: Please ask and answer questions here. 6 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | 3 | This folder contains several examples on how to use tmux-notify in different scenarios: 4 | 5 | - ``docker``: A simple example on how to make tmux-notify work inside a docker container. 6 | -------------------------------------------------------------------------------- /examples/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | # A small Dockerfile to build a container in which tmux-notify can be tested. 2 | FROM ubuntu:latest 3 | 4 | # Install required packages. 5 | RUN apt-get update 6 | RUN apt-get upgrade -y 7 | RUN apt-get install -y \ 8 | libnotify-bin \ 9 | dbus \ 10 | tmux \ 11 | git 12 | -------------------------------------------------------------------------------- /release-please-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": { 3 | ".": { 4 | "changelog-path": "CHANGELOG.md", 5 | "release-type": "simple", 6 | "bump-minor-pre-major": false, 7 | "bump-patch-for-minor-pre-major": false, 8 | "draft": false, 9 | "prerelease": false 10 | } 11 | }, 12 | "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # Github action that uses the 'release-please' tool to update the version, changelog 2 | # and create new releases. 3 | name: Tmux-notify release 4 | on: 5 | push: 6 | branches: 7 | - main 8 | 9 | permissions: 10 | contents: write 11 | pull-requests: write 12 | 13 | jobs: 14 | release-please: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: google-github-actions/release-please-action@v3 18 | with: 19 | token: ${{ secrets.PLEASE_RELEASE_PAT }} 20 | command: manifest 21 | -------------------------------------------------------------------------------- /examples/docker/docker_test.bash: -------------------------------------------------------------------------------- 1 | # Command line example with all parameters needed to run tmux-notify inside a docker container. 2 | docker build -t tmux-notify-docker-test:latest . 3 | docker run -e DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \ 4 | -v /run/user/1000/bus:/run/user/1000/bus \ 5 | -v /etc/group:/etc/group:ro \ 6 | -v /etc/passwd:/etc/passwd:ro \ 7 | -v $HOME/.tmux:$HOME/.tmux \ 8 | -v $HOME/.tmux.conf:$HOME/.tmux.conf \ 9 | -v $HOME/.tmux.conf.local:$HOME/.tmux.conf.local \ 10 | --security-opt apparmor=unconfined \ 11 | -u $(id -u):$(id -g) \ 12 | -it tmux-notify-docker-test:latest tmux 13 | -------------------------------------------------------------------------------- /examples/docker/README.md: -------------------------------------------------------------------------------- 1 | # Docker example 2 | 3 | This example shows how to make tmux-notify work inside a docker container. You can test it out by executing the following inside your terminal: 4 | 5 | ```bash 6 | bash docker_test.sh 7 | ``` 8 | 9 | This command will open a Tmux session inside a docker container, and if you have installed [tmp](https://github.com/tmux-plugins/tpm) and [tmux-notify](https://github.com/rickstaa/tmux-notify), on your host machine you should be able to use [tmux-notify](https://github.com/rickstaa/tmux-notify) as usual. For more information on how this works, see [this guide](https://github.com/mviereck/x11docker/wiki/How-to-connect-container-to-DBus-from-host#dbus-user-session-daemon). 10 | -------------------------------------------------------------------------------- /examples/docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | app: 4 | image: tmux-notify-test:latest 5 | build: . 6 | environment: 7 | - DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus # Replace with your user id. 8 | security_opt: 9 | - apparmor:unconfined 10 | volumes: 11 | - /run/user/1000/bus:/run/user/1000/bus # Replace with your user id. 12 | - /etc/group:/etc/group:ro 13 | - /etc/passwd:/etc/passwd:ro 14 | - $HOME/.tmux:$HOME/.tmux # Your tmux folder. 15 | - $HOME/.tmux.conf:$HOME/.tmux.conf # Your tmux config. 16 | - $HOME/.tmux.conf.local:$HOME/.tmux.conf.local # Your tmux local config. 17 | user: 1000:1000 # Replace with your user / group id. 18 | -------------------------------------------------------------------------------- /scripts/cancel.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | ## -- Cancel monitoring script 3 | # Used to cancel the current pane monitor job 4 | 5 | # Get current directory 6 | CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 7 | 8 | # Source helpers and variables 9 | source "${CURRENT_DIR}/helpers.sh" 10 | source "${CURRENT_DIR}/variables.sh" 11 | 12 | # Cancel pane monitoring if active 13 | if [[ -f "$PID_FILE_PATH" ]]; then 14 | # Retrieve monitor process PID 15 | PID=$(cat "$PID_FILE_PATH") 16 | 17 | # Kill process and remove pid file 18 | kill "$PID" 19 | rm "${PID_DIR}/${PANE_ID}.pid" 20 | 21 | # Display success message 22 | tmux display-message "Pane monitoring canceled..." 23 | else 24 | tmux display-message "Pane not monitored..." 25 | exit 0 26 | fi 27 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [1.6.0](https://github.com/rickstaa/tmux-notify/compare/v1.5.1...v1.6.0) (2025-01-26) 4 | 5 | 6 | ### Features 7 | 8 | * add the ability to send notification through Pushover ([#57](https://github.com/rickstaa/tmux-notify/issues/57)) ([8698223](https://github.com/rickstaa/tmux-notify/commit/86982232675550416e3986516014b3f150abfc1d)) 9 | 10 | ## [1.5.1](https://github.com/rickstaa/tmux-notify/compare/v1.5.0...v1.5.1) (2023-10-15) 11 | 12 | 13 | ### Bug Fixes 14 | 15 | * trigger Bell in the Monitored Window ([#53](https://github.com/rickstaa/tmux-notify/issues/53)) ([11dea05](https://github.com/rickstaa/tmux-notify/commit/11dea05288c517f5d9982e3880c7db9cda8c2b45)) 16 | 17 | ## [1.5.0](https://github.com/rickstaa/tmux-notify/compare/v1.4.2...v1.5.0) (2023-08-15) 18 | 19 | 20 | ### Features 21 | 22 | * optional notification title ([#41](https://github.com/rickstaa/tmux-notify/issues/41)) ([5cbb408](https://github.com/rickstaa/tmux-notify/commit/5cbb4081ed4d4230af3111c0d9d4fb9e66bd803d)) 23 | -------------------------------------------------------------------------------- /tnotify.tmux: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Get current directory 4 | CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 5 | 6 | # Set PID_DIR 7 | if [[ -z $XDG_CACHE_HOME ]]; then 8 | export PID_DIR=~/.tmux/notify 9 | else 10 | export PID_DIR="$XDG_CACHE_HOME/tmux/tmux-notify" 11 | fi 12 | 13 | # Initialize variables 14 | source "$CURRENT_DIR/scripts/helpers.sh" 15 | source "$CURRENT_DIR/scripts/variables.sh" 16 | 17 | # prepare pid file directory 18 | if [[ ! -d $PID_DIR ]]; then 19 | mkdir $PID_DIR 20 | fi 21 | 22 | # Bind plugin keys 23 | tmux unbind-key m 24 | tmux unbind-key M 25 | tmux unbind-key M-m 26 | tmux unbind-key C-m 27 | tmux unbind-key C-M-m 28 | 29 | tmux bind-key m run-shell -b "$CURRENT_DIR/scripts/notify.sh" 30 | tmux bind-key M run-shell -b "$CURRENT_DIR/scripts/cancel.sh" 31 | tmux bind-key M-m run-shell -b "$CURRENT_DIR/scripts/notify.sh true" 32 | tmux bind-key C-m run-shell -b "$CURRENT_DIR/scripts/notify.sh false true" 33 | tmux bind-key C-M-m run-shell -b "$CURRENT_DIR/scripts/notify.sh true true" 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 2 | description: Suggest an idea for this project. 3 | labels: 4 | - "enhancement" 5 | body: 6 | - type: textarea 7 | attributes: 8 | label: Is your feature request related to a problem? Please describe. 9 | description: 10 | A clear and concise description of what the problem is. Ex. I'm always 11 | frustrated when [...] 12 | validations: 13 | required: true 14 | - type: textarea 15 | attributes: 16 | label: Describe the solution you'd like 17 | description: A clear and concise description of what you want to happen. 18 | - type: textarea 19 | attributes: 20 | label: Describe alternatives you've considered 21 | description: 22 | A clear and concise description of any alternative solutions or features 23 | you've considered. 24 | - type: textarea 25 | attributes: 26 | label: Additional context 27 | description: 28 | Add any other context or screenshots about the feature request here. 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2014 Chander G 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 2 | description: Create a report to help us improve. 3 | labels: 4 | - "bug" 5 | body: 6 | - type: textarea 7 | attributes: 8 | label: Describe the bug 9 | description: A clear and concise description of what the bug is. 10 | validations: 11 | required: true 12 | - type: textarea 13 | id: repro 14 | attributes: 15 | label: Reproduction steps 16 | description: "How do you trigger this bug? Please walk us through it step by step." 17 | value: | 18 | 1. Go to '...' 19 | 2. Click on '....' 20 | 3. Scroll down to '....' 21 | 4. See error 22 | - type: textarea 23 | attributes: 24 | label: Expected behaviour 25 | description: 26 | A clear and concise description of what you expected to happen. 27 | - type: textarea 28 | attributes: 29 | label: Screenshots / Live demo link 30 | description: If applicable, add screenshots to help explain your problem. 31 | placeholder: Paste the github-readme-stats link as markdown image 32 | - type: textarea 33 | id: system 34 | attributes: 35 | label: System information 36 | description: "Please complete the following information." 37 | value: | 38 | - OS: [e.g. Windows, Mac, Linux, iOS, android] 39 | - Browser [e.g. chrome, safari, brave, firefox] 40 | - Version [e.g. 22] 41 | - type: textarea 42 | attributes: 43 | label: Additional context 44 | description: Add any other context about the problem here. 45 | -------------------------------------------------------------------------------- /scripts/variables.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | ## -- Add tmux plugin variables 3 | 4 | ## Main variables 5 | if [[ -z $XDG_CACHE_HOME ]]; then 6 | export PID_DIR=~/.tmux/notify 7 | else 8 | export PID_DIR="$XDG_CACHE_HOME/tmux/tmux-notify" 9 | fi 10 | 11 | # Get ID's 12 | export SESSION_ID=$(tmux display-message -p '#{session_id}' | tr -d $) 13 | export WINDOW_ID=$(tmux display-message -p '#{window_id}' | tr -d @) 14 | export PANE_ID=$(tmux display-message -p '#{pane_id}' | tr -d %) 15 | export PID_FILE_PATH="${PID_DIR}/${PANE_ID}.pid" 16 | 17 | ## Tnotify tmux options 18 | export prompt_suffixes="@tnotify-prompt-suffixes" 19 | export prompt_suffixes_default="$,#,%" 20 | export custom_notify_command="@tnotify-custom-cmd" 21 | export custom_notify_command_default="bash ~/Desktop/test.bash" 22 | 23 | # Notification verbosity settings 24 | export verbose_option="@tnotify-verbose" 25 | export verbose_default="off" 26 | export verbose_msg_option="@tnotify-verbose-msg" 27 | export verbose_msg_default="(#S, #I:#P) Tmux pane task completed!" 28 | export verbose_title_option="@tnotify-verbose-title" 29 | export verbose_title_default="" 30 | 31 | # Monitor checker interval 32 | export monitor_sleep_duration="@tnotify-sleep-duration" 33 | export monitor_sleep_duration_default=10 34 | 35 | # Telegram notification settings 36 | export tmux_notify_telegram_bot_id="@tnotify-telegram-bot-id" 37 | export tmux_notify_telegram_channel_id="@tnotify-telegram-channel-id" 38 | export tmux_notify_telegram_all="@tnotify-telegram-all" 39 | export tmux_notify_telegram_bot_id_default="" 40 | export tmux_notify_telegram_channel_id_default="" 41 | export tmux_notify_telegram_all_default="off" 42 | 43 | # Pushover notification settings 44 | export tmux_notify_pushover_token="@tnotify-pushover-token" 45 | export tmux_notify_pushover_user="@tnotify-pushover-user" 46 | export tmux_notify_pushover_title="@tnotify-pushover-title" 47 | export tmux_notify_pushover_token_default="" 48 | export tmux_notify_pushover_user_default="" 49 | export tmux_notify_pushover_title_default="Tmux Notify" 50 | -------------------------------------------------------------------------------- /scripts/notify.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Usage: notify 3 | ## -- Start monitoring script 4 | 5 | # Get current directory 6 | CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 7 | 8 | # Source helpers and variables 9 | source "${CURRENT_DIR}/helpers.sh" 10 | source "${CURRENT_DIR}/variables.sh" 11 | 12 | ## Functions 13 | 14 | # Handle cancelation of monitor job 15 | on_cancel() 16 | { 17 | # Wait a bit for all pane monitors to complete 18 | sleep "$monitor_sleep_duration_value" 19 | 20 | # Preform cleanup operation is monitoring was canceled 21 | if [[ -f "$PID_FILE_PATH" ]]; then 22 | kill "$PID" 23 | rm "${PID_DIR}/${PANE_ID}.pid" 24 | fi 25 | exit 0 26 | } 27 | trap 'on_cancel' TERM 28 | 29 | ## Main script 30 | 31 | # Monitor pane if it is not already monitored 32 | if [[ ! -f "$PID_FILE_PATH" ]]; then # If pane not yet monitored 33 | # job started - create pid-file 34 | echo "$$" > "$PID_FILE_PATH" 35 | 36 | # Display tnotify start messsage 37 | tmux display-message "Monitoring pane..." 38 | 39 | # Construct tnotify finish message 40 | if verbose_enabled; then # If @tnotify-verbose is enabled 41 | verbose_msg_value="$(get_tmux_option "$verbose_msg_option" "$verbose_msg_default")" 42 | complete_message=$(tmux display-message -p "$verbose_msg_value") 43 | verbose_msg_title="$(get_tmux_option "$verbose_title_option" "$verbose_title_default")" 44 | complete_title=$(tmux display-message -p "$verbose_msg_title") 45 | else # If @tnotify-verbose is disabled 46 | complete_message="Tmux pane task completed!" 47 | fi 48 | 49 | # Create bash suffix list 50 | # NOTE: Looks complicated but uses shell parameter expansion 51 | # see https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion 52 | prompt_suffixes="$(get_tmux_option "$prompt_suffixes" "$prompt_suffixes_default")" 53 | prompt_suffixes=${prompt_suffixes// /} # Remove whitespace 54 | prompt_suffixes=${prompt_suffixes//,/|} # Replace comma with or operator 55 | prompt_suffixes=$(escape_glob_chars "$prompt_suffixes") 56 | prompt_suffixes="\(${prompt_suffixes}\)$" 57 | 58 | # Check process status every 10 seconds to see if has is finished 59 | while true; do 60 | # capture pane output 61 | output=$(tmux capture-pane -pt %"$PANE_ID") 62 | 63 | # run tests to determine if work is done 64 | # if so, break and notify 65 | if echo "$output" | tail -n2 | grep -e $prompt_suffixes &> /dev/null; then 66 | # tmux display-message "$@" 67 | if [[ "$1" == "true" ]]; then 68 | tmux switch -t \$"$SESSION_ID" 69 | tmux select-window -t @"$WINDOW_ID" 70 | tmux select-pane -t %"$PANE_ID" 71 | fi 72 | notify "$complete_message" "$complete_title" $2 73 | break 74 | fi 75 | 76 | # Sleep for a given time 77 | monitor_sleep_duration_value=$(get_tmux_option "$monitor_sleep_duration" "$monitor_sleep_duration_default") 78 | sleep "$monitor_sleep_duration_value" 79 | done 80 | 81 | # job done - remove pid file 82 | if [[ -f "$PID_FILE_PATH" ]]; then 83 | rm "$PID_FILE_PATH" 84 | fi 85 | 86 | # Execute custom command if specified by user 87 | custom_command="$(get_tmux_option "$custom_notify_command" "$custom_notify_command_default")" 88 | if [[ -n "$custom_command" ]]; then 89 | eval "${custom_command}" 90 | fi 91 | 92 | exit 0 93 | else # If pane is already being monitored 94 | 95 | # Display pane already monitored message 96 | tmux display-message "Pane already monitored..." 97 | exit 0 98 | fi 99 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to tmux-notify 2 | 3 | We love your input! 🚀 We want to make contributing to this project as easy and transparent as possible, whether it's: 4 | 5 | - [Reporting a bug](https://github.com/rickstaa/tmux-notify/issues/new?assignees=&labels=&projects=&template=bug_report.md&title=). 6 | - [Discussing the current state of the code](https://github.com/rickstaa/tmux-notify/discussions). 7 | - [Submitting a fix](https://github.com/rickstaa/tmux-notify/compare). 8 | - [Proposing new features](https://github.com/rickstaa/tmux-notify/issues/new?assignees=&labels=&projects=&template=feature_request.md&title=). 9 | - Becoming a maintainer. 10 | 11 | ## We Develop with Github 12 | 13 | We use github to host code, track issues and feature requests, and accept pull requests. 14 | 15 | ## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests 16 | 17 | Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://docs.github.com/en/get-started/quickstart/github-flow)). We actively welcome your pull requests: 18 | 19 | 1. Fork the repo and create your branch from `main`. 20 | 2. Add tests if you've added code that should be tested. 21 | 3. If you've changed APIs, update the documentation. 22 | 4. Ensure the test suite passes. 23 | 5. Make sure your code lints. 24 | 6. Issue that pull request! 25 | 26 | ## Any contributions you make will be under the MIT Software License 27 | 28 | In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. 29 | 30 | ## Report bugs using Github's [issues](https://github.com/rickstaa/tmux-notify/issues) 31 | 32 | We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/rickstaa/tmux-notify/issues/new/choose); it's that easy! 33 | 34 | ## Write bug reports with detail, background, and sample code 35 | 36 | [This is an example](http://stackoverflow.com/q/12488905/180626) of a bug report, and I think it's a good model. Here's [another example from Craig Hockenberry](http://www.openradar.me/11905408), an app developer greatly respected in the community. 37 | 38 | **Great Bug Reports** tend to have: 39 | 40 | - A quick summary and/or background. 41 | - Steps to reproduce: 42 | - Be specific! 43 | - Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that _anyone_ with a base R setup can run to reproduce what I was seeing. 44 | - What you expected would happen. 45 | - What actually happens. 46 | - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work). 47 | 48 | People _love_ thorough bug reports. I'm not even kidding. 49 | 50 | ## Use a Consistent Coding Style 51 | 52 | We use [shfmt](https://github.com/mvdan/sh#shfmt) to format our shell scripts. The easiest way to use [shfmt](https://github.com/mvdan/sh#shfmt) is through the [bash-beautify](https://marketplace.visualstudio.com/items?itemName=shakram02.bash-beautify) or [shell-format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format) VS Code extensions. 53 | 54 | ## License 55 | 56 | By contributing, you agree that your contributions will be licensed under its MIT License. 57 | 58 | ## References 59 | 60 | This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md). 61 | -------------------------------------------------------------------------------- /scripts/helpers.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | ## -- Helper functions 3 | # Additional functions that are used in the main scripts. 4 | 5 | # Get tmux option 6 | # Usage: get_tmux_option