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.
3 Answers
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.
-
1I read that answer, but thought stuff was a placeholder for something else. What does the ^M in your code sample above? Commented Jun 2, 2011 at 5:36
-
This has done it, but without the extra ^M, perhaps this was from copy-pasting? Commented Jun 2, 2011 at 5:37
By default, 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:
stuff
puts its argument string directly into the current window:Command:
stuff string
Stuff the string
string
in the input buffer of the current window.screen -X chdir \$PWD
tells screen to execute the commandchdir
, 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.screenrc
alone; therefore, manipulating the input buffer withstuff
is necessary.The
screen
command within an already runningscreen
creates a new window just likeC-a C-c
.^M
generates a carriage return, which tells the shell to execute the command which is now in the buffer. Without it, you would have to pressenter
(orC-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$
-
-
1It is necessary, so that a carriage return is generated at the end of the
stuff
string. Commented Jun 2, 2011 at 15:41 -
Any ideas on how to make this work in a named screen session? superuser.com/questions/1038576/… @MattEckert Commented Feb 11, 2016 at 15:35
-
This doesn't work if a long-running process is running in the current window Commented Mar 13, 2020 at 21:16
Here's a copy of my own answer to a similar question on stackoverflow.com:
To make screen open a new tab/window in the current directory, you can add the following code to your
.screenrc
file: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
screen
does 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.screenrc
file, yourshell
command cannot include a dash ('-') character.For example, this is wrong (i.e. it will start a login shell):
shell -$SHELL
But this is right (i.e. it will not start a login shell):
shell $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
screen
to open new windows/tabs in the current directory and open a login shell, you can add the following code to your.screenrc
file:bind c stuff "screen bash -l^M"
-
About Note 2, Is there a way to overcome this? after sending a command, such as compiling huge sources, I'd like to create new windows and want to do other things. It is impossible now. I have tried to find a solution but everytime end up failing. this answer only touch this issue. so I add comments.– OfusJKCommented Oct 5, 2023 at 11:08