如何处理Apple终端中的滚动事件

时间:2017-03-05 09:24:39

标签: ruby terminal xterm

我想创建一个控制台应用程序,它需要从控制台

接收键输入

我发现它在备用屏幕上运行良好,但有一个问题。 Apple Terminal

当我在Apple Terminal中滚动时,代码无法捕捉滚动操作,但在终端上打印^[OA。 这在iTerm.app

中不会发生

在Terminal.app

中使用lessvim时也不会发生这种情况

我希望能找到一种可以阅读滚动操作并且不显示^[OA

的方法

以下是Ruby的示例代码:

#!/usr/bin/env ruby
require 'io/console'

def rc
  STDIN.echo = false
  STDIN.raw!

  input = STDIN.getc.chr
  if input == "\e" then
    input << STDIN.read_nonblock(3) rescue nil
    input << STDIN.read_nonblock(2) rescue nil
  end
ensure
  STDIN.echo = true
  STDIN.cooked!

  return input
  STDIN.getch
end


print "\e[?1049h"
print "\e[?1h"
print "\e="
print "\e[1;24r"

loop do
  c = rc
  break if c == "\u0003"
  p c
  print c
end

print "\e[?1049l"

1 个答案:

答案 0 :(得分:1)

这是特定于终端的功能。我没有在Terminal.app的偏好设置对话框中看到相关设置

您可以通过附加组件实现此目的(正如人们在被问及如何让Terminal.app将鼠标事件传递给应用程序时所建议的那样)。

对于后台:Terminal.app已经(慢慢)添加了与xterm兼容的功能。这不是xterm中最初的功能。 iTerm2通过复制/或gnome-terminal或xterm来获得它(除了xterm之外很难说,没有人记得添加功能时的文件)。

例如,如果iTerm2或Terminal.app从xterm复制了该功能,那么这些功能可选就像patch #282中的xterm一样(但需要注意后续工作才能完成)特色)。 xterm提供X资源设置和用于配置它的控制序列(私有模式1007)。相比之下,VTE的行为(向gnome-terminal&#34; skin&#34;提供所有功能的库)是硬编码的。

我在这里评论了这个功能: