【问题标题】:Detect vim, less, etc. in Terminal在终端中检测 vim、less 等
【发布时间】:2014-09-11 10:48:01
【问题描述】:

在 OS X Yosemite 的终端应用程序中,您现在可以使用鼠标在 vim/less/whatever 中滚动。如何检测正在运行的程序是否支持这种滚动?

【问题讨论】:

  • 您的意思是如何在代码中检测到它?
  • 或者,更一般地说:从哪里检测到它?
  • 假设我正在制作自己的终端应用程序。我将如何制作这样的功能?

标签: macos vim terminal osx-yosemite


【解决方案1】:

优胜美地终端侦听备用屏幕转义序列。如果您转到首选项→设置→键盘,您可以看到“滚动备用屏幕”选项。

有关 xterm 的备用屏幕功能的更多信息:

在 VT102 模式下,有转义序列可以激活和停用 与显示区域大小相同的备用屏幕缓冲区 的窗户。激活后,将保存当前屏幕并 替换为备用屏幕。保存滚动的行 窗口顶部被禁用,直到恢复正常屏幕。这 xterm 的 termcap(5) 条目允许可视化编辑器 vi(1) 切换到 用于编辑的备用屏幕并在退出时恢复屏幕。

【讨论】:

    【解决方案2】:

    想要支持滚动的程序会向终端发送一个转义序列以启用鼠标输入,例如,\e[?1002h 用于报告按钮点击。然后,每当您单击鼠标时,终端都会将控制代码发送回程序,告诉它您单击了哪个按钮以及单击的位置。通过鼠标点击按钮 4 和 5 发送向上或向下滚动。

    请参阅从第 29 页开始的“鼠标跟踪”部分 XTerm Control Sequences文档。

    在 bash 中试试这个:

    $ echo $'\e[?1002h'
    $ hexdump -C
    ... click and scroll a bit, then hit enter...
    ^[[Ma7*^[[Ma7*^[[M`7*^[[M`7*^[[M`7*^[[M`7*^[[Ma7*^[[Ma7*^[[M`1.^[[M`1.
    00000000  1b 5b 4d 61 37 2a 1b 5b  4d 61 37 2a 1b 5b 4d 60  |.[Ma7*.[Ma7*.[M`|
    00000010  37 2a 1b 5b 4d 60 37 2a  1b 5b 4d 60 37 2a 1b 5b  |7*.[M`7*.[M`7*.[|
    00000020  4d 60 37 2a 1b 5b 4d 61  37 2a 1b 5b 4d 61 37 2a  |M`7*.[Ma7*.[Ma7*|
    ^C
    Returned 130 (SIGINT).
    

    启动鼠标跟踪的程序(在本例中为 bash)接收鼠标输入作为标准输入上的编码内容。

    十年来,开源 MouseTerm plugin 一直在 Terminal.app 中启用滚动。详细可以看一下它的源码。

    【讨论】:

    • 然而,这可能不是故事。 less 不支持鼠标报告(AFAIK),但各种 X 终端仿真器和最新版本的 tmux 在运行时滚动时会发送 VT 光标向上/向下信号。我知道 tmux 就是这种情况,它会查看备用屏幕缓冲区(查看相同的 XTerm 资源)是否处于活动状态。
    • @andrewdotn 我将这两个命令放在一个脚本中,运行脚本并滚动,但我没有得到任何输出。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2011-08-11
    • 2016-10-23
    • 2017-05-08
    • 2015-10-26
    相关资源
    最近更新 更多