Получить конечную позицию от Руби - PullRequest
3 голосов
/ 28 апреля 2011

Должен быть лучший способ сделать это.

temp_file ||= Tempfile.new()
system("stty -echo; tput u7; read -d R x; stty echo; echo ${x#??} > #{temp_file.path}")
temp_file.gets.chomp.split(';').map(&:to_i)

Обычно я запускаю bash-скрипт из этого вопроса в подпроцессе, а затем читаю вывод из перенаправленного файла.

Без использования C или каких-либо драгоценных камней (хорошо, stdlib), как лучше это сделать? Кросс-совместимость не имеет большого значения.

Ответы [ 3 ]

2 голосов
/ 01 мая 2015

Вот чистая рубиновая реализация получения позиции курсора:

require 'io/console'

class Cursor
  class << self
    def pos
      res = ''
      $stdin.raw do |stdin|
        $stdout << "\e[6n"
        $stdout.flush
        while (c = stdin.getc) != 'R'
          res << c if c
        end
      end
      m = res.match /(?<row>\d+);(?<column>\d+)/
      { row: Integer(m[:row]), column: Integer(m[:column]) }
    end
  end
end

puts Cursor.pos  #=> {:row=>25, :column=>1}

tput u7 был заменен эхом от \e[6n до $stdout. Вероятно, он менее переносим, ​​но помогает нам использовать только код ruby.

2 голосов
/ 28 апреля 2011

curses в stdlib, но это беспорядок.

0 голосов
/ 28 апреля 2011

https://github.com/eclubb/ncurses-ruby

Вы можете попробовать это в Ruby. Кажется, у вас есть curX и cury, что вам нужно.

...