如何在 tmux 的当前目录上创建一个新窗口?

Shr*_*rat 246 terminal-multiplexer tmux

是否可以打开一个new-window其工作目录设置为我当前所在的目录。如果重要的话,我正在使用zsh

小智 341

当前 (1.9a) Tmux 手册页列出了-c start-directory一些命令的可选参数,包括new-windowsplit-window。它还包含格式变量pane_current_path,它指的是 Current path if available.

通过组合这些,我们可以使用当前工作目录打开一个新窗口,
new-window -c "#{pane_current_path}"
如果当前路径包含空格,则需要引用。

如果要垂直拆分当前窗格,请使用
split-window -c "#{pane_current_path}"
或,用于水平拆分
split-window -h -c "#{pane_current_path}"

要使键绑定默认使用当前工作目录打开新的拆分和窗口,请将以下内容添加到您的.tmux.conf. 在"与周围的引号是告诉TMUX它不应该启动一个字符串,而是绑定的"关键。

bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
Run Code Online (Sandbox Code Playgroud)

  • @jmgarnier 或只是`tmux 源文件 .tmux.conf`。 (8认同)
  • 在 OSX 上的 tmux 2.3 中工作。不要忘记停止/终止所有现有会话以查看应用的这些绑定。 (7认同)
  • bind-key -r 输入 new-window -c "#{pane_current_path}",适用于 tmux 2.1 (2认同)
  • @jmgarnier 或重新获取配置文件:`prefix`-`:`,然后输入`source ~/.tmux.conf` (2认同)

Chr*_*sen 177

开始在TMUX 1.9default-path移除选项,所以你需要使用-c带有选项new-window,并split-window(通过重新绑定例如c"%绑定包括
-c '#{pane_current_path}')。有关详细信息,请参阅此问题的其他一些答案。


一个相关功能于2012 年 2 月上旬登陆tmux SVN 主干。在包含此代码的tmux构建中,调用的tmux键绑定new-window将创建一个与当前窗格的活动进程具有相同当前工作目录的新窗口(只要default-path会话选项为空;默认为)。split-window当通过绑定调用命令时,由命令创建的窗格也是如此。

这使用特定于平台的特殊代码,因此目前仅支持某些操作系统:Darwin (OS X)、FreeBSD、Linux、OpenBSD 和 Solaris。

这应该在tmux (1.7?)的下一个版本中可用。


使用tmux 1.4,我通常只使用

tmux neww
Run Code Online (Sandbox Code Playgroud)

在已经具有所需当前工作目录的 shell 中。

但是,如果我预计需要使用相同的当前工作目录创建许多窗口(或者我希望能够使用通常的 <prefix>c键绑定启动它们),那么我default-path通过设置会话选项

tmux set-option default-path "$PWD"
Run Code Online (Sandbox Code Playgroud)

在已经具有所需当前工作目录的 shell 中(尽管您显然可以从任何目录执行此操作,而只需指定值)。

如果default-path设置为非空值,则将使用其值,而不是从 的命令行调用“继承”当前工作目录tmux neww

TMUX常见问题有标题为一个条目:“我怎么能在同一目录为当前窗口打开一个新窗口?” 描述了另一种方法;虽然有点复杂。

  • 有没有办法可以映射 `&lt;prefix&gt;c` 来读取底层 shell 实例的工作目录(如果有的话)并在执行 `new-window` 之前设置 `default-path`。或者对 *tmux* 要求太多了 :) (7认同)
  • 没有可移植的方法来提取另一个进程的 cwd(尽管在某些平台上是可能的(例如 Linux 上的 `/proc/PID/cwd`))。在 *tmux* FAQ(它有外壳在打印提示时记录其 cwd,然后在记录的目录中绑定一个启动新 shell 的键)。 (2认同)

mmo*_*oya 57

是的,使用new-window -c "#{pane_current_path}". 您可以将以下内容添加到您的中~/.tmux.conf以使其持久化(假设默认键绑定):

bind c new-window -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
Run Code Online (Sandbox Code Playgroud)

default-path路径设定为除去从上游代码和TMUX作者在建议提交使用消息要么-c "#{pane_current_path}"-c "$PWDnew-windowsplit-window命令。

我也在这个重复的问题中回答了。


mis*_*lav 10

使用最新版本的 tmux(v1.8,但也可能在 v1.7 中):

tmux new-window -c "$PWD"
Run Code Online (Sandbox Code Playgroud)

  • `$PWD` 在 tmux 1.9a 中似乎对我不起作用。我必须按照上面的建议使用`pane_current_path`。 (3认同)

小智 5

当我尝试将它们作为绑定(特别是)时,其他答案对我不起作用tmux split-window -c。但我已经制定了自己的解决方案,我已经使用了一年多,该解决方案适用于新窗口和拆分:

~/.bashrc:

PS1="$PS1"'$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#D" | tr -d %) "$PWD")'
Run Code Online (Sandbox Code Playgroud)

~/.tmux.conf:

unbind-key c
bind-key c run-shell 'tmux new-window "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key C new-window

bind-key - run-shell 'tmux split-window -v "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key | run-shell 'tmux split-window -h "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"
Run Code Online (Sandbox Code Playgroud)

至少可以与 $(tmux -V) 1.8 一起使用。请参阅此处注释掉的行,了解适用于没有 show-environment 命令的旧 tmux 的版本。