如何讓 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 開始。

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任何其他名稱。

相關內容