How to bind a function to Control-2 key combo on bash

bash

I want to set a key binding in bash for "history-search-backward" readline command to a combination of Control+some other key (I'm using 2 as an example), but I'm unable to do so.

(edit: it seems the problem was my choice of 2 as the example key. I tried with \C-l and it's working. I'll still accept an answer if someone explains why 2 doesn't work)

After several tries my ~/.inputrc now looks like this

set bind-tty-special-chars off
"\C-2": history-search-backward

but it doesn't work and bind -p | grep "-2" gives nothing. If I try something without the control key, it works:

"C-2": history-search-backward

I can search in the history by prssing the sequence C + – + 2.

bind -p gives control in \C form, for example:

"\C-w": unix-word-rubout

I've tried different formats in my inputrc:

Control-2: history-search-backward
Ctrl-2: history-search-backward
"Control-2": history-search-backward

but nothing works.

"\e2": history-search-backward

works if I press Escape followed by 2.

Can anyone help?

Setup:
Fedora 11:
Bash version 4.0.23(1)
GNU Readline 5.2 (according to the man page)

Best Answer

There's no ASCII code for Control-2. Control-@ through Control-_ correspond to control codes 0x00 (NUL) through 0x1F (Unit Separator). For example, the code for Control-I is the code for 'I' (0x49) minus 0x40 = 0x09 (HT, aka tab). There's no set definition for Control+(some other character not in the @ to _ block).

Programs that do their own keyboard handling can interpret Control any way they like in combination with any other keys. But programs like bash, which read their input through a terminal, don't have any way of even seeing Control-2.

Related Question