I've looked on google, stack exchange, GNU emacs manual, xterm manual, etc. and still haven't found an answer that satisfies my problem(s).
Problem:
Using Systems: Ubuntu 16.04, xterm, emacs-nox
I want to bind the keys Ctrl+i Ctrl+m Ctrl+[ and Meta+Shift+o to any command I want.
But the problem seems to be that all of said key sequences are bound to:
Tab
, Return
, Escape
, and Control Code ESC 0
respectively becuase that's just the way terminals work.
So how do I keep the functionality of the Tab, Return, and Escape whilst having said keybinds at my disposal?
Do I have to remap the keys in the terminal somehow? If so, how?
I will do anything to make this work.
If you want to be fiddly then you can (mostly) do it. For instance, for C-i
and C-m
, add to your .Xresources
:
XTerm*VT100.Translations: #override \
Ctrl <KeyPress> I: string("^[OJ") \n\
Ctrl <KeyPress> M: string("^[OK")
where ^[
needs to be replaced by the escape character, entered (in emacs) with C-q ESC
(C-q
runs quoted-insert
which inserts the next character literally). The actual escape character can't be displayed in the browser, so I'm using the string ^[
to represent it, as that's how it's typically displayed. \n\
is needed at the end of each line that is continued.
^[OJ
and ^[OK
were chosen as these sequences seemed to be free. (You can determine which sequences are "free" by inspecting input-decode-map
within Emacs, via C-h v input-decode-map RET
. The map is effectively a "tree". The numerical values are the codes of the corresponding characters — for instance O
is 79. You can determine the code of the letter O
by evaluating ?O
etc.)
Load the .Xresources
with xrdb -load .Xresources
and restart your xterms.
In your init.el
add:
(define-key key-translation-map (kbd "^[OJ") (whatever-you-want-1))
(define-key key-translation-map (kbd "^[OK") (whatever-you-want-2))
where again ^[
needs to be replaced by the escape character. Replace (whatever-you-want-[12])
appropriately.
For some more details see:
https://superuser.com/questions/453993/xterm-key-translations
https://manpages.debian.org/stretch/xterm/xterm.1.en.html#Default_Key_Bindings
-
It's not working for me :/ A couple things are happening: 1) When I did
xrdb -load .Xresources
and restarted my xterm it like inverted my colors making the background white and text black (I haven't changed the default colors of the terminal); and made strings (in between " ") invisible within emacs. 2) When I did(define-key key-translation-map (kbd "^[OJ") 'previous-line)
all emacs does is spit out the string"^[OJ
in the buffer. – John DeBord Apr 7 '18 at 5:22 -
Update: The first issue seems to be unrelated; when I log out and log back in the terminal colors are back to normal. – John DeBord Apr 7 '18 at 5:38
-
1Update: When I describe the key in emacs using
Ctrl-h k
forCtrl-i
the description is:^ runs the command self-insert-command, which is an interactive built-in function in 'C source code'. It is bound to many ordinary text characters.
Not sure if this is a clue or not. – John DeBord Apr 7 '18 at 6:51 -
1Yes, any number other than those taken could be used. Regarding the
"<>"
syntax, it seems after testing (but I can't easily find anything in the documentation), that you can use an arbitrary string (even"<abcdefgh>"
) — so you could just use the non-standard, but descriptive"<control_i>"
etc. It appears to work and I don't think it would break anything. (One issue that might come up in the future is if you start using a terminal emulator other than xterm — since they have different translation maps — but it's independent of the choice of the"<>"
key names.) – aplaice Apr 8 '18 at 8:30 -
1Regarding interpreting the translated bindings in bash — I don't think there's any simple solution. You could try to use the
bind
bash command (e.g.bind '"\eOJ": ""'
where\e
is the escape character (yes, different conventions in different programs, for the same character, are annoying...) and""
is deliberately the empty string — see the info manual for details), but things are likely to start getting very brittle. As for moving the conversation to chat, I'm not certain how to do that. – aplaice Apr 11 '18 at 13:33