我有scouredtheinternet进行解释,但是t_ts
和t_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窗格标题。我很高兴
现在,我所遇到的麻烦是如何将这种程序知识转化为我将来可以使用的实践知识。
我在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,
[似乎没有与ts
或fs
保持一致。
至此,我认为这2个字母的代码不会相互映射,这是我多年来一直怀疑的东西。
此外,由于我了解到通过发出<Esc>]0;
后跟一个字符串可以设置标题,因此通过测试,我发现无论$TERM
中指定的终端功能如何,它始终有效。这使我产生疑问:是否查看infocmp
并想知道此处指定的内容是否与我控制标题的能力有关。
尽管,说实话,我几乎不理解$TERM
env var的意义,除了vim
和less
之类的程序,如果我没有tic
'da terminfo文件对应$TERM
的当前值。再说一次,只是程序上的知识,我正在寻找更深入和有意义的东西。
现在,我发现了一种配置组合,可以通过vim正确设置tmux的窗格标题,我想知道在我的t_ts
设置可以在原始终端上工作之前,vim发送的是什么,但该工作不起作用用于tmux。我知道有一种方法可以欺骗vim,使我以交互方式运行它,同时将其所有输出通过管道传输到二进制文件中,然后以十六进制的方式搜索代码中的差异,但是我忘记了如何做到这一点,并且怀疑可以找到更轻松的方法。
完全不清楚我应该为t_fs
设置什么,如果有的话,这也涉及到为什么不需要\007
BEL字符来终止标题序列的问题。为什么没有必要,我期望终止该序列吗?换行符?
您肯定需要结尾的\ 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}格式)以引号显示在右状态。除非打开set-titles选项,否则tmux不会同时设置外部终端标题(终端tmux正在运行)。 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”使光标向上移动一行- vt100兼容终端上的“ \ 033 [A”);
termcap具有最短的两个字符的名称,terminfo倾向于更长; termcap对数据库条目的长度限制为1024个字节,因此它经常缺少terminfo具有的许多功能;
TERM设置为应用程序应在数据库中查找的termcap或terminfo条目的名称;
terminfo数据库作为ncurses的一部分进行维护和运输(ncurses的一部分(用于绘制到终端的库,许多终端应用程序都使用该库); termcap数据库是使用tic从terminfo生成的。