首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将tmux窗格标题设置为用户定义(如果存在),否则当前工作文件或目录。

将tmux窗格标题设置为用户定义(如果存在),否则当前工作文件或目录。
EN

Unix & Linux用户
提问于 2020-01-28 20:54:22
回答 2查看 5.9K关注 0票数 8

从tmux 2.6开始,tmux现在允许每个窗格标题。它们可以通过tmux set -g pane-border-status top启用。这在每个窗口运行10+窗格时非常方便。我还将标题格式设置如下,以便重新命名它们:

代码语言:javascript
运行
复制
set -g pane-border-format "#{pane_index} #{pane_title}"
# rename prompt
bind . command-prompt -p "(rename-pane)" -I "#T" "select-pane -T '%%'"

我唯一不喜欢的是回退默认设置,默认为机器的主机名。相反,我倾向于以下几点:

  • 如果pane_title是由用户设置的,请使用它(#{pane_title})
  • 否则,使用当前工作目录(#{pane_current_path})。

任何一种都是直截了当的:

  • tmux set -g pane-border-format "#{pane_index} #{pane_title}"
  • tmux set -g pane-border-format "#{pane_index} #{pane_current_path}"

tmux (https://github.com/tmux/tmux/wiki/Formats)的格式化部分显示,我可以使用三元条件检查来实现我想要的回退类型,但是在所有情况下我都很难让它工作,因为当pane_index未设置时,似乎默认(我猜)生成窗格时返回的任何hostname命令。以下是我目前的情况:

代码语言:javascript
运行
复制
tmux set -g pane-border-format "#{pane_index} #{?#{!=:#{pane_title},$(hostname)},#{pane_title},#{pane_current_path}}"

这适用于用户显式重命名的窗格,也适用于以相同主机名生成的窗格。不幸的是,我的工作机器上的主机名随IP而变化,所以上面的命令看起来太脆弱了。更糟糕的是,由于某种原因,它只在直接从窗格运行时才能工作,而不是放在tmux配置中(当然,没有tmux前缀)。是否有更好的方法来确定pane_title是否未设置?

EN

回答 2

Unix & Linux用户

发布于 2020-01-29 06:32:45

您可以尝试使用钩子将新窗格的窗格标题设置为更容易识别的内容,例如:

代码语言:javascript
运行
复制
set-hook -g after-split-window 'selectp -T ""'
set-hook -g after-new-window 'selectp -T ""'
set-hook -g after-new-session 'selectp -T ""'

然后查找空标题,而不是主机名:

代码语言:javascript
运行
复制
#{?pane_title,#{pane_title},#{pane_current_command}}
票数 6
EN

Unix & Linux用户

发布于 2020-01-28 22:11:51

我不确定我是否能回答你所有的问题,但我可以尝试几个问题。

在我的配置中,我有一个monstrocity:

代码语言:javascript
运行
复制
setw -g pane-border-format ' #{=/-20/…:pane_title} [#{=/-20/…:pane_current_command}] #(pgrep -P "#{pane_pid}" | tr "\n" " ")#{pane_current_path} #{?alternate_on,<Alt Mode> ,}'

(其中一些可能依赖tmux ~3.1特性)

使用setw -g而不是set -g可以使它从配置中为您工作。

正如你所看到的,我的方法就是把我想知道的一切都塞进去,因为如果你不使用它或者试图对空间吝啬的话,你就会浪费边框中的其余空间。终端很少比60 cols更小,所以我认为保持边框内容线紧凑是零值。使用低对比度的颜色是这里的关键,以保持一个或多或少干净的外观。因此,这解决了试图控制在该领域显示什么的尴尬之处:考虑不要试图控制显示和显示两者。

窗格标题的另一件事是,它“应该”由shell和/或正在运行的程序设置。这在去年十月给我带来了很大的头痛,虽然我知道我已经解决了这个问题。到目前为止,我的大脑和git日志都不能提供足够的信息来确定您需要做的正确的事情是控制pane_title的设置,但只需说这是需要触摸bash/zsh配置的复杂事情之一,而这可能是将其分配给主机名的原因,而不是一些更有用的东西,比如cwd或active命令行。

我相信我必须将:XT字符串添加到我的终端重写中,以帮助它正常工作。请参阅https://unix.stackexchange.com/a/75382/12497

这对我来说是一条漫长的道路,这也很重要,因为到目前为止,pane_title是检查哪些程序可能在窗格中运行的唯一可靠的、直接的方法。自从我开始工作以来,我的上下文敏感的tmux键绑定(它是pane_title值的谓词)工作得非常完美:当zsh处于活动状态时,zsh将pane_title设置为运行的最后一个命令,当vim启动时,它会用我在vimrc中设置的特定字符串覆盖窗格标题,这样可以很好地控制上下文敏感的键绑定。之前存在的一个问题是,如果脚本"myscript“运行Vim,那么pane_title就变成了"myscript",这使得我的密钥绑定系统不可能知道我正在窗格中运行Vim。既然Vim被授权更新终端标题,并在tmux窗格中正确设置它,检查窗格是否运行vim的逻辑就大大简化了。

另一种检测窗格中运行的内容的方法是查询操作系统,查看进程是什么,因为我们确实可以访问PID。但到目前为止,我一直在避免为这类事情而疯狂地使用管道,而倾向于使用“标准”功能。我确信,如果pane_title最终击败了我,我将编写一个C++程序,在相关窗格中打印我正在运行的内容。祝好运。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/564618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档