我曾经在 gnome-terminal 中打开新选项卡时保留我的工作目录,并希望恢复此功能。我的研究指出我/etc/profile.d/vte.sh
在我的(我使用 Z shell)中进行采购~/.zshrc
,但这并没有改变问题,我的新选项卡仍然在~
.
我怎样才能恢复这个功能?如果有必要的话,这可能是一个肮脏的黑客行为。
我的版本
~$ uname -a
Linux konradslaptop2 3.17.2-1-ARCH #1 SMP PREEMPT Thu Oct 30 20:49:39 CET 2014 x86_64 GNU/Linux
~$ gnome-terminal --version
GNOME-Terminal 3.14.2
~$ zsh --version
zsh 5.0.7 (x86_64-unknown-linux-gnu)
我的 ~/.zshrc (最小示例)
. /etc/profile.d/vte.sh
# auto generated by .zsh installation
if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
function zle-line-init () {
printf '%s' "${terminfo[smkx]}"
}
function zle-line-finish () {
printf '%s' "${terminfo[rmkx]}"
}
zle -N zle-line-init
zle -N zle-line-finish
fi
答案1
对您而言,一个非常简单的解决方法是在您的文件中包含一个函数~/.zshrc
,该函数会记住工作目录并在打开 zsh 时对其进行更改:
cd $(<>/dev/shm/$USER-pwd)
__cd(){
\cd "$@"
pwd >/dev/shm/$USER-pwd
}
alias cd=__cd
我们用/dev/shm代替/tmp以避免磁盘写入,尽管/tmp可能已经是一个临时文件系统在您的系统上。\cd
用于避免叉子炸弹。
如果您只想在 gnome-terminal 中使用此功能,则可以包含 if 语句来检查当前终端或活动窗口。另外,如果您担心其他用户可能会发现您的最后一个目录是什么,您可以修改权限$USER-pwd
:chmod
if xprop -id $(xprop -root 32x ' $0' _NET_ACTIVE_WINDOW | awk '{print $NF}') WM_CLASS | grep -q gnome-terminal; then
cd $(<>/dev/shm/$USER-pwd)
chmod 600 /dev/shm/$USER-pwd
__cd(){
\cd "$@"
pwd >/dev/shm/$USER-pwd
}
alias cd=__cd
fi
答案2
我不确定你到底想恢复什么(见下文);
如果您想gnome-terminal
从不同的目录开始打开,可以使用指定目录的选项:
gnome-terminal --working-directory=/tmp
您当然可以使用脚本作为自定义启动命令,该命令执行cd
, 然后启动 shell - 但这听起来不是一个好方法。
如果是关于新选项卡中 shell 的默认目录被设置为触发新选项卡操作时当前选项卡的当前目录:这对我有用,所以我只能给出提示 - 我运行旧版本,GNOME Terminal 3.6.2
.
我很确定这不是/etc/profile.d/vte.sh
设置目录的脚本;在我的版本中 - 它工作正常 - 脚本不包含与之相关的代码,而且我从未使用过它。
终端程序本身可以在分叉 shell 进程之前设置目录。
但实际上,它甚至不需要这样做 - 你想要像以前一样拥有相同的目录。所需要的只是根本不接触目录。
也就是说,有一个错误描述了这个问题:
gnome-terminal:错误 697475 - 新选项卡未在与上一个选项卡相同的目录中打开
讨论很长,我没有总结;vte.sh
在那里进行了讨论,从跳过来看,它看起来可能已修复,但尚未完全发布。
答案3
2022 年更新:
- 包括现在
/etc/profile.d/vte.sh
确实~/.zshrc
有效,但仅适用于新的选项卡,不适合新的视窗 - 下面重复的 @admirabilis 的解决方法曾经有效,但现在使用 Tab 键破坏了目录完成
- 当在 Gnome 终端中将 zsh 配置为“自定义命令”以及使用 chsh 将 zsh 设置为默认 shell 时,上述两点均成立
cd $(<>/dev/shm/$USER-pwd)
__cd(){
\cd "$@"
pwd >/dev/shm/$USER-pwd
}
alias cd=__cd
版本
有趣的是,Gnome Terminal 和 ZSH 的主要版本仍然与 8 年前相同。
~$ uname -a
Linux archlinux 5.19.5-arch1-1 #1 SMP PREEMPT_DYNAMIC Mon, 29 Aug 2022 15:51:05 +0000 x86_64 GNU/Linux
~$ gnome-terminal --version
# GNOME Terminal 3.44.1 using VTE 0.68.0 +BIDI +GNUTLS +ICU +SYSTEMD
~$ zsh --version
zsh 5.9 (x86_64-pc-linux-gnu)