Compare commits

...

10 Commits

Author SHA1 Message Date
Haoyuan Li d1d73c57b1
Merge 2cd77de6a0 into a0c9dbe80b 2026-06-06 11:49:15 -04:00
Roman Perepelitsa a0c9dbe80b bump version 2026-06-02 20:20:51 +02:00
George Nachman 31982e202d
emit OSC 133 k=r and k=s for iTerm2 >= 3.7.0 (#2954)
iTerm2 3.7.0 added receiver support for the OSC 133 k= attribute
(Semantic Prompt prompt kinds: k=i initial, k=s secondary/PS2,
k=c continuation, k=r right). When emitted by the shell, iTerm2
records the bracketed cells as non-input on the active primary
prompt mark, so consumers (Select Current Command, share-as-URL,
AI prompt extraction, the Python GetPromptResponse.excluded_subranges
field) can subtract them from the typed-command range.

Two gaps for iTerm2 today:

1. The RPROMPT k=r wrap in _p9k_init_prompt is gated to WarpTerminal.
   iTerm2 sessions never trip the gate, so right-prompt cells leak
   into "Select Current Command", share URLs, etc.

2. p10k replaces iTerm2's iterm2_decorate_prompt with a stub that
   only records ITERM2_PRECMD_PS1. iTerm2's original function also
   wraps PS2 with OSC 133; the stub drops that wrap entirely, so
   multi-line input (for, while, unclosed quotes, heredocs, backslash
   continuations) produces no k=s markers and iTerm2 has no way to
   tell PS2-prefix cells apart from user input.

Both fixes are gated on iTerm2 >= 3.7.0 via
TERM_PROGRAM_VERSION == (3.<7->*|<4->.*). Older iTerm2 receivers do
not parse k= and would treat k=r/k=s markers as spurious primary
prompts (extra navigation marks, broken command-range tracking,
broken paste-each-line semantics). WarpTerminal behavior is
unchanged. The ITERM2_SQUELCH_PS2_MARK opt-out from iTerm2's
original iterm2_decorate_prompt is preserved.
2026-06-02 20:16:25 +02:00
Li Haoyuan 2cd77de6a0
Merge branch 'romkatv:master' into battery-prompt-for-windows 2025-02-19 10:40:07 +08:00
Li Haoyuan 4ab4a1353f
Merge branch 'romkatv:master' into battery-prompt-for-windows 2024-11-05 16:03:14 +08:00
Li Haoyuan 20fc7b8a26
Merge branch 'romkatv:master' into battery-prompt-for-windows 2024-10-14 19:53:44 +08:00
Li Haoyuan 71d628cc8a fix: Fix the logic of displaying the remain time when battery is charged or charging. 2024-07-12 02:37:25 +08:00
Li Haoyuan bc0f9341da refactor: Change the method of parsing wmic output, improve performance. 2024-07-12 02:28:25 +08:00
Li Haoyuan 39e1c51ae3 feat: Add segment comment 2024-07-10 13:44:46 +08:00
Li Haoyuan 14a038bbda feat: Add battery prompt for Windows 2024-07-10 13:40:32 +08:00
1 changed files with 68 additions and 3 deletions

View File

@ -1344,6 +1344,16 @@ _p9k_prompt_battery_init() {
_p9k__async_segments_compute+='_p9k_worker_invoke battery _p9k_prompt_battery_compute'
return
fi
if [[ $_p9k_os == Windows ]]; then
if command -v wmic > /dev/null 2>&1; then # Test "wimc" command
_p9k__async_segments_compute+='_p9k_worker_invoke battery _p9k_prompt_battery_compute'
return
else
typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}'
fi
fi
if [[ $_p9k_os != (Linux|Android) ||
-z /sys/class/power_supply/(CMB*|BAT*|*battery)/(energy_full|charge_full|charge_counter)(#qN) ]]; then
typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}'
@ -1456,6 +1466,54 @@ _p9k_prompt_battery_set_args() {
fi
;;
Windows)
local raw_data
local -a info_values
# See definitions to Win32_Battery class members at https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-battery
{
read -r 2>/dev/null
read -r raw_data
} <<< "$(wmic path Win32_Battery get BatteryStatus,EstimatedChargeRemaining,EstimatedRunTime)"
# info_values[1]: BatteryStatus
# info_values[2]: EstimatedChargeRemaining
# info_values[3]: EstimatedRunTime
info_values=(${(s: :)raw_data})
(( ${#info_values[@]} == 4 )) || return # Missing info_values (index [4] is for the following CRCR)
bat_percent=${info_values[2]}
local -i bat_remain_minutes=${info_values[3]}
case ${info_values[1]} in
'1'|'4'|'5')
# When the battery is charging or full, system will show that bat_remain_minutes (EstimatedRunTime) is 71582788 (min)
(( bat_remain_minutes < 71582788 )) && remain=$((bat_remain_minutes/60)):${(l#2##0#)$((bat_remain_minutes%60))} || remain=''
if (( bat_percent < _POWERLEVEL9K_BATTERY_LOW_THRESHOLD )); then
state=LOW
else
state=DISCONNECTED
fi
;;
'2'|'6'|'7'|'8'|'9'|'11') # In this case, the battery is likely to be charged and disconnected, or still been charging.
remain=''
if (( bat_percent == 100 )); then
state=CHARGED
else
state=CHARGING
fi
;;
'3')
(( bat_remain_minutes < 71582788 )) && remain=$((bat_remain_minutes/60)):${(l#2##0#)$((bat_remain_minutes%60))} || remain=''
state=CHARGED
;;
*)
state=CHARGED
remain=''
;;
esac
;;
*)
return 0
;;
@ -8399,14 +8457,16 @@ _p9k_init_prompt() {
if (( _POWERLEVEL9K_TERM_SHELL_INTEGRATION )); then
_p9k_prompt_prefix_left+=$'%{\e]133;A\a%}'
_p9k_prompt_suffix_left+=$'%{\e]133;B\a%}'
if [[ $TERM_PROGRAM == WarpTerminal ]]; then
if [[ $TERM_PROGRAM == WarpTerminal ||
( $TERM_PROGRAM == iTerm.app && $TERM_PROGRAM_VERSION == (3.<7->*|<4->.*) ) ]]; then
_p9k_prompt_prefix_right=$'%{\e]133;P;k=r\a%}'$_p9k_prompt_prefix_right
_p9k_prompt_suffix_right+=$'%{\e]133;B\a%}'
fi
if (( $+_z4h_iterm_cmd && _z4h_can_save_restore_screen == 1 )); then
_p9k_prompt_prefix_left+=$'%{\ePtmux;\e\e]133;A\a\e\\%}'
_p9k_prompt_suffix_left+=$'%{\ePtmux;\e\e]133;B\a\e\\%}'
if [[ $TERM_PROGRAM == WarpTerminal ]]; then
if [[ $TERM_PROGRAM == WarpTerminal ||
( $TERM_PROGRAM == iTerm.app && $TERM_PROGRAM_VERSION == (3.<7->*|<4->.*) ) ]]; then
_p9k_prompt_prefix_right=$'%{\ePtmux;\e\e]133;P;k=r\a\e\\%}'$_p9k_prompt_prefix_right
_p9k_prompt_suffix_right+=$'%{\ePtmux;\e\e]133;B\a\e\\%}'
fi
@ -8965,6 +9025,11 @@ _p9k_init() {
function iterm2_decorate_prompt() {
typeset -g ITERM2_PRECMD_PS1=$PROMPT
typeset -g ITERM2_SHOULD_DECORATE_PROMPT=
if [[ -n $PS2 && $PS2 != *$'\e]133;A;k=s\a'* && -z ${ITERM2_SQUELCH_PS2_MARK-} &&
$TERM_PROGRAM_VERSION == (3.<7->*|<4->.*) ]]; then
typeset -g ITERM2_PRECMD_PS2=$PS2
PS2=$'%{\e]133;A;k=s\a%}'$PS2$'%{\e]133;B\a%}'
fi
}
fi
if (( $+functions[iterm2_precmd] )); then
@ -9512,7 +9577,7 @@ if [[ $__p9k_dump_file != $__p9k_instant_prompt_dump_file && -n $__p9k_instant_p
zf_rm -f -- $__p9k_instant_prompt_dump_file{,.zwc} 2>/dev/null
fi
typeset -g P9K_VERSION=1.20.15
typeset -g P9K_VERSION=1.20.16
if [[ ${VSCODE_SHELL_INTEGRATION-} == <1-> && ${+__p9k_force_term_shell_integration} == 0 ]]; then
typeset -gri __p9k_force_term_shell_integration=1