Используя screenrc, как я могу заставить `Ca c` открывать новое окно в рабочем каталоге текущего окна?

2309
Matt Joiner

Используя screenrc, как я могу C-a cоткрыть новое окно в рабочем каталоге текущего окна? По умолчанию создается впечатление, что оно открывает новое окно в рабочем каталоге во время вызова исходного сеанса экрана.

2

3 ответа на вопрос

7
Matt Eckert

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:

  1. 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.

  2. screen -X chdir \$PWD tells 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 .screenrc alone; therefore, manipulating the input buffer with stuff is necessary.

  3. The screen command within an already running screen creates a new window just like C-a C-c.

  4. ^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 press enter (or 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$ 
Любая идея, почему ^ M не нужен? Matt Joiner 13 лет назад 0
Это необходимо, чтобы возврат каретки создавался в конце строки `stuff`. Matt Eckert 13 лет назад 1
Любые идеи о том, как заставить это работать в названном сеансе экрана? http://superuser.com/questions/1038576/gnu-screen-open-new-window-in-working-directory-of-current-window-in-a-named @MattEckert Paul Caheny 8 лет назад 0
0
jáquer

Исходя из этого ответа SO, я думаю, что это должно работать:

bind c stuff "screen -X chdir \$PWD; screen^M" 

Я пойду попробую это на моей удаленной оболочке и сообщу, работает ли она для меня.

редактировать: Да, это работает. Первая команда «связать» на самом деле не нужна.

Я прочитал этот ответ, но думал, что материал был заполнителем для чего-то еще. Что означает ^ M в вашем примере кода выше? Matt Joiner 13 лет назад 1
Это было сделано, но без лишних ^ M, возможно, это было из-за вставки копий? Matt Joiner 13 лет назад 0
0
stiemannkj1

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, your shell 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" 

Похожие вопросы