File: tmux_driver.py

package info (click to toggle)
crazy-complete 0.3.6-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 2,404 kB
  • sloc: python: 7,949; sh: 4,636; makefile: 74
file content (61 lines) | stat: -rw-r--r-- 1,673 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import os
import sys
import subprocess

from terminal_base import TerminalBase

def run(args, env=None):
    result = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, env=env)

    if result.returncode != 0:
        raise Exception("Command %r failed: %s" % (args, result.stderr))

    return result.stdout

try:
    run(['sh', '-c', 'which tmux'])
except Exception:
    print('Program `tmux` not found.')
    sys.exit(2)

class TmuxTerminal(TerminalBase):
    def __init__(self, session):
        self.session = session

    def _run(self, args):
        env = os.environ.copy()
        env.pop('TMUX', None)
        return run(['tmux'] + args, env)

    def start(self, command_args=(), env=None):
        tmux_env_args = []

        if env:
            for var, value in env.items():
                tmux_env_args.append(f'-e{var}={value}')

        cmd = ['new-session', '-d', '-s', self.session]
        cmd.extend(tmux_env_args)
        cmd.extend(command_args)
        self._run(cmd)

    def stop(self):
        self._run(['kill-session', '-t', self.session])

    def resize_window(self, x, y):
        self._run(['resize-window', '-t', self.session, '-x', str(x), '-y', str(y)])

    def send(self, line):
        self._run(['send-keys', '-t', self.session, line])

    def send_line(self, line):
        self._run(['send-keys', '-t', self.session, f'{line}\n'])

    def send_tab(self):
        self._run(['send-keys', '-t', self.session, 'Tab'])

    def send_ctrl_c(self):
        self._run(['send-keys', '-t', self.session, 'C-c'])

    def get_output(self):
        return self._run(['capture-pane', '-t', self.session, '-p'])