diff --git a/patch2vimedit/tmux.py b/patch2vimedit/tmux.py index 85bd76b..0424b54 100644 --- a/patch2vimedit/tmux.py +++ b/patch2vimedit/tmux.py @@ -3,6 +3,7 @@ import multiprocessing import sys import random import libtmux +import time class TmuxSession: @@ -13,6 +14,7 @@ class TmuxSession: def __init__(self, session): self.session = session self.session_id = session.id + self.keyboard_speed = 0.01 @classmethod def create_detached(cls, name=None): @@ -49,11 +51,34 @@ class TmuxSession: """ Send keys to the tmux process. See `man tmux` and `tmux send-keys` for documentation """ for arg in args: + if arg.endswith(";"): + # Weirdly, `tmux send-keys 'blah;'` doesn't send the semicolon; and so + # does `tmux send-keys ';'`. We must escape it with a backslash. + arg = arg[:-1] + r"\;" self.session.attached_pane.send_keys( arg, suppress_history=False, enter=False ) + def type_delay(self): + """ Introduce a small delay, to emulate a human typing """ + time.sleep(self.keyboard_speed + random.gauss(0, self.keyboard_speed * 0.1)) -# subprocess.run( -# ["tmux", "send-keys", "-t", self.session.id] + list(args), check=True -# ) + def type_keys(self, *args): + """ Same as `send_keys`, but emulates a human typing with pauses. This is + **unsafe** for special keys, although the common ones are preserved. """ + + if self.keyboard_speed == 0: + return self.send_keys(*args) + + for arg in args: + if ( + arg in ["enter", "escape"] + or arg.startswith("C-") + or arg.startswith("M-") + ): + self.send_keys(arg) + self.type_delay() + else: + for char in arg: + self.send_keys(char) + self.type_delay()