gpt4 book ai didi

linux - 终端:发送禁止操作转义序列或控制字符

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:37 28 4
gpt4 key购买 nike

我需要我的终端发送一个未使用的控制字符或转义序列,它在所有层都没有效果:被shell(bash,…)忽略,被行编辑器(readline,…)忽略,被所有应用程序(vim,less,mutt,…)忽略。然后,我将在tmux中绑定这个密钥,必要时使用用户定义的密钥转义序列。我使用什么控制字符或转义序列?更多信息如下:
我希望将tmux中的Control-Shift-c键和弦绑定到一个将tmux选择复制到X剪贴板选择缓冲区的操作。然后继续让Control-Shift-c在tmux未运行时将终端选择复制到X剪贴板选择缓冲区中。终端仿真器为控制移位键和控制键输入生成相同的输出,参见[1][2]。第一步是改变这一点:

# Enable fixterms (I think) sequences for all keys:
xterm -xrm "XTerm.vt100.modifyOtherKeys: 2" -xrm "XTerm.vt100.formatOtherKeys: 1"

这指示xterm为由Control、Alt或Meta修改的所有键构造转义序列。据我所知,没有任何东西支持这些转义序列,不管它们是使用原始xterm序列格式化的,还是通过新的fixterms[3]规范格式化的。即使是tmux也只支持这些序列的一个子集[4],而不支持成熟的CSI序列解析器[5]。
最简单的解决方法是按照[6]只让Control-Shift-c发送一个fixterms序列。由于tmux不支持此序列,因此必须通过 user-keys选项手动定义它。它还必须绑定在tmux的根键表中,而不是一个复制模式表中;否则,如果tmux不在复制模式中,绑定将被忽略,并通过tmux传递给一个终端应用程序。
# Configure only Control-Shift-c to send a fixterms sequence:
xterm -xrm "XTerm*vt100.translations: #override \n\
Ctrl Shift <Key>c: string(0x1b) string ([67;6u)"

# Recognize (but don't handle) the Control-Shift-c fixterms sequence:
tmux set-option -s user-keys[0] "\e[67;6u"

# Copy the selection to the clipboard buffer only when in copy-mode. If
# there is no selection, nothing will be copied:
tmux bind-key -T root User0 if-shell -Ft= "#{pane_in_mode}"
"send-keys -X copy-pipe 'xsel -i -b'"

所有其他不支持fixterms序列的应用程序都将收到输入垃圾。更糟糕的是,未知的转义序列可能会被误解并触发特定于应用程序的命令。最初,我考虑使用 tcgetpgrp(3)[7]来获取当前在终端中运行的命令的名称,非常类似于tmux[8]中的 #{pane_current_command}
xterm <-> bash <-> command

Control-Shift-c的终端绑定将首先像往常一样将终端的选择复制到剪贴板缓冲区;然后调用我的外部程序[9]。如果终端命令当前不是tmux,则不会发生任何事情;否则,外部命令会将fixterms Control-Shift-c序列写入终端的 pts。当tmux接收到该序列时,它将用自己的选择覆盖剪贴板缓冲区。
xterm -xrm "XTerm*vt100.translations: #override \n\
Ctrl Shift <Key>c: copy-selection(PRIMARY) \n\
exec-formatted("~/send_fixterms_sequence_if_tmux.py")

这无法处理嵌套的终端仿真器,就像在ssh上运行tmux一样——这是非常常见的。
xterm <-> bash <-> ssh <-> bash <-> tmux <-> bash <-> command

这是我的困境,我目前正在考虑几种选择:
让终端发送控制字符而不是转义序列。始终支持控件字符。我希望有一个无所事事的字符,并希望控制- @(NUL或ASCII 0),但该字符是由外壳回响,并在VIM插入模式有显着的效果。如果不存在这样的字符,请参见第3条。也许我可以使用一个不常见的控制字符,但它也必须配置为不执行任何操作,跨所有层:xterm、bash、readline、vim等。
让终端发送一个未使用的或不做任何事情的转义序列,而不是Control-Shift-c fixterms序列。所有层都需要忽略序列:shell(bash,…)忽略序列,行编辑器(readline,…)忽略序列,所有应用程序(vim,less,mutt,…)忽略序列。见#3。
根据[10],修改“我的终端”的terminfo条目,以确保在所有层上至少忽略上述(控制代码、标准转义序列或fixterms转义序列)中的一个。然后,在tmux中绑定这个修改过的序列。
调用readline来做一些神奇的事情。因为这不太可能对交替模式终端应用产生任何影响。
其思想是,像以前一样,将终端的选择复制到剪贴板缓冲区。然后插入 <STRING>就好像它已经被键入一样。当tmux接收到 <STRING>时,它将用自己的选择覆盖剪贴板缓冲区。任何其他应用程序都会忽略它:包括,尤其是没有打印到终端的内容。
xterm -xrm "XTerm*vt100.translations: #override \n\
Ctrl Shift <Key>c: copy-selection(PRIMARY) string(<STRING>)

我还计划将其扩展到gnome终端,因此将转义序列或控制字符写入终端的 pts将是一个很好的例子。我只使用xterm作为一个工作示例-这个问题绝对不是xterm特有的。
https://stackoverflow.com/a/14876639
https://unix.stackexchange.com/a/116630
http://www.leonerd.org.uk/hacks/fixterms/
https://github.com/tmux/tmux/blob/master/xterm-keys.c
http://www.leonerd.org.uk/code/libtermkey/
https://stackoverflow.com/a/2179779
http://man7.org/linux/man-pages/man3/tcgetpgrp.3.html
https://github.com/tmux/tmux/blob/master/osdep-linux.c
https://invisible-island.net/xterm/manpage/xterm.html#h2-KEY-BINDINGS
Bind Ctrl+Tab and Ctrl+Shift+Tab in tmux
https://man.openbsd.org/ssh#ESCAPE_CHARACTERS
编辑,新想法:SSH提供自己的终端仿真器,或者至少连接到 pts对[11]。这是否意味着它可以处理传入的转义序列,并可能运行外部远程命令,例如使用 tcgetpgrp的命令?或者这是一种不安全感?与其配置一系列可能没完没了的终端应用程序来忽略转义序列,不如像配置tmux那样只配置SSH。

最佳答案

所有可用的序列对于接收它的应用程序来说都可能看起来像某种类型的密钥(例如,0是C-@和C-Space),没有任何序列可以保证应用程序会忽略。
如果我是你,我会发送F20的转义序列或者其他东西,然后绑定这个密钥,在其他你经常使用的应用程序中什么也不做。

关于linux - 终端:发送禁止操作转义序列或控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56842817/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com