Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

emacs in terminal meta arrow keybindings

I have just switched from using Emacs.app to emacs server and emacsclient in terminal mode using iterm2 as my terminal emulator. I am having some trouble with some keybindings though. Particularly M-left arrow prints the character D, M-right arrow prints C, M-up arrow prints A, and M-down arrow prints B. M-ret seems to work though, at least for org mode. I am using the xterm defaults for keys in iterm2 and have the left and right option keys bound to +Esc. I can get the M-left functionality in org-mode with Esc-left or Esc-right This is particularly annoying in org-mode. Am I going to have to just rebind the keys in my .emacs? How would I go about doing that?

I have looked at this http://orgmode.org/manual/TTY-keys.html#TTY-keys, but I don't understand why the arrow keys should be unavailable in the terminal.

edit:

Cat meta-up: ^[[1;9A Cat meta-down: ^[[1;9B Cat meta-right: ^[[1;9C Cat meta-left: ^[[1;9D

Main problem solved, but I am now having trouble with shift-up. "<select> undefined". I tried a similar mapping with the escape sequence I got from cat: ^[[1;2A. Reluctant to create another question for a similar problem.

like image 235
Zach Avatar asked Jun 03 '12 01:06

Zach


People also ask

What is the Meta key in Emacs?

The META key is sometimes labelled ALT . If you do not have it, press ESCAPE instead, followed by, say, x . frame: the rectangular "area" in which Emacs runs; Emacs starts with only one, but you can create more (look under the menu Files, or type C-x 5 2 ).

What is Alt key in Emacs?

Meta is Alt in Practice By default on all major operating systems in use (Windows, Linux, OS X), emacs maps its Meta to Alt key. So, practically speaking, the Meta key is the Alt key.


2 Answers

Solution 1

Based on the info you provided here's one thing you can try. You tell emacs to map those escape sequences to the proper key sequences:

(add-hook 'term-setup-hook
  '(lambda ()
     (define-key function-key-map "\e[1;9A" [M-up])
     (define-key function-key-map "\e[1;9B" [M-down])
     (define-key function-key-map "\e[1;9C" [M-right])
     (define-key function-key-map "\e[1;9D" [M-left])))

Solution 2

I also found another possible solution with a little googling: redefine the iTerm bindings instead to match what emacs is looking for.

http://offbytwo.com/2012/01/15/emacs-plus-paredit-under-terminal.html

Quote from the above page:

Go back to the profile key bindings under iTerm2 and add bindings for the following:

M-up      : Esc-[1;4A
M-down    : Esc-[1;4B
M-right   : Esc-[1;4C
M-left    : Esc-[1;4D
like image 77
Casper Avatar answered Oct 20 '22 11:10

Casper


I'm answering in reply to your 'main problem solved, but new one' edit.

I found this guy's blog post on this issue: - http://webframp.com/emacs/2013/02/22/fixing-emacs-bindings-on-the-in-iterm2/

Basically, you can use the 'run cat' and push buttons trick to see what escape codes are getting sent by your system/terminal, then add 'define-key' lines to define M-{up,down,right,left} and also M-S-{up,down,right,left}.

like image 22
traviscj Avatar answered Oct 20 '22 12:10

traviscj