首页 > 解决方案 > 如何找到终端定义的文档/知识/指导/古籍?(让 vim 终端标题设置与 tmux 一起使用)

问题描述

我已经互联网 搜索了一个解释,但是它的神秘简洁使得我无法找到关于我可以期望系统如何工作的有用信息。 t_tst_fs

这是我现有知识的概述,如果有人可以填写最后几个点,我会很高兴...

我在这里的某个地方“开始”:http: //tldp.org/HOWTO/Xterm-Title-3.html

我验证了在我的 bash shell 中运行它(^[Ctrl+产生VEsc

printf "^[]0;testTITLEzzz"

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

笔记!我不需要使用尾随"\007"字符。

在我的内部.vimrc,当我使用set title, 并设置 atitlestring时,它总是正确设置原始终端标题,但未能设置 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'  

我不知道这里的“状态行”是什么意思。

问题2

我想知道 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,

似乎没有什么与tsor一致fs

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

此外,由于我了解到发射<Esc>]0;后跟一个字符串可以设置标题,通过我的测试,我发现无论$TERM. 这让我质疑是否查看infocmp并想知道此处指定的内容是否与我控制标题的能力相关。

虽然,老实说,我几乎不明白$TERMenv var 的意义是什么,除了那些程序,vim如果less我没有tic与当前值相对应的$TERM. 同样,只是程序知识,我正在寻求更深入和更有意义的东西。

问题 3

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

问题 4

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

标签: vimterminaltmuxxterm

解决方案


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

有关标题设置序列本身的信息,请查看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 集的格式(默认情况下,它包括活动窗格的标题和一些其他信息)。仅当 tmux 外部的 TERM 指定包含 XT 或 tsl/fsl 的条目(xterm 确实具有 XT)时,set-titles 才会起作用。

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

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

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

  • terminfo 是在 80 年代作为替代品编写的,以解决 termcap 的许多问题和限制;

  • 两者仍然用于软件和硬件终端(terminfo 更常见);

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

  • termcap 的大多数两个字符的名称都很短,terminfo 往往更长;termcap 对数据库条目的长度有 1024 字节的小限制,因此它经常缺少 terminfo 具有的许多功能;

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

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

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


推荐阅读