从 Fedora 18 升级到 36 后,鼠标单击停止在 XTerm 的 shell(readline)中定位光标

从 Fedora 18 升级到 36 后,鼠标单击停止在 XTerm 的 shell(readline)中定位光标

我使用以下控制序列进行设置,当我在 XTerm 中的 shell (BASH) 中单击命令行时光标移动到该位置。至少,在我曾经拥有的古老 Fedora 18 中,它曾经是这样工作的。 (我倾向于编写很长的管道,因此这个功能对我来说非常出色并且非常重要,因为在使用它的这些年里我已经完全习惯了它。)

我如何启用“点击定位”功能(通常在PS1BASH 变量中):

\[\e[?2001;2002;2003;2004;2005;2006s\e[?2001;2002;2003h\]

并恢复原始保存的状态(通常是PS0为了不影响从 shell 运行的命令):

\[\e[?2001;2002;2003;2004;2005;2006r\]

以下是用于实验的别名:

alias tmouseon='printf -- '\''\e[2001;2002;2003;2004;2005;2006s\e[?2001;2002;2003h'\'''
alias tmouseoff='printf -- '\''\e[?2001;2002;2003;2004;2005;2006r'\'''

这是我的 XTerm 配置(其中某些部分可能与此问题相关,但根据 XTerm 手册,我无法找到其他选项或可能导致我的配置出现问题的选项;另请注意,我不xrdb -merge知道我的 X 资源文件,.xinitrc但只是xrdb因为我从来不喜欢发行版的默认设置,并且希望完全控制它,而且我已经这样使用它很多年了,没有任何问题):

! Init
XTerm.ptyInitialErase: true
XTerm.waitForMap:      true

! Buffers
XTerm.buffered:    true
XTerm.bufferedFPS: 100
XTerm.maxBufSize:  131072
XTerm.minBufSize:  8192

! TERMINAL

! Name
XTerm.VT100.termName: xterm-256color

! Session
XTerm.VT100.loginShell: true

! Features
XTerm.VT100.allowFontOps:   true
XTerm.VT100.allowMouseOps:  true
XTerm.VT100.allowTcapOps:   true
XTerm.VT100.allowTitleOps:  true
XTerm.VT100.allowWindowOps: true
XTerm.VT100.c132:           true

! Input
XTerm.VT100.backarrowKey:        true
XTerm.VT100.backarrowKeyIsErase: true

! Scrolling
XTerm.VT100.scrollBar:       false
XTerm.VT100.scrollTtyOutput: false
XTerm.VT100.allowScrollLock: true

! Screen buffer
XTerm.VT100.saveLines: 10000

! Alternate screen
XTerm.VT100.titeInhibit:  true
XTerm.VT100.tiXtraScroll: true

! Visual bell
XTerm.VT100.visualBell:      true
XTerm.VT100.visualBellLine:  true
XTerm.VT100.visualBellDelay: 150

! Pointer shape
XTerm.VT100.pointerShape: hand1

! Margin bell
XTerm.VT100.marginBell:  true
XTerm.VT100.nMarginBell: 8

! Cursor blinking
XTerm.VT100.cursorBlink:   true
XTerm.VT100.cursorOffTime: 250
XTerm.VT100.cursorOnTime:  750

! Selection
XTerm.VT100.charClass:          33:48,36-47:48,58-59:48,61:48,63-64:48,95:48,126:48
XTerm.VT100.highlightReverse:   false
XTerm.VT100.highlightSelection: true
XTerm.VT100.trimSelection:      true

(省略颜色设置...)

在我将非常非常过时的(我知道,我知道,但是当我使用相当“斯巴达”的环境并使用常用工具时)Fedora 18工作站升级到最近的Fedora 36之后,在XTerm中移动光标的功能鼠标单击停止工作,我真的找不到问题的根本原因。 (我努力解决它,但完全失败了。)我想恢复功能。有人可以帮忙吗?

有人有同样的问题吗?如何分析呢?

我猜可能TermInfo 发生了一些变化或者其他什么,但我不知道如何进一步深入研究它......感谢您关于如何让它再次工作的所有想法!

答案1

我将留下我的其他答案,因为它通常适用于其他发行版。这个答案探讨了为什么readline-button在 Fedora 31 中停止工作。

我下载了 rpm 的第 30 版,在本地解压,然后在二进制文件中查找“readline-button” xterm

rel=30; mkdir $rel; cd $rel
dnf download --disablerepo='*' --enablerepo=fedora --downloadonly \
 --releasever=$rel xterm
rpm2cpio xterm-*fc$rel.x86_64.rpm | cpio -cdimB
strings usr/bin/xterm | grep readline-button

它仍然出现在 Fedora 30 二进制文件中,但在 Fedora 31 二进制文件中消失了。

我下载了源 rpm 并解压它们:

dnf download --disablerepo='*' --enablerepo=fedora-source \
 --source --releasever=$rel xterm
HOME=$PWD rpm -i xterm-*fc$rel.src.rpm 
HOME=$PWD rpmbuild -bp --nodeps rpmbuild/SPECS/xterm.spec
(cd rpmbuild/BUILD/; ln -s xterm-* xterm)

比较来源显示出许多变化,但这似乎是相关的:

$ diff -wub {30,31}/rpmbuild/BUILD/xterm/ptyx.h
@@ -830,12 +845,6 @@
-#if OPT_PASTE64 && !OPT_READLINE
-/* OPT_PASTE64 uses logic from OPT_READLINE */
-#undef  OPT_READLINE
-#define OPT_READLINE 1
-#endif

更改日志文件中提到:

$ diff -wub {30,31}/rpmbuild/BUILD/xterm/xterm.log.html
+    <li>adjusted ifdef's so that the paste64 configure option does
+    not automatically enable the readline-mouse configure
+    option.</li>

标题下的补丁 #338 - 2018/12/09。如果我们比较 rpm 规范文件,唯一真正的区别是从 xterm 版本 334 迁移到 346,其中包括这个新补丁:

$ diff -wub {30,31}/rpmbuild/SPECS/xterm.spec
-Version: 334
+Version: 346

这里还有进一步的线索:

$ diff -wub {30,31}/rpmbuild/BUILD/xterm/INSTALL
   --enable-readline-mouse enable support for mouse in readline applications
-       Compile-in code to support experimental bracketed paste mode, i.e.,
+       Compile-in code to support predecessor to bracketed paste mode, i.e.,
        provide functions for setting/getting the selection data.  Essentially
        this puts xterm into a mode that sends special function-key strings to
        bracket the data.
-       (See --enable-paste64, which fits xterm's protocol better).
+       (The "paste64" feature, which fits xterm's protocol better, is
+       configured by default).

规范文件显示--enable-readline-mouse从未用于配置31/rpmbuild/SPECS/xterm.spec

%configure \
        --enable-meta-sends-esc \
        --disable-backarrow-key \
        --enable-256-color \
        --enable-exec-xterm \
        --enable-luit \
%{?with_trace: --enable-trace} \
        --enable-warnings \
        --enable-wide-chars \
        --with-app-defaults=%{x11_app_defaults_dir} \
        --with-icon-theme=hicolor \
        --with-icondir=%{_datadir}/icons \
        --with-utempter \
        --with-tty-group=tty \
        --disable-full-tgetent

如果没有此选项,OPT_READLINE则定义为 0,因此不会编译 readline-button 代码,例如31/rpmbuild/BUILD/xterm-346/charproc.c

#if OPT_READLINE
    { "readline-button",        ReadLineButton },
#endif

结论

Fedora 不使用--enable-readline-mouse.在版本 30 之前,这并不重要,因为--enable-paste64默认启用并OPT_PASTE64用于定义OPT_READLINE.从版本 31 和补丁 338 开始,不再执行此操作,因此我们失去了此功能。

解决方案可能是添加--enable-readline-mouse到 Fedora 规范文件中。

答案2

我不熟悉您提供的转义序列,但有一个功能man xterm可能有用:

读行按钮() 通过在按钮释放事件上回显重复的光标向前或向后控制序列来支持可选的读取行功能,以请求主机应用程序更新其光标位置的概念以匹配按钮事件。

要使用它,请添加合适的翻译绑定,或使用以下命令对其进行测试-xrm

xterm -xrm 'XTerm.VT100.translations:  #override\
 Mod4 <Btn1Down>: readline-button()\n'

对于此示例绑定,当您使用 Meta(或 Super)键在输入行中的字符上单击鼠标左键时,xterm 会生成左键或右键,直到光标对齐。

类似地,urxvt 有一个内置的 perl 扩展(参见 参考资料man urxvt-readline),默认情况下启用,并绑定了 Shift 和左键。

相关内容