6

I used to keep my working directory when opening a new tab in gnome-terminal and want to restore this functionality. My research pointed me to sourcing /etc/profile.d/vte.sh in my ~/.zshrc (I use Z shell), however that does not change the problem, my new tabs still get opened in ~.

How can I restore this functionality? It can be a dirty hack if necessary.

My versions

~$ 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)

My ~/.zshrc (minimal example)

. /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
    I forgot to mention that, but roxterm, which is very similar to gnome-terminal, has this functionality by default. On Debian/Ubuntu, the package to install is roxterm-gtk3 or roxterm-gtk2. – admirabilis May 20 '15 at 15:05
  • Do you use a custom command to start zsh? Then it might be like my problem. – qznc Aug 03 '16 at 11:10
  • @qznc: As of 2022, including vte.sh now works with and without custom command, however only for new tabs, not windows. – Konrad Höffner Sep 13 '22 at 06:59

3 Answers3

4

A very simple workaround for you would be including a function in your ~/.zshrc that remembers the working directory and changes into it when opening zsh:

cd $(<>/dev/shm/$USER-pwd)

__cd(){
    \cd "$@"
    pwd >/dev/shm/$USER-pwd
}
alias cd=__cd

We use /dev/shm instead of /tmp to avoid disk writes, although /tmp could already be a tmpfs on your system. \cd is used to avoid a fork bomb.

If you would like this feature for gnome-terminal only, you could include an if statement to check your current terminal or active window. Also, if you are concerned that other users might find out what was your last directory, you could modify the permissions for $USER-pwd with 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
admirabilis
  • 4,712
  • 1
    But that's shared between all terminals, and all users, right? – Volker Siegel Nov 22 '14 at 18:19
  • 1
    @VolkerSiegel Your .zshrc file will not affect other users. See the updated answer. – admirabilis Nov 22 '14 at 18:55
  • 1
    Sure, the .zshrc is local, but all are sharing the same file /dev/shm/pwd to store the directory, isn't it? The "all" is all terminals, and all users. Regarding users: If you are the only one using it, that's no user conflict - but who knows, someone else on your system might copy your .zshrc, because it's good! Or source it... Regarding all terminals - it can behave very confusing. Your last cd may have been hours ago in a different window, deep into some tree. That's where your second tab will open, right? – Volker Siegel Nov 22 '14 at 19:35
  • 1
    Regarding /dev/shm/pwd, he could just replace it with ~/.pwd if that's a problem. For all the terminals, there's not much I can do, I'm afraid. Perhaps pwd >/dev/shm/pwd could be included in the __precmd. – admirabilis Nov 22 '14 at 20:17
  • 1
    You could also use /dev/shm/$USER-pwd, to keep that shm optimisation (~ can be on a slow remote drive, so it makes sense.) With the terminal of KDE, konsole, you can easily do things per window, or per tab, as they are all identifiable by environment variables. Do a printenv | sort | grep '^KONSOLE_\|SHELL_SESSION_ID' in konsole - it shows
    KONSOLE_DBUS_SERVICE=:1.78, KONSOLE_DBUS_SESSION=/Sessions/503, KONSOLE_DBUS_WINDOW=/Windows/498, KONSOLE_PROFILE_NAME=Shell, SHELL_SESSION_ID=30c0547e27e54000a7558ce28eec67c3. (There is no such feature in gnome-terminal)
    – Volker Siegel Nov 23 '14 at 01:12
  • @VolkerSiegel OK, I included your suggestion in the answer, thanks! – admirabilis Nov 23 '14 at 01:19
  • Works like a charm! There is no other user on my machine so I don't mind it being written somewhere. The only change from the old functionality is that if I close all terminals and start a new one it still restores the last one but I'm undecided if I like that more, less or the same. – Konrad Höffner Nov 24 '14 at 10:39
  • This worked perfectly for 8 years, however since a recent update this breaks ZSH directory tab completion. – Konrad Höffner May 19 '22 at 07:08
1

I'm not sure what exactly you want to restore (see below);

If you want to open gnome-terminal starting in a different directory, there is an option to specify the directory:

gnome-terminal --working-directory=/tmp

You could certainly use a script as custom startup command, which does a cd, and then starts the shell - but that does not sound like a good approach.


If it is about the default directory of the shell in a new tab being set to the current directory of the tab that was current when the new tab action was triggered: That just works for me, so I can only give hints - I run an older version, GNOME Terminal 3.6.2.

I'm pretty sure it's not the script /etc/profile.d/vte.sh that sets the directory; In my version - where it works fine - the script does not contain code related to that, and I have never used it.

The terminal program itself can just set the directory before forking the shell process.
But actually, it does not even need to do that - you want to have the same directory like before. All that is needed it not to touch the directory at all.

That said, there is a bug describing this problem:
gnome-terminal: Bug 697475 - New tab is not opened in same directory as previous tab
The discussion is very long, I do not have a summary; vte.sh is discussed there, and from skipping through, it looks like it may be fixed, but not fully released yet.

Volker Siegel
  • 17,283
  • Yes, that Bug is the same that I have, however the fix proposed there to include vte.sh does not work in my case. – Konrad Höffner Nov 22 '14 at 14:47
  • 1
    I did not read all comments - did you find out what is the point of this vte.sh - in which way, roughly, is it related to the problem? – Volker Siegel Nov 22 '14 at 18:17
0

Update from 2022:

  • including /etc/profile.d/vte.sh in ~/.zshrc does work now, however only for new tabs, not for new windows
  • the workaround from @admirabilis repeated below used to work but it now breaks directory completion with the tab key
  • both points above are true when configuring zsh as a "custom command" in Gnome Terminal as well as when setting zsh as default shell using chsh
cd $(<>/dev/shm/$USER-pwd)

__cd(){ \cd "$@" pwd >/dev/shm/$USER-pwd } alias cd=__cd

Versions

Interestingly, both Gnome Terminal and ZSH are still on the same major version as 8 years before.

~$ 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)