snarfed.org

Ryan Barrett's blog

Emacs keybindings in GNU screen's copy-scrollback mode

Wed, 01 Jan 2003 [comments (8)] [history] [rdf] [raw]

terminal.jpggnu.jpgX_logo.png

When I'm working, I pretty much live inside Emacs. It's my IDE, debugger, text editor, email composer, spreadsheet, file manager, and all-around scratch pad.

I've burned Emacs' key bindings into my brain, so I go to great lengths to set them in every program I use. That way, I don't have to context switch my fingers' muscle memory when I task switch from coding to email, to IM, to the web. Task switches may be a fact of life, but other unnecessary mental context switches are evil incarnate.

I recently started using GNU screen's copy/scrollback mode so that I could copy from terminals with the keyboard. I use these commands in my .screenrc to set up Emacs key bindings in screen's copy/scrollback mode:

# emacs keybindings for navigation in copy mode
markkeys ^B=Y:^F=V:h=^B:l=^F:0=^A:$=^E

# C-space sets mark. markkeys does it in screen 4.0 and higher, but 3.9x
# needs the bindkey command. (note the ^@ escape sequence for C-space.)
markkeys ' '=^@
# bindkey -m ^@ stuff ' '

# page up and page down
bindkey -m -k kP stuff Y
bindkey -m -k kN stuff V

# failed attempt to make C-space work in i-search too
# bindkey -m ^@ eval "stuff \033" "stuff ^@" 

# special hack for C-e, since it should go *past*
# the last char. -m means this is for copy mode only.
bindkey -m ^e stuff "$^f"

# C-g and other keys just quit copy mode. Esc does nothing.
markkeys \033=\015=^G=^D=h=j=k=l=H=M=L=G=g=y=c=v=a=x=b=e=B=E=w
markkeys @=\033

# control arrows move by words. (set B, e, and w to F keys so that i can
# use them to move by words, but they themselves still quit copy mode.)
markkeys B=[:E=]:b={:e=}:w=>
bindkey -m ^[Od stuff {  #"[[}"
bindkey -m ^[Oc stuff ]  #"}]^f"


See also:

comment bubble OpenID Marc, Sun 15 Oct 2006

The thing that drives me nuts about screen still (even though I love it and use it daily) is when I search throught the scrollback with C-r, once I found the spot I want, I can't get out of incremental search unless I hit C-g, and then pops me back down to the bottom of the buffer! Do  you know how to prevent that?

comment bubble OpenID Marc, Sun 15 Oct 2006

Hmmm, it seems ESC might do what I want. Don't know why I hadn't noticed that before.

comment bubble OpenID proth, Thu 12 Apr 2007

Were you able to move screen's C-a to some other keybinding?  I use C-a to move to the beginning of a line, but screen wants to use that for its commands.  How can I tell screen to pay attention to C-s, or anything else?

comment bubble OpenID Ryan, Fri 13 Apr 2007

sure! use the escape command. see this tutorial, or the man page. i set it to tilde in my  .screenrc file.

comment bubble OpenID Barfoos, Fri 13 Apr 2007

These two lines of your sample give me a syntax-error:

markkeys 033=015=^G=^D=h=j=k=l=H=M=L=G=g=y=c=v=a=x=b=e=B=E=w
markkeys @=033

I use the following screenrc, it covers emacs-like window-management:

escape ^x^x
bind o focus
bind 0 remove
bind 1 only
bind 2 split
bind = resize =
bind ^b windowlist -m

One thing I miss is that C-X b RET should switch between two sessions. Any ideas?

comment bubble OpenID Ryan, Fri 13 Apr 2007

ack, the templating system ate the escape characters. fixed. thanks for the nudge.

as for C-x b RET, off the top of my head, no, but i do know that bindkey can do amazing things.

comment bubble OpenID Dan, Mon 07 May 2007

Sorry... I posted this comment on the wrong article!

That is nice, but I don't think you go far enough... What about mapping C-a to C-x (making commands much more Emacs finger friendly) ... For example, I am now totally stuck on C-a p for 'switching buffers' after C-a c in screen. For this to be 'Emacs' it should be C-x b...

Removing the C-a would be a start...

Thanks for the others though... but where is C-f / C-b ? did you already define that in your rvxt ? (for me it just kills copy mode) .

I guess I am looking for a very Emacs like shell, without running shell in Emacs...

comment bubble OpenID Len, Tue 18 Dec 2007

Since I use C-a all the time in emacs, I've mapped screen's control key to ` (same key as tilde, but no shift press needed), using:

escape ``

I also have jumping to start and end of buffer during scrollback with:

# M-< and M-> for start/end of buffer 
bindkey -m "^[<" stuff "g" 

bindkey -m "^[>" stuff "G"

Post a comment...



Simple HTML and wiki markup are allowed.