vte.sh 不会将我的 gnome-terminal 目录保留在新选项卡中

vte.sh 不会将我的 gnome-terminal 目录保留在新选项卡中

我曾经在 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-pwdchmod

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)

相关内容