将 tmux 变量传递到 tmux.conf 中的 shell 命令中

将 tmux 变量传递到 tmux.conf 中的 shell 命令中

我正在尝试编辑 tmux 的左下角状态部分。我想展示

会话:#{session_name}

使用此设置将此字符串的当前最大长度设置为 20

状态左长度 20

这工作正常,但是一旦我输入超过 20 的会话名称(包括“Session:”),tmux 就会截断文本。我想处理整个字符串,以便任何超过 20 个字符的内容都会像这样显示

会话: mysessio...

IE。字符串被修剪为 20 个字符,最后三个字符被替换为点。我有一个正在运行的 bash 脚本,可以做我想做的事情

string="verylongstringfortesting"
lengthLimit=10

if [ ${#string} -gt $lengthLimit ]
then
  echo ${string:0:$(($lengthLimit-3))}"..."
fi

我该如何将其嵌入到 tmux.conf 中?我知道 #(shell-command) 并且我尝试过 #(echo #{session_name}) 但似乎没有返回会话名称。

答案1

收集一些信息以帮助寻找解决方案:

  • 不输出#(echo #{session_name})任何内容,但#(echo \"#{session_name}\")显示会话名称,这看起来很有希望,但是......

  • 它在引用时起作用的原因是 echo 命令从字面上获取文本#{session_name},其中不带引号,shell 将其视为注释,并且带引号,将其逐字回显到 tmux。命令退出后tmux展开序列

  • 这意味着我们无法在 shell 中操作扩展的字符串。

替代方法

  • 尝试设置限制,例如#7S将会话名称限制为 7 个字符,始终会应用该限制,但不允许您对其进行测试,因此#7...即使不需要,也会始终显示省略号,因此这是行不通的

  • 尝试直接通过 tmux 命令访问似乎没有获得合理的结果。例如,tmux list-sessions -F "#{client_session}"不显示任何内容,并tmux list-clients -F "#{client_session}"显示每个客户端的会话,但如果您有多个客户端,则没有一种明显的方法来判断哪个客户端正在运行该命令。

我还没有深入研究源代码,但我怀疑 tmux 在知道它可能用于哪个会话之前就运行了该命令。

获得此功能的最佳选择可能是调整源代码。

1.8 版本在 status.c 的第 79 行左右计算长度,并在第 322 行左右status_redraw_get_left(写入长度。status_redraw(

答案2

这已在 tmux Git HEAD 中修复,请参阅https://github.com/tmux/tmux/issues/11

相关内容