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


208

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

Answers:


139

开始在TMUX 1.9 default-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

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

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

tmux set-option default-path "$PWD"

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

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

TMUX常见问题有标题为一个条目“我如何打开在同一个目录作为当前窗口的新窗口?”,描述的另一种方法; 虽然有点令人费解。


6
有没有一种方法可以映射<prefix>c以读取基础外壳程序实例(如果有)的工作目录,并设置default-path执行之前的内容new-window。还是对tmux要求不高:)
Shrikant Sharat 2011年

另一方面,甚至有可能读取底层shell的工作目录吗?我很想在状态栏中显示它。
Shrikant Sharat 2011年

2
没有可移植的方法来提取另一个进程的cwd(尽管在某些平台上(例如,/proc/PID/cwd在Linux上)可能)。在tmux FAQ 的条目中可能存在部分解决方案(它在打印提示时让shell记录其cwd,然后在记录的目录中绑定启动新shell的键)。
克里斯·约翰森

好吧,就我所知,这有点超出范围,并且感觉不太可靠。有件事告诉我,如果没有这些,我可能会更好。
Shrikant Sharat 2011年

1
@paradroid:通过绑定完成的任何操作(默认情况下)将使用tmux服务器的cwd 或default-path会话选项的值(如果已设置)。该TMUX常见问题都有一个描述结合,与shell中运行当前窗口的CWD启动一个新的窗口,一个关键方法相关的条目(“我怎样才能在同一目录作为当前窗口中打开一个新窗口?”) ,但方法相当复杂。可以针对split-windownew-session(而不是neww)执行相同的操作。
克里斯·约翰森

268

当前(1.9a)Tmux手册页列出了-c start-directory一些命令的可选参数,包括new-windowsplit-window。它还包含format变量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}"

1
这不适用于tmux 1.9吗?我不能做它预期的事情。
Erik Garrison 2015年

1
bind-key -r输入新窗口-c“#{pane_current_path}”,适用于tmux 2.1
Marslo 2016年

5
在OSX的tmux 2.3中工作。不要忘记停止/终止所有现有会话以查看已应用这些绑定。
jmgarnier

1
@jmgarnier或重新提供配置文件:prefix- :,然后键入source ~/.tmux.conf
ijoseph

8
@jmgarnier还是tmux source-file .tmux.conf
布劳伦

37

是的,请使用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}"

default-path路径设置被除去使用无论是从在该提交消息推荐的上游码和TMUX作者-c "#{pane_current_path}"-c "$PWDnew-windowsplit-window命令。

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


10

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

tmux new-window -c "$PWD"

这似乎也适用于拆分窗口,例如tmux split-window -v -c "$PWD"
user7089 2013年

3
$PWD在tmux 1.9a中似乎不适合我。我不得不pane_current_path按照上面的建议使用。
jordelver 2014年

3

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

~/.bashrc

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

~/.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"

至少可以与$(tmux -V)1.8一起使用。请在此处查看注释掉的行,以获取适用于没有show-environment命令的较旧tmuxes的版本。


0

tmux在1.8版中做到了这一点,但在1.9版中,此功能已被删除,以支持使用-cflag。

可以解决此问题,但可以重新绑定,new-window但是如果您要运行其他内容,它就会变得过于冗长:neww man tmux除了键入内容neww -c "#{pane_current_path}" man tmux,您还必须键入您很可能不想执行的操作。

有一个tmux的修改版(我是作者),向tmux添加了一种适当的脚本语言,以允许使用别名,在“模式”,变量,循环等中绑定多个命令...而且,它还可以恢复该行为:在当前目录中打开新的窗口和窗格。

可以从这里的资源中构建它:http : //ershov.github.io/tmux/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.