Siva
Siva

Reputation: 721

gnu screen - changing the default escape command key to ALT-X?

In GNU screen, I want to change the default command binding to Alt-s (by tweaking .screenrc) instead of the default C-a, the reason is I use emacs hence GNU screen binds the C-a key, sending "C-a" to the emacs becomes tedious (as @Nils said, to send "C-a" I should type "C-a a"), as well as "C-a" in bash shell, and I could change the escape to C- but some of them are already mapped in emacs and other combinations are not as easy as ALT-s . If anyone has already done a ALT key mapping, please do let me know.

Upvotes: 31

Views: 26867

Answers (7)

davidav
davidav

Reputation: 900

Something I have had for years in my .screenrc:

escape ^Zz

which is now hardwired in muscle memory for me.

Somehow I ended up having to share a screen with someone else's config, and now I keep stopping processes all the time (bash ^Z)... Not funny...

Upvotes: 1

Alexei
Alexei

Reputation: 81

To make Alt+X the default prefix for commands and free C-a, add the following lines to .screenrc:

escape ^||
bindkey "^[x" command

As a side effect C-| will be command prefix too. If you need this keys to be free too, then fix "escape ^||" accordingly.

Upvotes: 8

audiodude
audiodude

Reputation: 2810

Fellow emacs user here.

The best solution I've found is a ~/.screenrc file with the following:

# C-a :source .screenrc

escape ^gg

Live updated here: https://gist.github.com/1058111

See also: http://ubuntuforums.org/showthread.php?t=498675

Upvotes: 0

rampion
rampion

Reputation: 89113

From my reading of man screen it seems like the only meta character that screen can use for the command binding is CTRL:

   escape xy

   Set  the  command character to x and the character generating a literal
   command character (by triggering the "meta" command) to y (similar to
   the -e option).  Each argument is either a single character, a two-character
   sequence of the form "^x" (meaning "C-x"), a backslash followed by an octal
   number (specifying the ASCII code of the character),  or a backslash followed
   by a second character, such as "\^" or "\\".  The default is "^Aa".

If there is some mapping that you don't use in emacs, even if it's inconvenient, like C-|, then you could use your terminal input manager to remap ALT-X to that, letting you use the ALT binding instead. That would be a little hackish though.

Upvotes: 10

askonecki
askonecki

Reputation: 377

It is possible to work around :escape command limitations using registers and :bindkey command. Just put this in .screenrc:

# reset escape key to the default
escape ^Aa

# auxiliary register
register S ^A

# Alt + x produces ^A and acts as an escape key
bindkey "^[x" process S

## Alt + space produces ^A and acts as an escape key
# bindkey "^[ " process S

See http://adb.cba.pl/gnu-screen-tips-page-my.html#howto-alt-key-as-escape

Upvotes: 11

paprika
paprika

Reputation: 2484

I'm an Emacs and screen user as well. Although I rarely use Emacs in a terminal -- and as such in a screen session -- I didn't want to give up C-a for the shell either (which uses Emacs key bindings). My solution was to use C-j as the prefix key for screen, which I was willing to sacrifice. In Emacs programming modes it is bound to (newline-and-indent) which I bound to RET as well, so I really don't miss it.

By the way: I know this is an advise rather than an answer, but I felt this would be valuable enough to post nevertheless.

Upvotes: 11

Jack Lloyd
Jack Lloyd

Reputation: 8405

Screen doesn't have any shorthand syntax for alt bindings, but you can give it the octal code directly. For instance on my machine, Alt-x has the hex code F8, or 370 octal, so putting

escape \370x

in my screenrc changed the escape code to alt-X

Tested and works with screen 4.00.03 on Linux.

You may have to change the escape, since I think this may depend on things like your language and codeset, etc: how I found out what my escape code was was to type

$ echo -n ^QM-x | perl -ne 'printf "%lo\n", ord($_)'

^Q is the quoted-insert command for readline (it inserts what you type directly without trying to interpret it) and M-x was a literal Alt-X.

Upvotes: 7

Related Questions