Модуль Python для редактирования текста в CLI - PullRequest
3 голосов
/ 01 июня 2009

Есть ли какой-нибудь модуль или команды python, которые позволили бы мне заставить мою программу на python войти в текстовый редактор CLI, заполнить редактор некоторым текстом, а когда он выйдет, вывести текст в некоторую переменную?

В настоящее время у меня есть пользователи, которые вводят данные в использование raw_input (), но я бы хотел что-то более мощное, чтобы оно отображалось в CLI.

Ответы [ 4 ]

8 голосов
/ 01 июня 2009

Хорошо, вы можете запустить $ EDITOR пользователя с подпроцессом, редактируя временный файл:

import tempfile
import subprocess
import os

t = tempfile.NamedTemporaryFile(delete=False)
try:
    editor = os.environ['EDITOR']
except KeyError:
    editor = 'nano'
subprocess.call([editor, t.name])
2 голосов
/ 01 июня 2009

Вы можете взглянуть на urwid , основанный на curses, полноценный инструментарий пользовательского интерфейса для Python. Он позволяет вам определять очень сложные интерфейсы и включает в себя различные типы полей редактирования для разных типов текста.

0 голосов
/ 11 апреля 2019

Вот функция, которую я написал для другого проекта. Это позволяет пользователю редактировать строку текста с поддержкой переноса строк и курсора | Вы можете двигаться вперед и назад с помощью клавиш со стрелками. Он полагается на модуль readchar для чтения кодов клавиш, поэтому он должен работать в Windows, но я тестировал его только на терминале Linux и как часть initramfs.

'''
init    = initial text supplied to edit
prompt= Decoration presented before the text (not editable and not returned)
'''
def text_editor(init='', prompt=''):

    term_width = shutil.get_terminal_size()[0]
    ptr = len(init)
    string = list(init)
    prompt = list(prompt)


    c = 0
    while True:
        if ptr and ptr > len(string):
            ptr = len(string)

        copy = prompt + string.copy()
        if ptr < len(string):
            copy.insert(ptr+len(prompt),'|')

        #Line wraps support:
        if len(copy) > term_width:
            cut = len(copy) + 3 - term_width
            if ptr > len(copy) / 2:
                copy = ['<']*3 + copy[cut:]
            else:
                copy = copy[:-cut] + ['>']*3 

        print('\r'*term_width+''.join(copy), end=' '*(term_width-len(copy)))

        if c in (53,54):
            #Page up/down bug
            c = readchar.readkey()
            if c == '~':
                continue
        else:
            c = readchar.readkey()  


        if len(c) > 1:
            #Control Character
            c = ord(c[-1])
            if c == 68:     #Left
                ptr -= 1
            elif c == 67:   #Right
                ptr += 1
            elif c == 53:   #PgDn
                ptr -= term_width // 2
            elif c == 54:   #PgUp
                ptr += term_width // 2
            elif c == 70:   #End
                ptr = len(string)
            elif c == 72:   #Home
                ptr = 0
            else:
                print("\nUnknown control character:", c)
                print("Press ctrl-c to quit.")
                continue
            if ptr < 0:
                ptr = 0
            if ptr > len(string):
                ptr = len(string)


        else:

            num = ord(c)
            if num in (13, 10):     #Enter
                print()
                return ''.join(string)
            elif num == 127:        #Backspace
                if string:
                    string.pop(ptr-1)
                    ptr -=1
            elif num == 3:          #Ctrl-C 
                exit(1)
            else:
                string.insert(ptr, c)
                ptr += 1

print("Result =", text_editor('Edit this text', prompt="Prompt:"))
0 голосов
/ 01 июня 2009

Если вам не нужна поддержка Windows, вы можете использовать модуль readline *1002* для базового редактирования командной строки, как в приглашении оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...