Using screenrc, how can I make
C-a c open a new window at the current window's working directory? By default it appears to open the new window at the working directory at the time the original screen session is invoked.
Based on this SO answer, I think this should work:
bind c stuff "screen -X chdir \$PWD; screen^M"
I'll go try it on my remote shell and report back if it works for me.
edit: Yup, it works. The first "bind" command is actually not needed.
screen also binds
C-a C-c to create a new window, so you might want to add another line to your
.screenrc to handle this case:
bind c stuff "screen -X chdir \$PWD;screen^M" bind ^c stuff "screen -X chdir \$PWD;screen^M"
Clarification about how this command works:
stuffputs its argument string directly into the current window:
Stuff the string
stringin the input buffer of the current window.
screen -X chdir \$PWDtells screen to execute the command
chdir, which changes its operational directory (where new screen windows will start) to the environment variable
$PWD, which contains the current working directory. This is impossible to do within
.screenrcalone; therefore, manipulating the input buffer with
screencommand within an already running
screencreates a new window just like
^Mgenerates a carriage return, which tells the shell to execute the command which is now in the buffer. Without it, you would have to press
C-m, of course).
Consequently, this bind will leave cruft like this in the window you execute it in:
user@host:~/directory$ screen -X chdir $PWD;screen user@host:~/directory$
To make screen open a new tab/window in the current directory, you can add the following code to your
bind c stuff "screen bash^M"
This will cause the Ctrl + a c command to open new tabs/windows in the directory of the current window/tab.
Note: You must ensure that
screendoes not start a login shell by default because that will cause the shell start in the default directory for a login shell rather than the current directory. This means that In your
shellcommand cannot include a dash ('-') character.
For example, this is wrong (i.e. it will start a login shell):
But this is right (i.e. it will not start a login shell):
Note 2: Unfortunately, this method does not behave exactly like the default new window/tab command in
screen. Instead, it writes the command to the current window and executes it to create the new window/tab, so it will not work during some long running shell process. In other words, this keyboard shortcut can only be executed whenever normal shell commands can be executed.
Note 3: If you want
screento open new windows/tabs in the current directory and open a login shell, you can add the following code to your
bind c stuff "screen bash -l^M"