Open a new tab in the same directory

43

15

Say you are in /very/cool/and/deeply/nested/folder . And you want to open a new terminal tab in the same folder.

How would you do that?

I use Mac OS and Zsh.

Nerian

Posted 2011-01-13T17:36:24.093

Reputation: 1 237

Answers

63

Use Oh-My-Zsh and add the 'osx' plugin in your ~/.zshrc like:

plugins=(osx)

If you use OSX's Terminal App, you also need to add the terminalapp plugin too: credit

plugins=(osx terminalapp)

If you use iTerm you need to set a configuration option (Note that you may not need the zsh plugins for this to work): credit

Preferences > Profiles > Default > General > Working Directory > Reuse previous session's directory option

iTerm2 Preferences panel update to reuse previous session directory.

That's all you need to do!

Pieter

Posted 2011-01-13T17:36:24.093

Reputation: 746

@YWCAHello have you found solution to this problem? – Michał Miszczyszyn – 2014-10-07T08:30:41.753

@Miszy I moved back to vanilla Bash :/ – YWCA Hello – 2014-10-07T15:45:27.793

1does this also work in iTerm ? – ahmy – 2012-05-30T07:59:43.993

1

@ahmy looks like it should: https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/osx/osx.plugin.zsh#L30

– philfreo – 2012-06-25T17:52:49.213

2This works for me unless I'm running a process in the console. If I have a process, say rails running, and I try to open a new window via command-n, I end up back at my home directory. – YWCA Hello – 2013-08-20T22:08:36.153

23

Another option now available in Mac OS X Lion is using the built-in feature. It uses 'escape sequences' to find out the current directory. For me it works if I use these commands in my .zshrc:

precmd () {print -Pn "\e]2; %~/ \a"}
preexec () {print -Pn "\e]2; %~/ \a"}

it is also possible to use PS1 (for Bash, from this wiki):

export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "

where \e]2; is the escape sequence to print things in the titlebar. It seems that Terminal.app is getting its information from there.

More information:

Tim

Posted 2011-01-13T17:36:24.093

Reputation: 1 642

1I understand how this updates the titlebar, but I don't understand how this causes a new tab to open in the same directory as the previous tab. – mareoraft – 2015-12-18T23:41:03.607

@Nick using just chpwd doesn't update the title bar. – ma11hew28 – 2016-06-26T13:47:57.667

also, I think oh-my-zsh has this by default. I've been using this for a week or so now and it works pretty much out of the box.

– Tim – 2011-08-08T07:18:34.910

As of Mac OS X Lion 10.7, Terminal will display the working directory using the “proxy” icon in the title bar, has options to create new terminals at the same directory, and supports Resuming terminals. As a convenience, Terminal will look at the contents of the window/tab titles to see if they contain a valid pathname. However, in /etc/bashrc you’ll see that it also supports a new escape code for informing Terminal of the working directory using a file: URL, which can handle all valid pathnames via percent-encoding (the window/tab titles can only contain a subset of ASCII characters). – Chris Page – 2012-03-10T22:04:21.417

Also note that the support for pathnames in the titles can be slow if the title contains any other text or if the title contains slashes but is not a valid pathname, because it has to test every substring that looks like a pathname to see if it’s a valid directory. – Chris Page – 2012-03-10T22:09:04.860

2The escape sequence for setting the working directory is the same basic code as for setting the titles—Operating System Command (OSC)—with code 7 instead of 0-2: \e]7;file://hostname/percent-encoded-pathname\a – Chris Page – 2012-03-10T22:29:46.567

There is also a code for setting the “represented file”, which you can use to set the window proxy icon to, for example, the file being displayed or edited. It’s the same sequence as for the working directory, but with code 6 instead of 7. For example, I have Emacs and Less configured to set it to the current file. – Chris Page – 2012-03-10T22:30:32.867

3Why use precmd and preexec? Why not just chpwd () {print -Pn "\e]2; %~/ \a"}? – Nick – 2012-04-18T15:53:48.037

3

This is a very simple version which I used in bash and also works in zsh. It saves the current folder in a file, after every command (Doesn't hurt too much IMO) and opens a new terminal in the saved current folder.

add the following to .zshrc

# emulate bash PROMPT_COMMAND (only for zsh)
precmd() { eval "$PROMPT_COMMAND" }
# open new terminal in same dir
PROMPT_COMMAND='pwd > "${HOME}/.cwd"'
[[ -f "${HOME}/.cwd" ]] && cd "$(< ${HOME}/.cwd)"

mjspier

Posted 2011-01-13T17:36:24.093

Reputation: 141

This is cool but requires you to actually execute a command in a tab to update. This can in rare cases cause unexpected behavior. Maybe there is a different function we can use that gets triggered when you switch tabs instead of run a command? – mareoraft – 2015-12-18T23:46:14.990

1

gdirs seems like a way to almost do it: new tab, then gdirs to select the deep directory and voila. My first idea was to make the directory stack shared among all tabs and do cd ~1 after the new tab, but I cannot find how to do that, as it seems each instance of zsh keeps its own. History sharing goes via a common file, so maybe that could be done here too...

Henno

Posted 2011-01-13T17:36:24.093

Reputation: 639

0

Adding terminalapp to .zshrc didn't work for me so I looked for the plugin ~/.oh-my-zsh/plugins/terminalapp and it tells me:

# This file is intentionally empty.
#
# The terminalapp plugin is deprecated and may be removed in a future release.
# Its functionality has been folded in to the core lib/termsupport.zsh, which
# is loaded for all users. You can remove terminalapp from your $plugins list
# once all your systems are updated to the current version of Oh My Zsh.

Steve Root

Posted 2011-01-13T17:36:24.093

Reputation: 1

0

New tabs already open in the same folder (Cmd+T). For new windows (Cmd+N) the solution from Pieter is right:

Preferences > Profiles > Default > General > Working Directory > Reuse previous session's directory option

Punnerud

Posted 2011-01-13T17:36:24.093

Reputation: 101

0

This is how you do it in bash.

This shell script will tell (quiet literally, using Applescript) Terminal.app to open a new tab then switch to the current directory:

#!/bin/bash
osascript -e 'tell application "Terminal"' \
-e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' \
-e "do script with command \"cd `pwd`;clear\" in selected tab of the front window" \
-e 'end tell' &> /dev/null

… put the above shell script in a directory in your $PATH (i.e. /usr/local/bin) and make sure it’s executable:

$ chmod +x /usr/local/bin/nt

(source)

Nifle

Posted 2011-01-13T17:36:24.093

Reputation: 31 337

Note that as of Mac OS X Lion 10.7, by default Terminal will start new tabs in the same working directory as the previous tab. So you only need to arrange to create the tab now. (If you’re using bash. If you’re using another shell, look at the code in /etc/bashrc for how to tell Terminal about the current working directory.) – Chris Page – 2012-03-10T22:22:29.537

0

If you need to open this new tab right now, without changing your config files or installing new plugins, run this:

pwd | pbcopy

Then open a new Terminal tab manually (with ⌘T), and in the new tab:

cd "`pbpaste`"

Warning: this will overwrite the contents of the system clipboard.


An alternative, longer method that does not overwrite the clipboard:

pwd > $TMPDIR/wd

Open your new tab.

cd "$(cat $TMPDIR/wd)"
rm -f $TMPDIR/wd

Rory O'Kane

Posted 2011-01-13T17:36:24.093

Reputation: 668

0

Per Pieter's comment above, once the plugins=(git osx) plugins are installed, you can just type tab and it will open a new tab in your current directory.

Case

Posted 2011-01-13T17:36:24.093

Reputation: 111

0

If you want the directory to change automatically when a new tab is opened use the dirpersist plugin.

The osx plugin only does save the last directory but you have to run the command tab to open a new tab, which is not always possible (if, say, you're running something in your current tab).

garageàtrois

Posted 2011-01-13T17:36:24.093

Reputation: 151