Как написать прозрачную оболочку в терминальное приложение? - PullRequest
0 голосов
/ 26 марта 2019

Оболочка должна обрабатывать специальные управляющие символы и что-то делать, но в остальном не мешать действительному приложению.(пытается создать приложение, похожее на tmux)

Пока у меня есть следующий пример изменения в doc: https://docs.python.org/3/library/pty.html#example

import pty
import os

def handle_special_cmd(data):
    # TODO
    raise NotImplementedError

def inread(fd):
    data = os.read(fd, 1024)
    if b'\x02' in data: # ctrl B
        return handle_special_cmd(data)
    return data

def main():
    cmd="vim"
    pty.spawn(cmd, stdin_read=inread)

if __name__=='__main__':
    main()

Приведенный выше код работает, но открытый vim не покрываетвсе окно терминала.Он запускает vim с уменьшенными строками и столбцами bad vim

Если я просто наберу vim из оболочки, он будет работать нормально: good vim

Почему это происходит и как это исправить?Моя цель - не просто исправить строки и столбцы, но обертка должна быть по-настоящему прозрачной, за исключением перехвата специального символа ctrl и выполнения некоторых действий.Независимо от tty / colors и других настроек, которые имеет текущая оболочка, она должна быть передана фактическому исполняемому файлу.Это должно работать так, как будто я набрал vim.(Специальное решение для Linux хорошо. Не нужно работать во всех posix. Если это нужно, расширение ac тоже хорошо).

1 Ответ

1 голос
/ 26 марта 2019

Размер окна является уникальным свойством самого PTY.Вы можете получить и установить его, используя TIOCGWINSZ и TIOCSWINSZ ioctls:

import sys, fcntl, termios, struct

buf = bytearray(4)
fcntl.ioctl(sys.stdin.fileno(), termios.TIOCGWINSZ, buf)
(h, w) = struct.unpack("HH", buf)
print("Terminal is {w} x {h}".format(w=w, h=h))

[...]

fcntl.ioctl(child_pty.fileno(), termios.TIOCSWINSZ, struct.pack("HH", h, w))
...