如何让 tmux 会话从 1 而不是 0 开始计数?

如何让 tmux 会话从 1 而不是 0 开始计数?

我有这样的设置:

# Number windows and panes starting at 1 so that we can jump to
# them easier.
set -g base-index 1
set -g pane-base-index 1

但我也想用同样的方法来切换 tmux 会话。当我打开 tmux 会话列表时,它仍然从 0 开始。是否可以不从 0 开始会话计数,而是从 1 开始计数?

tmux 会话列表

答案1

不可能,将来也不可能。有拒绝功能请求对于session-base-index,开发人员认为“这只是一个没有帮助的功能”。

答案2

您似乎指的是会话组索引,它是生成的,并不用于告知tmux您要附加到哪个会话。

它用在模板为list-sessions

"#{?session_grouped, (group ,}" \

并生成于session.c(并且总是从零开始):

/* Find session group index. */
u_int
session_group_index(struct session_group *sg)
{
    struct session_group   *sg2;
    u_int           i;

    i = 0;
    TAILQ_FOREACH(sg2, &session_groups, entry) {
        if (sg == sg2)
            return (i);
        i++;
    }

    fatalx("session group not found");
}

但该值仅用于格式化输出。

答案3

太长了;博士

跳至“解决方案”部分。


分析

有一个大误解这里。

prefixs您的屏幕截图可能是在默认情况下运行以下 tmux 命令之后拍摄的:

choose-tree -Zs

(在 shell 中,您可以使用 运行它tmux choose-tree -Zs)。括号内的数字有没有什么与会话 ID 或会话名称有关。它们只是“行号”目前在列表中。例如,列表可能如下所示:

(0) + foo: 2 windows (attached)
(1) + bar: 1 windows

但展开所有项目后,它可能看起来像这样:

(0)   - foo: 2 windows (attached)
(1)   ├─> - 0: [tmux]*Z
(2)   │   ├─> 0: man
(3)   │   ├─> 1: bash*
(4)   │   └─> 2: bash
(5)   └─> - 1: bash-
(6)       ├─> 0: bash
(7)       ├─> 2: bash
(8)       ├─> 3: bash
(9)       ├─> 4: bash
(M-a)     ├─> 5: bash
(M-b)     └─> 1: bash*
(M-c) - bar: 1 windows
(M-d) └─> 0: bash*

所以这些“行号”不是偶数,它们是你可以使用的键。注意上面的列表中只有0M-c( Alt+ c) 对应于会话。tmux 计算会话的方式与这些键无关,因此请求(并拒绝)session-base-index不会解决你的问题。请求计数行中choose-tree从 1 开始会更有意义。

-K您可以通过指定来定义自己的键choose-tree。例如,穷人的逐一轮班是通过以下方式实现的:

choose-tree -ZsK '#{e|+:1,#{line}}'

这给了你这个:

(1) + foo: 2 windows (attached)
(2) + bar: 1 windows

但这只会将键附加到最多九行。扩展后我的示例如下所示:

(1) - foo: 2 windows (attached)
(2) ├─> - 0: [tmux]*Z
(3) │   ├─> 0: man
(4) │   ├─> 1: bash*
(5) │   └─> 2: bash
(6) └─> - 1: bash-
(7)     ├─> 0: bash
(8)     ├─> 2: bash
(9)     ├─> 3: bash
        ├─> 4: bash
        ├─> 5: bash
        └─> 1: bash*
    - bar: 1 windows
    └─> 0: bash*

没有的地方等等M-aM-b

在里面代码我发现了这个:

#define WINDOW_TREE_DEFAULT_KEY_FORMAT \
  "#{?#{e|<:#{line},10}," \
      "#{line}" \
  "," \
      "#{?#{e|<:#{line},36}," \
              "M-#{a:#{e|+:97,#{e|-:#{line},10}}}" \
      "," \
              "" \
      "}" \
  "}"

所以我得出的结论choose-tree -K是:

#{?#{e|<:#{line},10},#{line},#{?#{e|<:#{line},36},M-#{a:#{e|+:97,#{e|-:#{line},10}}},}}

#{line}您可以通过将每个替换为#{e|+:1,#{line}};来直接移动一位。或者您可以通过在适当的情况下更改硬编码常量来减少计算次数:

#{?#{e|<:#{line},9},#{e|+:1,#{line}},#{?#{e|<:#{line},35},M-#{a:#{e|+:97,#{e|-:#{line},9}}},}}

解决方案

tmux 命令将是:

choose-tree -ZsK '#{?#{e|<:#{line},9},#{e|+:1,#{line}},#{?#{e|<:#{line},35},M-#{a:#{e|+:97,#{e|-:#{line},9}}},}}'

您可以通过调用 tmux 内的 shell 来测试它tmux choose-tree …。如果结果是您想要的,则prefixs通过将以下行添加到您的.tmux.conf

bind-key s choose-tree -ZsK '#{?#{e|<:#{line},9},#{e|+:1,#{line}},#{?#{e|<:#{line},35},M-#{a:#{e|+:97,#{e|-:#{line},9}}},}}'

请记住,该文件是在 tmux 服务器启动时解析的。要影响已经运行的服务器,您需要将命令传递给 tmux(例如,tmux bind-key s …在 tmux 内的 shell 中)或重新加载更改后的文件 ( prefix:source-file ~/.tmux.confEnter)。


结果示例

(1) + foo: 2 windows (attached)
(2) + bar: 1 windows

展开后:

(1)   - foo: 2 windows (attached)
(2)   ├─> - 0: [tmux]*Z
(3)   │   ├─> 0: man
(4)   │   ├─> 1: bash*
(5)   │   └─> 2: bash
(6)   └─> - 1: bash-
(7)       ├─> 0: bash
(8)       ├─> 2: bash
(9)       ├─> 3: bash
(M-a)     ├─> 4: bash
(M-b)     ├─> 5: bash
(M-c)     └─> 1: bash*
(M-d) - bar: 1 windows
(M-e) └─> 0: bash*

答案4

如前所述,本机不支持此功能。

最简单的解决方案是自动创建dummy会话。

只需将这.tmux.conf一行添加到您的文件中:

# Start a dummy session to make real sessions start from 1
new-session -d -s dummy

然后,当您启动 tmux 时,它将在后台创建一个名为“dummy”的会话。您的第一个手动创建的会话将编号为 1。

您可以将名称更改为dummy任何其他名称。

相关内容