dotfiles/xonsh/iterm2.xsh
2024-11-07 16:25:41 -07:00

66 lines
1.5 KiB
Text

# vim: ft=python
import sys
import base64
import socket
import xonsh
from prompt_toolkit import print_formatted_text
from prompt_toolkit.formatted_text import PygmentsTokens
from xonsh.pyghooks import partial_color_tokenize
#
# Helpers.
#
iterm2_signal = lambda contents : f"\033]133;{contents}\a"
iterm2_variable = lambda contents : f"\033]1337;{contents}\a"
iterm2_hostname = socket.gethostname().strip().replace("\n", "")
def printr(raw):
print(raw, flush=True, end='')
#
def get_iterm2_hostname():
return iterm2_variable(f"RemoteHost={$USER}@{iterm2_hostname}")
def get_iterm2_cwd():
return iterm2_variable(f"CurrentDir={$PWD}")
#
# iterm2 integration
#
@events.on_precommand
def iterm2_precmd(cmd=None):
printr(iterm2_signal('C;'))
@events.on_postcommand
def iterm2_postcmd(cmd, rtn, out, ts):
printr(iterm2_signal(f"D;{rtn}"))
def iterm2_prompt_formatter(params):
for index, token in enumerate(params.tokens):
if token.field == 'iterm2_start':
prologue = iterm2_signal('A') + get_iterm2_hostname() + get_iterm2_cwd()
params.update(index, prologue, None, None)
if token.field == 'iterm2_end':
epilogue = iterm2_signal('B')
params.update(index, epilogue, None, None)
return xonsh.prompt.base.prompt_tokens_formatter_default(params)
#
# Activate shell integration.
#
$SHELL_TYPE = 'readline'
$PROMPT_TOKENS_FORMATTER = iterm2_prompt_formatter
printr(get_iterm2_hostname())
printr(get_iterm2_cwd())
printr(iterm2_variable("ShellIntegrationVersion=16;shell=xonsh"))