我如何找到终端定义的文档/知识/指导/古籍?(获取Vim终端标题设置以与tmux一起工作)

3lxsmp7m  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(98)

我有scouredinternet作为解释,但是t_tst_fs的神秘简洁使得我不可能找到关于如何期望系统工作的有用信息。
这里是我现有知识的概述,如果有明智的人可以填写最后几个点,我会很高兴。
我在这里“开始”:http://tldp.org/HOWTO/Xterm-Title-3.html
我在我的bash shell中运行了这个程序(^[是由Ctrl+V,ESC生成的):
printf "^[]0;testTITLEzzz"
这个可以用。它可以在原始终端上设置标题,也可以在tmux中设置窗格的标题。
注意!我不需要使用尾随的"\007"字符。
在我的.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'

我不知道“状态栏”是什么意思。

问题二

我想知道Vim中记录的这些终端输出代码如何对应于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%t\016%e\017%;,
    sgr0=\E[m\017, 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对齐。
在这一点上,我不认为这两个字母代码Map在一起,这是我多年来一直怀疑的事情。
此外,由于我了解到发出<Esc>]0;后跟一个字符串可以设置标题,通过我的测试,我发现无论$TERM中指定的终端功能如何,这都可以正常工作。这让我怀疑,如果看infocmp,想知道这里指定的东西是否与我控制标题的能力有关。
不过,老实说,我几乎不明白$TERM env var的意义是什么,除了vimless这样的程序抱怨如果我没有tic'd一个对应于$TERM当前值的terminfo文件。再说一次,只是程序性的知识,我在寻找一些更深层次和有意义的东西。

问题三

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

问题4

完全不清楚我应该为t_fs设置什么,如果有的话,这也涉及到为什么\007 BEL字符不需要终止标题序列的问题。为什么没有必要,我应该期待什么会终止序列?新行?

atmip9wb

atmip9wb1#

你肯定需要结尾的\007(或\033\),否则某些终端将停止响应,等待序列的结束。你在tmux里面试过这个吗?tmux有一个超时,以防止窗格挂起,但大多数其他终端没有。如果你在xterm中不使用\007,它会挂起。
有关标题设置序列本身的信息,请参阅https://invisible-island.net/xterm/ctlseqs/ctlseqs.html(标题设置为OSC 0和2 -请参阅“操作系统命令”下的内容)。
ts和fs是termcap名称(terminfo是tsl/fsl),意思是“到状态行”和“从状态行”(顾名思义,infocmp显示的是terminfo,而不是termcap)。这些在硬件终端有单独的状态行的日子里有些历史,但近年来有时被重新用于X终端标题。查看terminfo(5)中的“状态行”部分,了解有关状态行功能的一些信息。实际上,tsl和fsl并不经常提供或使用,相反,大多数应用程序会查看XT功能(“xterm标题”)来确定是否应该使用OSC序列。XT是一个扩展功能-您需要使用“infocmp -x”来查看它。
您可以使用OSC序列在tmux中设置标题,默认情况下,标题(#{pane_title}格式)在状态右侧的引号中显示。tmux也不会设置外部终端标题(终端tmux正在运行),除非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的许多问题和限制;
  • 两者都仍然用于软件和硬件终端(termino更常见);
  • 它们都以类似的方式工作-存在命名条目的数据库(如“xterm”或“tmux-256 color”),其给予终端的一组命名能力;有些功能是标志(如“XT”)或数字(如“颜色”),但大多数是字符串,它们指定了应用程序应该发送到终端以使某些事情发生的顺序(如“cuu 1”使光标向上移动一行-“\033[A”在vt 100兼容的终端上);
  • termcap的名字大多数都是两个字符,termfo往往更长; termcap对数据库条目的长度有一个1024字节的小限制,所以它经常缺少terminfo所具有的许多功能;
  • TERM被设置为应用程序应该在数据库中查找的termcap或terminfo条目的名称;
  • terminfo数据库作为ncurses(一个用于绘制到终端的库,许多终端应用程序都使用该库)的一部分进行维护和提供;使用TIC从Terminfo生成termcap数据库。

没有一个真正的单一来源与所有的信息放在一起。对于转义序列,https://vt100.net/有很多旧硬件终端的手册(其中大部分现在已经无关紧要了),我上面给xterm的链接记录了xterm和大多数其他现代终端模拟器支持的转义序列的子集(几乎所有的终端仍然是vt 100兼容的,xterm是事实上的标准终端)。ncurses有一些手册:terminfo(5)和termcap(5)。有一本O 'Reilly的书叫做“termcap and terminfo”,它也涵盖了很多内容,但它是在80年代后期写的,所以有些已经过时了。

相关问题