Как получить / установить положение курсора консоли в Ruby (Windows)

StackOverflow https://stackoverflow.com/questions/1493300

Вопрос

Я пытаюсь написать оболочку на Ruby, и для реализации завершения табуляции я использую функцию WinAPI getch для чтения по символу за раз от пользователя, проверяя наличие вкладок.

Проблема с этим заключается в обратное пространство Клавиша:

  1. Он перемещает курсор дальше назад, чем подсказка (например, с помощью подсказки hello>, пользователь может переместить курсор в обратном направлении на h.Я бы хотел, чтобы это остановилось на последнем месте.
  2. Когда текст пользователя перетекает на следующую строку консоли, backspace не переместится обратно на предыдущую строку.

(Я знаю, что оба этих варианта поведения разработаны специально.)

Мое воображаемое решение этих проблем включает в себя управление перемещением курсора;Мне нужно знать, где находится курсор, и иметь возможность перемещать его.

В Linux я бы использовал escape-последовательности ANSI, но они не поддерживаются консолью Windows.

Я заглянул в WinAPI и попытался найти функции, которые позволили бы мне это сделать, но все, что я мог бы найти был GetConsoleCursorInfo функция, которая возвращает только размер и видимость курсора.

Примеры были бы оценены, поскольку я безнадежен в использовании класса Win32API для чего-либо, кроме примитивных функций.

Спасибо.

Это было полезно?

Решение

Вероятно, вам лучше использовать readline.Он включен в установщик Ruby One-Click.Базовая настройка заключается в:

require 'readline'

while line = Readline.readline('hello> ', true)
  #do something with line
  break if line == 'quit'
end

У вас уже будут стандартные возможности чтения строки, такие как обратный пробел, Alt + backspace для удаления слова, история и завершение табуляции.Есть хорошая документация о том, как настроить его под ваши нужды здесь.


Редактировать:

Если у вас не установлена readline, вы можете получить ее и другие внешние библиотеки здесь.Вы захотите, чтобы строка чтения-4.3-2- mswin32 посылка.Скопируйте строку чтения.dll-файл (расположенный в bin каталог) к вашему ruby\bin справочник.Этого должно хватить.

Хотя это не задокументировано на домашней странице Ruby, похоже, что вы также можете использовать readline 5, доступную здесь.В частности, вам нужно двоичные файлы распространение.Копировать readline5.dll (в bin каталог) к вашему ruby\bin каталог и переименуйте его в readline.dll.

Кроме того, в качестве дополнительного примечания, не пугайтесь, если require 'readline' возвращает false при использовании irb, поскольку, по-видимому, он предварительно загружается.

Другие советы

Хм, резервное копирование, безусловно, возможно, и с достаточно переносимым кодом, поскольку bash (1) может выполнять резервное копирование на предыдущую строку даже в окне dos.Я предполагаю, что это использует termcap или ncurses, и у него есть в базе данных termcap набор управляющих кодов, которые работают для окна dos.

Я не верю, что в Ruby существуют какие-либо привязки termcap, поэтому вы используете ncurses, а не встраиваете в свою программу набор управляющих кодов, зависящих от устройства.(Вы все равно хотели бы использовать ncurses поверх termcap.)

Как только вы переключитесь на ncurses, я полагаю, вы найдете элементы API для выполнения всего, что вам нужно, включая резервное копирование строк и не перезаписывание приглашения.(И, конечно же, вам не следует создавать резервные копии всего, с чего вы не выводили изначально, независимо от того, какая библиотека используется.)

На самом деле, мне вроде как нравится Пестоэто ответ.Используйте ncurses , если readline не работает или если вам нужна адресация курсора по какой-то другой причине.

Для удобной для Windows реализации readline попробуйте следующее строка чтения на основе ruby

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top