如何找到 documentation/knowledge/mentorship/ancient 大部头的终端定义? (获取 vim 终端标题设置以与 tmux 一起使用)

How can I find documentation/knowledge/mentorship/ancient tomes for terminal definitions? (getting vim terminal title setting to work with tmux)

我有 scoured the 的解释,但是 t_tst_fs 的神秘简洁使得我无法找到有关我如何期望系统工作的有用信息。

这是我现有知识的概述,如果有人能补充最后几个点,我会很高兴...

我"started"这里某处:http://tldp.org/HOWTO/Xterm-Title-3.html

我在我的 bash shell 中验证了 运行 (其中 ^[ 是由 Ctrl+V,Esc):

printf "^[]0;testTITLEzzz"

这行得通。它可以在原始终端上设置标题,也可以在 tmux 中为窗格设置标题。

注意!我不需要使用尾随 "[=20=]7" 字符。

在我的 .vimrc 中,当我使用 set title 并设置 titlestring 时,它总是正确地正确设置原始终端标题,但未能设置 tmux 窗格标题。

一旦我设置了它(与 ^[ 相同,它是一个原始的 ESC 字符):

if &term == "tmux-256color-italic"
  set t_ts=^[]0;                
  set t_fs=                     
endif                             

它开始用于设置 tmux 窗格标题。我很高兴。

现在我的烦恼是如何把这些程序性的知识变成我以后可以用到的实践性知识。

问题 1

我在 vim 中查找了帮助,我得到了这个:

   t_ts    set window title start (to status line)         t_ts 't_ts'   
   t_fs    set window title end (from status line)         t_fs 't_fs'  

我不知道这里的"status line"是什么意思。

问题 2

我想知道 vim 中记录的这些 terminal-output-codes 如何对应于 xterm 世界的其余部分,或者我应该如何称呼它。

例如,我可以查询 infocmp 以获取我当前的终端配置和 xterm 终端配置的值:

$ infocmp xterm
#   Reconstructed via infocmp from file: /lib/terminfo/x/xterm
xterm|xterm-debian|X11 terminal emulator,
    am, bce, km, mc5i, mir, msgr, npc, xenl,
    colors#8, cols#80, it#8, lines#24, pairs#64,
    acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
    clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r,
    csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
    cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
    cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
    cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
    dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
    el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H,
    hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@,
    il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS,
    invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~,
    kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D,
    kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=^?,
    kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
    kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~,
    kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q,
    kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~,
    kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~,
    kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~,
    kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S,
    kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~,
    kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~,
    kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q,
    kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~,
    kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~,
    kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~,
    kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q,
    kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~,
    kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~,
    kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~,
    kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~,
    kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~,
    kind=\E[1;2B, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
    kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El,
    memu=\Em, op=\E[39;49m, rc=\E8, rep=%p1%c\E[%p2%{1}%-%db,
    rev=\E[7m, ri=\EM, rin=\E[%p1%dT, ritm=\E[23m, rmacs=\E(B,
    rmam=\E[?7l, rmcup=\E[?1049l\E[23;0;0t, rmir=\E[4l,
    rmkx=\E[?1l\E>, rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m,
    rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7,
    setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
    setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
    setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
    sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
    sgr0=\E(B\E[m, sitm=\E[3m, smacs=\E(0, smam=\E[?7h,
    smcup=\E[?1049h\E[22;0;0t, smir=\E[4h, smkx=\E[?1h\E=,
    smm=\E[?1034h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
    u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c,
    u9=\E[c, vpa=\E[%i%p1%dd,
$ infocmp
#   Reconstructed via infocmp from file: /home/slu/.terminfo/t/tmux-256color-italic
tmux-256color-italic|screen with 256 colors and italic,
    am, km, mir, msgr, xenl,
    colors#0x100, cols#80, it#8, lines#24, pairs#0x7fff,
    acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
    clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=\r,
    csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
    cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
    cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM,
    cvvis=\E[34l, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
    dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K,
    enacs=\E(B\E)0, flash=\Eg, home=\E[H, hpa=\E[%i%p1%dG,
    ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L,
    ind=\n, indn=\E[%p1%dS, is2=\E)0, kbs=^?, kcbt=\E[Z,
    kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
    kdch1=\E[3~, kend=\E[4~, kf1=\EOP, kf10=\E[21~,
    kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
    kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
    khome=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
    nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM,
    ritm=\E[23m, rmacs=^O, rmcup=\E[?1049l, rmir=\E[4l,
    rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m,
    rs2=\Ec\E[?1000l\E[?25h, sc=\E7,
    setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
    setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
    sgr=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t6%e7%;,
    sgr0=\E[m7, sitm=\E[3m, smacs=^N, smcup=\E[?1049h,
    smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
    tbc=\E[3g, vpa=\E[%i%p1%dd,

似乎没有什么符合 tsfs

在这一点上,我不认为 2 个字母代码映射在一起,这是我多年来一直怀疑的事情。

此外,由于我了解到发出 <Esc>]0; 后跟一个字符串可以设置标题,通过我的测试,我发现无论 [=30= 中指定的终端功能如何,这总是有效的].这让我怀疑是否查看 infocmp 并想知道此处指定的内容是否与我控制标题的能力相关。

虽然,老实说,我几乎不明白 $TERM env var 的意义,除了 vimless 之类的程序会抱怨,如果我没有tic' 一个对应于 $TERM 当前值的 terminfo 文件。同样,只是程序性知识,我正在寻找更深入和有意义的东西。

问题 3

现在我已经找到允许 vim 正确设置 tmux 窗格标题的配置组合,我想知道 vim 在我设置 t_ts 在原始终端上工作但不适用于 tmux。我知道有一种方法可以让 vim 认为我是 运行 它是交互式的,同时将它的所有输出传送到一个二进制文件中,然后进行十六进制洞穴探险以找出代码中的差异,但我有忘记了这是怎么做到的,怀疑有没有更痛苦的方法来找出答案。

问题 4

完全不清楚我应该为 t_fs 设置什么,如果有的话,这也涉及到为什么 [=39=]7 BEL 字符不是终止标题序列所必需的问题。为什么没有必要,我应该期望什么会终止序列?换行符?

您肯定需要尾随的 \007(或 \033\\),否则某些终端将停止响应以等待序列结束。你在 tmux 里面试过这个吗? tmux 有一个超时来防止窗格挂起,但大多数其他终端没有。如果您在没有 \007 的情况下在 xterm 中尝试,它将挂起。

有关标题设置序列本身的信息,请查看 https://invisible-island.net/xterm/ctlseqs/ctlseqs.html(标题设置为 OSC 0 和 2 - 在 "Operating System Commands" 下查看)。

ts 和 fs 是 termcap 名称(terminfo 是 tsl/fsl),意思是 "to status line" 和 "from status line"(顾名思义,infocmp 显示的是 terminfo,而不是 termcap)。这些从硬件终端有一个单独的状态行的时代开始就有些历史了,但近年来有时被重新用于 X 终端标题。查看 terminfo(5) 中的 "Status Lines" 部分,了解有关状态行功能的一些信息。实际上,并不经常提供或使用 tsl 和 fsl,相反,大多数应用程序会查看 XT 功能 ("xterm titles") 以确定它们是否应该使用 OSC 序列。 XT 是一种扩展功能 - 您需要使用 "infocmp -x" 才能看到它。

您始终可以使用 OSC 序列在 tmux 中设置标题,默认情况下标题(#{pane_title} 格式)显示在 status-right 中的引号中。 tmux 也不会设置外部终端标题(终端 tmux 是 运行ning in)除非 set-titles 选项打开。 set-titles-string 选项控制标题 tmux 集的格式(默认情况下它包括活动窗格的标题和一些其他信息)。 set-titles 仅在 tmux 外部的 TERM 指定包含 XT 或 tsl/fsl 的条目时才有效(xterm 确实有 XT)。

我不知道如何配置 vim 来设置标题,但看起来你在 t_ts 和 t_fs 的正确轨道上 - 看起来 vim 使用的是 tsl/fsl 但使用的是 termcap 名称(可能是 vi 的遗留物,它早在 terminfo 存在之前就已经开始了)。

我可以简单介绍一下它的工作原理:

  • termcap 最初是在 70 年代编写的,允许 vi 在不同的(硬件)终端上 运行;

  • terminfo 是作为 80 年代的替代品编写的,用于解决 termcap 的一些问题和限制;

  • 软件和硬件终端仍然使用(terminfo 更常用);

  • 它们都以类似的方式工作——有一个命名条目数据库(如 "xterm" 或 "tmux-256color"),它给出了终端的一组命名功能;一些功能是标志(例如 "XT")或数字(例如 "colors"),但大多数是字符串,它们指定应用程序应该发送到终端以使某事发生的顺序(例如 "cuu1" 使光标向上移动一行 - 在 vt100 兼容终端上为 "\033[A");

  • termcap 的名称最短 two-character,terminfo 往往更长; termcap 对数据库条目的长度有 1024 字节的小限制,因此它经常缺少 terminfo 具有的许多功能;

  • TERM 设置为应用程序应在数据库中查找的 termcap 或 terminfo 条目的名称;

  • terminfo 数据库作为 ncurses(许多终端应用程序使用的用于绘制终端的库)的一部分进行维护和交付; termcap 数据库是使用 tic.

  • 从 terminfo 生成的

并没有真正将所有信息放在一起的单一来源。对于转义序列,https://vt100.net/ 有很多关于旧硬件终端的手册(但是其中很多现在已经无关紧要了),我在上面为 xterm 文档提供的 link 了 xterm 和大多数其他支持的转义序列现代终端仿真器支持其中的一个子集(几乎所有仍在使用的终端都与 vt100 兼容,而 xterm 是事实上的标准终端)。 ncurses 有一些手册:terminfo(5) 和 termcap(5)。有一本名为 "termcap and terminfo" 的 O'Reilly 书也涵盖了很多内容,但它是在 80 年代后期写的,所以其中一些已经过时了。