Skip to content

Instantly share code, notes, and snippets.

@ddlsmurf
Last active December 1, 2025 19:03
Show Gist options
  • Select an option

  • Save ddlsmurf/acb1dd5529735269737acdd2fcd8469a to your computer and use it in GitHub Desktop.

Select an option

Save ddlsmurf/acb1dd5529735269737acdd2fcd8469a to your computer and use it in GitHub Desktop.
fun with iTerm2 escapes
#!/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"
@ddlsmurf
Copy link
Author

ddlsmurf commented Dec 1, 2025

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment