在现代网络浏览器和其他带有文本内容的软件中,Space向下滚动或多或少一屏。ShiftSpace向上滚动除 之外的所有内容less
。
如何使用ShiftSpace向上滚动less
?或者,是否有另一个寻呼机(POSIX 兼容性是我唯一的要求)可以完成这项工作?
有人告诉我一些终端模拟器和一些终端 UI 库(ncurses?)无法识别ShiftSpace.这是一个有效的问题吗?
答案1
我认为你提出了由技术限制引起的文化冲突。由于Shift+Space生成与 相同的输出Space,因此 Unix 终端模型对它们的处理方式相同。为了区分两者,您需要一个支持按键向上/按键按下事件的编程环境。这在 X11 和支持重新映射键的终端仿真器中是可能的。将Shift+重新映射Space到 的示例PageUp:
# For [u]rxvt, in ~/.Xdefaults:
URxvt.keysym.Shift-space: \033[5~
答案2
Space终端模拟器在和 上发送相同的字符Shift+Space。如果他们不这样做,那么按住按键时输入文本就会变得很尴尬Shift(请参阅@egmont的回答扩展了该论点)。
Shift+Space但是,您可以通过映射到默认情况下最终会插入空格的字符序列来解决此问题,并且您可以为其配置应用程序,例如less
在按下此类按键时向上滚动。
例如,这样的序列可以是(在 BS 为字符的系统上将`
DEL
SPC
更改为DEL
)。BS
erase
对于xterm
,添加资源:
XTerm.VT100.translations: #override \
Shift <KeyPress> space: string("`") string(0x7f) string(" ")
并配置less
:
printf '%s\n' '#command' '`\177\40 back-screen' | lesskey -
答案3
less
目前不支持这一点,但它绝对可以添加。
如果一个程序使用xterm 控制序列通过写入终端设置
modifyOtherKeys
为 2 ,然后使用有关哪些修改键处于活动状态的额外信息来注释键。特别是对于该键,在 xterm 中处于活动状态时,+会变成。必须将其正确解释为+ ,然后触发向上滚动。\e[>4;2m
xterm
SpacemodifyOtherKeys
ShiftSpace\e[27;2;32~
less
ShiftSpace
虽然这肯定可以在 xterm 中工作,但它不会在每个终端应用程序中工作。但是,那些无法识别要打开的转义序列的终端modifyOtherKeys
将忽略该转义序列,并在您按Shift+时继续向程序发送普通空格字符Space。
xterm 网站上有一个非常详细的页面,解释了modifyOtherKeys
代码是如何计算的:https://invisible-island.net/xterm/modified-keys.html
答案4
在终端模拟器中,此功能将通过按住 Shift 键来中断输入带有嵌入空格的大写文本。例如,如果您想输入“It's A Title”,则必须在“A”和“T”之间松开 Shift 键。按住它会使光标移开并导致您键入的其余内容错位。我相信这会比您通过向上滚动功能获得的效果更烦人。
在输入文本时保持常规行为,并在 Space 向下滚动时向上滚动将需要重新设计和应用程序的大力合作(例如,应用程序能够切换 Shift+Space 发送的内容),我非常确定这不会发生。
关键区别在于,无论您是在编辑还是查看内容,GUI 应用程序都知道“上下文”,而终端模拟器无法知道这一点。