Skip to content

Instantly share code, notes, and snippets.



Last active Apr 29, 2020
What would you like to do?
Bash script for i3 to run a terminal in the same working directory as the current focused application
# i3 thread:
# Get window ID
ID=$(xdpyinfo | grep focus | cut -f4 -d " ")
# Get PID of process whose window this is
PID=$(xprop -id $ID | grep -m 1 PID | cut -d " " -f 3)
# Get last child process (shell, vim, etc)
if [ -n "$PID" ]; then
TREE=$(pstree -lpA $PID | tail -n 1)
PID=$(echo $TREE | awk -F'---' '{print $NF}' | sed -re 's/[^0-9]//g')
# If we find the working directory, run the command in that directory
if [ -e "/proc/$PID/cwd" ]; then
CWD=$(readlink /proc/$PID/cwd)
if [ -n "$CWD" ]; then
cd $CWD && $CMD

This comment has been minimized.

Copy link

@projectgus projectgus commented Aug 24, 2015

Thanks for this script, I've been using i3 for years and I've always just put up with navigating from the home directory in each terminal. This is great, can't believe I didn't do it ages ago.

I forked the script and made a minor change because I use sakura as a terminal and it spawns some threads internally. The last line from pstree -A was always a sakura thread. The modified script greps for the process pattern in the pstree output, avoiding any threads. It's pretty hacky but it works again.

Thanks again!


This comment has been minimized.

Copy link

@TiddoLangerak TiddoLangerak commented Sep 27, 2015

Thanks for this script! I also forked this script to make it work for terminals running tmux as well.


This comment has been minimized.

Copy link

@jjvilm jjvilm commented Apr 19, 2016

love it!


This comment has been minimized.

Copy link

@ghost ghost commented Aug 28, 2017

On my system, by default the pstree command sorts children by name, and I end up with this, which fails:


It can be fixed by adding the -n argument to pstree:

  TREE=$(pstree -lpAn $PID | tail -n 1)

This comment has been minimized.

Copy link

@doak doak commented Nov 25, 2019

I updated the script to get CWD more reliable (for my use case).
For instance, it uses current working directory of foreground Vim instance, but if Vim is stopped (Bash's job control), it uses the current working directory of its parent shell.

The patch for tmux (of @TiddoLangerak) is not incorporated.


This comment has been minimized.

Copy link

@suchAdemon suchAdemon commented Apr 29, 2020

you can also get the information from i3-msg (as long as you terminal is able to update name/title with the path)
cd "$(i3-msg -t get_tree | jq -r '.nodes | .[].nodes | .[].nodes | .[].nodes | .[].nodes | .[] | select( .focused==true) | [.name]' 2>&1 | sed -e '2!d;s/^.*://g;s/"$//g' | sed -e "s|^~|${HOME}|g")" || cd ~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.