当在目录中时,我有时希望在同一目录中打开另一个终端。
例如,我在 中~/code/someproject/src/
,打开一个新终端,默认情况下,它在 中打开~
,如何在当前目录中启动一个新终端?
我正在运行 Arch Linux,以 urxvt 作为终端,以 i3 作为窗口管理器。
答案1
i3-faq 论坛中有一个非常有用的帖子,其中包含解决此问题的各种脚本/程序。
https://faq.i3wm.org/question/150/how-to-launch-a-terminal-from-here/
我选择了 c 程序 xcwd,它确实做得很好。它还可以在 GUI 程序中运行。
答案2
当你从现有终端启动终端时,原始终端的环境将被保留,包括当前工作目录和你设置的任何其他环境变量。这就是urxvt &
为什么
答案3
我所见过的所有答案在使用时都不起作用urxvtd
,在这种情况下,所有终端窗口都与同一个守护进程相关联urxvtd
,并且似乎没有简单的方法来识别正确的 shell 实例以获取 PWD。
为了解决这个问题,我使用了一个丑陋的黑客。我使用 zsh 的preexec
技巧在窗口标题中显示当前目录(以及当前和最后一个命令、时间等),我认为这无论如何都很有用。我使用以下形式zshrc
(您需要对其进行调整,请参阅此命令; 看这里完整最新版本):
preexec () {
local WD="$(pwd | sed "s/^\/home\/$USER/~/")"
export LASTDATE="`date +%T`"
if [[ "$TERM" == "rxvt-unicode" || "$TERM" == "rxvt-unicode-256color" ]]; then
export COMMAND="$(echo $1 | tr -d '\n')"
echo -ne "\e]0;$LOCALNAME $HOST:$WD$ $COMMAND ($LASTDATE)\a"
fi
}
然后我编写了一个脚本,在与焦点 urxvt 实例相同的目录中运行一个新脚本urxvt
,只需提取当前焦点窗口中的标题即可(参见这里最新版本):
#!/bin/bash
# run ARGV, with -cd FOLDER if FOLDER can be extracted from title of current
# window (see zsh config for how the title gets put in the window)
# http://superuser.com/a/403369/77814
quoted_args="$(printf " %q" "$@")"
# inspired by
# https://faq.i3wm.org/question/150/how-to-launch-a-terminal-from-here/%3C/p%3E.html
ID=$(xdpyinfo | grep focus | cut -d ',' -f1 | rev | cut -d ' ' -f1 | rev)
CLASS=$(xprop -id "$ID" | grep -m1 WM_CLASS | cut -d'"' -f2)
# https://stackoverflow.com/a/19411918
if [ "${CLASS^^}" != "URXVT" ]
then
# no urxvt focused -- just do the default
# optionally we could try to extract the pwd with
# https://github.com/schischi-a/xcwd or something
exec $quoted_args
fi
TITLE=$(xprop -id "$ID" | grep -m1 WM_NAME)
MYPWD=$(echo "$TITLE" | cut -d'$' -f1 | cut -d'"' -f2- | cut -d':' -f2-)
MYPWD2="${MYPWD/#\~/$HOME}"
if [ ! -z "$MYPWD2" -a -d "$MYPWD2" -a -r "$MYPWD2" -a -x "$MYPWD2" ]
then
exec $quoted_args -cd "$MYPWD2"
else
exec $quoted_args
fi
答案4
我编写了一个非常非常丑陋的黑客程序来实现这一点。
https://github.com/RichardHum/bin/blob/master/curdirterm
我的主机名是 bulletMaster,我的主目录是 /root/