66 lines
1.5 KiB
Text
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"))
|