tmux 在命令行和等效配置文件 (.tmux.conf) 之间的行为不同

tmux 在命令行和等效配置文件 (.tmux.conf) 之间的行为不同

tmux 在命令行和等效配置文件 (.tmux.conf) 之间的行为不同

命令行:

bash$ tmux new \; split-window -h \;

配置文件(.tmux.conf),(然后,在命令行中,我们只需键入“tmux”)

new
split-window -h

命令行版本在启动时很好地向我显示了一个拆分窗口,并且它仅创建一个会话。但是,配置文件版本的行为有所不同:

  • 它创建 2 个会话,会话名​​称为“0”和“1”,而不仅仅是一个会话。
  • 会话“0”具有分割窗口,与我在命令行版本中看到的相同。
  • 会话“1”有一个完整窗口。
  • 它在会话“1”处停止。

因此,在配置文件版本中,我终于在屏幕上到达会话“1”。如果我执行“退出”,然后附加会话 0,那么它会转到会话“0”,其结果与命令行版本相同。

或者,如果配置文件仅包含分割行:

split-window -h

然后当输入“tmux”时,它会在启动时显示一条错误消息:

.tmux.conf:1: no current target 

并且没有分割窗口(因为分割窗口命令失败:正如我们所看到的,它抱怨配置的第一行没有当前目标。)

显然,命令行版本是我想要/需要的。

配置文件版本有什么问题吗?

答案1

区别在于tmux编辑后手动输入的命令.tmux.conf

当您意识到并记住 tmux 服务器和每个 tmux 客户端是单独的进程时,tmux 的许多问题就会变得更容易理解。在某些情况下,客户端启动服务器。.tmux.conf适用于服务器,不适用于客户端。

tmux没有参数的行为就像tmux new-sessionaka tmux new。如果需要,它会启动一个 tmux 服务器。当 tmux 服务器启动时,它会.tmux.conf在处理来自 tmux 客户端的请求之前进行解析。

因此,如果没有正在运行的服务器,您将tmux创建一个 tmux 服务器并执行:

new-session      # because of .tmux.conf
split-window -h  # because of .tmux.conf
new-session      # because this is the request from your client

您的客户端最终会附加到最后一个创建的会话new-session,它隐式请求的那个。

如果您希望客户端附加到已创建的会话,请使用tmux attach-sessionakatmux attachtmux a。请注意,如果还没有 tmux 服务器,将尝试创建它,并且当最终处理来自客户端的请求时,attach-session您将创建的会话将被视为“已创建”。.tmux.conf这在文档:

如果没有启动服务器,attach-session将尝试启动它;除非在配置文件中创建会话,否则这将失败。

对于.tmux.conf有问题的情况,您需要tmux a(不仅仅是tmux)附加到从文件中创建的会话。请注意,如果 tmux 服务器已经存在,它将不会.tmux.conf再次解析,您tmux a将尝试附加到某些现有会话(如果有)。

一些用户(包括我)更喜欢返回到现有会话,因此他们在 shell 中使用tmux new-session -A或。tmux a || tmux这些命令与您的.tmux.conf.

如果您想split-window -h运行任何新创建的会话,那么可以使用这样的挂钩:

set-hook -g session-created 'split-window -h'

(这是一个 tmux 命令,来自 shell tmux set-hook …)。

相关内容