如何通过窗口管理器绑定在与上次使用的终端相同的目录中打开新终端?


25

我使用的是平铺窗口管理器,并且从gnome-terminal多个选项卡切换到urxvt了窗口管理器管理的多个实例。我错过的功能之一是能够打开默认为上一个工作目录的新终端。

简而言之:我需要一种方法来打开一个新的urxvt(bash),默认值为上次使用的$ xpWD。

我想到的唯一解决方案是使用以下方式保存当前路径cd

echo $PWD > ~/.last_dir

并以这种方式在新终端上还原路径:

cd `cat ~/.last_dir`

我可以输入第二个命令,.bashrc但是我不知道如何在每次目录更改时执行第一个命令:)

任何不涉及screen或不tmux使用的更简单的解决方案都是值得欢迎的。


您使用的是tabbedPerl的扩展名urxvt吗?
rozcietrzewiacz 2012年

没有标签,我使用的是WM管理的新终端
Luca

Answers:


9

我看到使用的三种解决方案.last_dir。您可以放置echo $PWD > ~/.last_dir

  1. 在一个特殊的函数中,该函数可以包装cd

    function cd_
    {
      [[ -d "$@" ]] || return 1
      echo "$@" > ~/.last_dir
      cd "$@"
    }
    

    将此放置在您的目录中~/.bashrc,然后cd_每次要存储新的工作目录时使用cd代替。

  2. 在您$PROMPT_COMMAND不推荐)中:

    PROMPT_COMMAND="$PROMPT_COMMAND; pwd > ~/.last_dir"

    您可以直接从终端进行测试,也可以将其放置在中~/.bashrc。但是,此解决方案每次出现提示时都会触发磁盘写入,这可能会引起麻烦-但另一方面,.last_dir无论您到那里如何,它都将包含当前目录。

  3. 在的自定义perl扩展脚本rxvt。我从来没有自己创建过一个,但是您可以在网上找到很多示例。


这就是我要找的PROMPT_COMMAND。我将尝试此解决方案,希望它不会影响性能。

坦率地说,这是一种相当粗糙的方式。我个人最喜欢迈克尔的解决方案:)
rozcietrzewiacz 2012年

1
如果需要在终端外部工作,我喜欢perl扩展方式。似乎比侵入某些东西更干净PROMPT_COMMAND,这是
有史以来

$ PWD似乎只是第一次被评估
Luca

@neon Aaah ...对不起。问题在于如何引用PROMPT_COMMAND。(或者说,如何$PWD报价为准。)让我解决这个问题...有。那应该做到的。
rozcietrzewiacz 2012年

13

我目前正在使用此版本的#1解决方案

# save path on cd
function cd {
    builtin cd $@
    pwd > ~/.last_dir
}

# restore last saved path
if [ -f ~/.last_dir ]
    then cd `cat ~/.last_dir`
fi

在我的内心 .zshrc


我也使用#1解决方案,并添加trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXIT我想一直在我的家中开始,除非我打开一个新标签页
rkmax 2013年

如果使用auto_cdzsh功能,则无法使用。事实证明,我们可以使用zsh提供的钩子:gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton

12

这实际上是微不足道的。如果urxvt从现有urxvt窗口中运行,则新窗口将位于同一目录中。由于这个原因,我已经使用dup别名urxvt &。如果要将其绑定到热键,则可以使用bash的bind命令。例如,将其绑定到F1

$ bind '"\e[11~": "urxvt &\n"'

谢谢你的提示。我知道终端子进程会保持状态,但我不知道您可以在bash中将键绑定到命令。我想从WM进行此操作,以避免将终端机聚焦。

我喜欢。当您要打开新终端时,不会写入任何磁盘,并且只有执行一次。
rozcietrzewiacz 2012年

我唯一要更改的是使用( urxvt & ) &>/dev/null背景,而不仅仅是背景。
rozcietrzewiacz 2012年

此解决方案很棒且更灵活,但我不喜欢使用2种绑定,一种用于启动终端,另一种用于派生新的绑定。


4

当然,这是修改cd行为的一种可行方法,但是我想展示一个更简单的解决方案。在man bash(1)中,我发现如果退出交互式它将运行(~/.bash_logout如果存在)。因此,cd可以在退出时保存最后一个路径的每次调用,而不必存储该路径。

~/.bash_logout的很简单:

echo $PWD >~/.lastdir

在我的某处.bashrc放置了这一行:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)

1
请注意,.bash_logout仅在login shells退出时才运行,并非总是如此。
henfiber 2015年

1
或者,bash使用以下trap "echo $PWD > ~/.lastdir" EXIT"
命令

@henfiber感谢您的评论!我认为在这种情况下,该外壳是一个登录外壳,因此它将正常运行。另一方面,trap方法也不错,我喜欢!
TrueY

2

通常,我一次使用多个终端窗口,每个窗口都有多个选项卡。例如:一个用于源代码开发选项卡的窗口,一个用于乳胶文件的窗口,一个用于R执行和脚本编写的窗口等。在一个窗口中,我希望一个新的选项卡式终端切换到该特定窗口中最后使用的目录(过去曾经可以使用,但是对于新的gnome版本,它不起作用了)。以下肮脏的解决方案适合我。我把它放在.bashrc中。

dirfilename="/tmp/.lastdir-$WINDOWID"
[ -r "$dirfilename" ] &&  {
    savdir=`cat $dirfilename`
    cd "$savdir"
}

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}

太完美了...哇!谢谢。我对黑客攻击不了解很多,但是我已经很喜欢它了……
apil.tamang 2016年
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.