Last active
December 1, 2025 19:03
-
-
Save ddlsmurf/acb1dd5529735269737acdd2fcd8469a to your computer and use it in GitHub Desktop.
fun with iTerm2 escapes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| set -euo pipefail | |
| # https://iterm2.com/documentation-escape-codes.html | |
| _iterm2_csi() { echo -ne "\e[${@}m" ; } | |
| _iterm2_osc() { echo -ne "\e]$@\a" ; } | |
| iterm2_style_reset() { _iterm2_csi "0" ; } | |
| curvy_underline() { _iterm2_csi "4:3" ; } | |
| curvy_underline_wrap() { | |
| curvy_underline | |
| echo -n "$@" | |
| iterm2_style_reset | |
| } | |
| # curvy_underline_wrap "curvy_underline_wrap" ; echo "" | |
| iterm2_hyperlink_wrap() { | |
| local text="$1" | |
| local href="$2" | |
| _iterm2_osc "8;;$href" | |
| echo -n "$text" | |
| _iterm2_osc "8;;" | |
| } | |
| # iterm2_hyperlink_wrap "hello" "http://example.com" ; echo " after" | |
| iterm2_set_mark() { _iterm2_osc "1337;SetMark" ; } | |
| __join_args() { # separator [values] | |
| local sep="$1" | |
| for ((i=2; i<=$#; i++)); do | |
| [[ "$i" == 2 ]] || echo -n "$sep" | |
| echo -n "${!i}" | |
| done | |
| } | |
| iterm2_annotation() { # hidden(true|false) [message | length message [x y] ] | |
| local hidden="$1" | |
| local command="AddAnnotation" | |
| if [[ "$hidden" == "true" ]]; then | |
| command="AddHiddenAnnotation" | |
| fi | |
| _iterm2_osc "1337;$command=$(__join_args "|" "${@:2}" )" | |
| } | |
| # echo -n "before: " ; iterm2_annotation false "A visible annotation" ; echo some text in the annotation | |
| # echo -n "before: " ; iterm2_annotation true 5 "A hidden mark 5 chars long" ; echo "1234567" | |
| __read_until_empty_line() { | |
| local line | |
| local file_response="" | |
| while : ; do | |
| read line | |
| if [[ -z "$line" ]]; then | |
| echo "$file_response" | |
| return 0 | |
| fi | |
| file_response="$file_response$line" | |
| done | |
| } | |
| iterm2_request_upload() { # [type] - only "tgz" is supported | |
| _iterm2_osc "1337;RequestUpload=format=${1:-tgz}" | |
| local user_response | |
| read user_response | |
| if [[ "$user_response" != "ok" ]]; then | |
| # seems iterm2 sends a ^C also | |
| return 1 | |
| fi | |
| __read_until_empty_line | |
| } | |
| # iterm2_request_upload || echo "failed" # prints base64 of tgz file | |
| iterm2_notification() { _iterm2_osc "9;$@" ; } | |
| # iterm2_notification "consider yourself notified" | |
| iterm2_fg_colour() { # values between 0-255 | |
| local red="$1" | |
| local green="$2" | |
| local blue="$3" | |
| _iterm2_csi "38;2;${red};${green};${blue}" | |
| } | |
| iterm2_bg_colour() { # values between 0-255 | |
| local red="$1" | |
| local green="$2" | |
| local blue="$3" | |
| _iterm2_csi "48;2;${red};${green};${blue}" | |
| } | |
| # echo -n "$(iterm2_fg_colour 255 0 255)fg$(iterm2_style_reset) " | |
| # echo -n "$(iterm2_fg_colour 0 255 255)fg$(iterm2_style_reset) " | |
| # echo -n "$(iterm2_bg_colour 255 0 255)bg$(iterm2_style_reset) " | |
| # echo "$(iterm2_bg_colour 0 255 255)bg$(iterm2_style_reset) " | |
| iterm2_background_image() { | |
| local filename="${1:-}" # Path must not need expansion | |
| [[ -z "filename" ]] || filename="$(echo -n "$filename" | base64)" | |
| _iterm2_osc "1337;SetBackgroundImageFile=${filename}" | |
| } | |
| # iterm2_background_image "/Users/me/image.png" ; echo "press enter..." ; read ; iterm2_background_image | |
| iterm2_set_user_var() { | |
| local var="$1" | |
| local text="${2:-}" | |
| [[ -z "text" ]] || text="$(echo -n "$text" | base64)" | |
| _iterm2_osc "1337;SetUserVar=${var}=${text}" | |
| } | |
| # iterm2_set_user_var myvar 'my var' | |
| iterm2_progress() { | |
| local percent_int="${1:-0}" | |
| echo -ne "\e]9;4;1;${percent_int}\e\\" | |
| } | |
| # for ((i=0; i<=10; i++)); do iterm2_progress $((i*10)) ; sleep 1 ; done ; iterm2_progress | |
| iterm2_badge() { # [Interpolated string](https://iterm2.com/documentation-scripting-fundamentals.html) | |
| local text="${1:-}" | |
| [[ -z "text" ]] || text="$(echo -n "$text" | base64)" | |
| _iterm2_osc "1337;SetBadgeFormat=${text}" | |
| } | |
| # iterm2_badge "Warning! root (but not really, just a badge)" ; echo "press enter..." ; read ; iterm2_badge | |
| # iterm2_badge "'\(user.myvar)' '\(tab.currentSession.hostname)'" | |
| iterm2_tab_colour() { # (3 values between 0-255) | |
| local red="$1" | |
| local green="$2" | |
| local blue="$3" | |
| _iterm2_osc "6;1;bg;red;brightness;${red}" | |
| _iterm2_osc "6;1;bg;green;brightness;${green}" | |
| _iterm2_osc "6;1;bg;blue;brightness;${blue}" | |
| } | |
| iterm2_tab_colour_reset() { _iterm2_osc "6;1;bg;*;default" ; } | |
| # iterm2_tab_colour 255 0 255 ; sleep 3 ; iterm2_tab_colour_reset | |
| iterm2_steal_focus() { _iterm2_osc "1337;StealFocus" ; } | |
| iterm2_clear_scrollback() { _iterm2_osc "1337;ClearScrollback" ; } | |
| iterm2_clear_captured_outputs() { _iterm2_osc "1337;ClearCapturedOutput" ; } | |
| iterm2_attention() { # yes|once|no|fireworks | |
| local value="$1" | |
| _iterm2_osc "1337;RequestAttention=${value}" | |
| } | |
| # iterm2_attention fireworks | |
| # iterm2_attention yes ; sleep 3 ; iterm2_attention no | |
| iterm2_block() { | |
| local type="$1" | |
| local text="$2" | |
| local extraStart="" | |
| local extraEnd="" | |
| if [[ -n "$type" ]]; then | |
| extraStart=";type=$type" | |
| extraEnd=";render=1" | |
| fi | |
| local blockID="$RANDOM-$RANDOM-$RANDOM" | |
| echo -n " " | |
| _iterm2_osc "1337;Button=type=copy;block=${blockID}" | |
| echo " $(iterm2_fg_colour 100 100 100)copy the block below$(iterm2_style_reset)" | |
| _iterm2_osc "1337;Block=id=${blockID};attr=start${extraStart}" | |
| if [[ "$text" == "-" ]]; then | |
| cat | |
| else | |
| echo -n "$text" | |
| fi | |
| _iterm2_osc "1337;Block=id=${blockID};attr=end${extraEnd}" | |
| echo "" | |
| } | |
| exit 0 | |
| code_example=" | |
| # comment \`in backquotes\` | |
| ## subtitle ? | |
| def main(): print('hi')" | |
| iterm2_block "markdown" "$code_example" | |
| echo "$code_example" | iterm2_block "Plain text" "-" | |
| iterm2_block "python" "$code_example" |
Author
ddlsmurf
commented
Dec 1, 2025
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment