views:

70

answers:

1

I'm trying to learn org-mode and noticed my files are folded neatly when I exit emacs. When pressing S-TAB in an attempt to unfold the entire file, I get the following error message in the mini-buffer: M-[ z is undefined. Googling the error wasn't helpful. Any idea where the hiccup is occurring and how I might fix it?

I'm using Mac OS X 10.6.4 with Terminal.app, GNU Emacs 23.2.1.

Edit: I can confirm now that the problem is Terminal.app. I do not receive this error message using Carbon Emacs or when using Emacs from within iTerm.app.

Thanks to Gilles for patiently walking me through a solution.

+3  A: 

The interface between the terminal and the program running inside it (here, Emacs) can only send characters, not keys. So special keys or key combinations often send a key sequence beginning with ESC. For example, your terminal apparently sends ESC [ Z for Shift+Tab.

Normally Emacs translates these character sequences back into key names, but it seems that the developers missed this one. You can define it yourself with

(add-hook 'term-setup-hook
          (lambda () (define-key input-decode-map "\e[Z" [backtab])))

(For Emacs <= 22, just use (define-key function-key-map "\e[Z" [backtab]).)

Some modes may define bindings for S-tab and not backtab. If you have Emacs 23, (define-key function-key-map [S-tab] [backtab]) should make these modes work.

Gilles
We need an extra end-parend for the Emacs 23 code. Neither one seems to fix my issue. Emacs is still throwing the error with both of those lines in my `.emacs` file.
jrhorn424
It is probably better to use [backtab] rather than [S-tab]. At least in Emacs 23, that seems to be the canonical name that S-tab, iso-left-tab and other variations are mapped to.
JSON
@JSON: Thanks, indeed most modes have bindings for `backtab` now. @jrhorn424: do you still get exactly the same error message? What if you manually evaluate `(define-key input-decode-map "\e[z" [backtab])`?
Gilles
Yes, I still receive the same exact error. Manually evaluating the expression returns `[backtab]` in the mini-buffer. Pressing `S-TAB` after evaluating the expression returns the same error I've been receiving.
jrhorn424
I changed my OP to reflect the fact that Terminal.app appears to be the culprit. It doesn't explain why the key-remapping isn't sticking.
jrhorn424
@jrhorn424: Strange... If you go to the `*scratch*` buffer any type `(read-key-sequence "Type S-tab: ")` then `C-j` and then `S-tab` at the prompt, what is inserted in the scratch buffer? Another test: if you start emacs in Terminal.app with `TERM=xterm emacs -q -nw`, what happens if you press `S-tab`? What is the value of `$TERM` in Terminal.app?
Gilles
The `*scratch*` test (te-hehe) returns `"^[[z"` into the buffer. In the terminal, `echo $TERM` returns `xterm-color`. When starting emacs using `TERM=xterm emacs -q -nw`, `S-tab` works as expected.
jrhorn424
According to this [Backtab Howto][1], `^[[z` is a standard terminal sequence for `backtab`. I tried adding the lines from Step 3 to my `.emacs` to no avail. [1]: http://stuff.mit.edu/afs/sipb/user/daveg/Info/backtab-howto.txt
jrhorn424
@jrhorn424: It seems that your terminal sends `ESC [ Z`, not `ESC [ z`. (That's the standard sequence by the way, as indicated in your reference.) Does it work if you use a capital Z in the Lisp code?
Gilles
The capital Z indeed did the trick. Good spot!
jrhorn424