15

I use Ctrl- and Ctrl- on every Linux system I work on, but these key combinations don't work in bash on my Macbook Pro. It is running Snow Leopard, and I'm using the built in Terminal application.

The key combinations don't seem to be captured by anything before or by Terminal, because if I ssh to one of my Linux servers, I can use Ctrl-/ to jump to the next/previous word on the command line. However, when I try this key combination in bash on my Macbook, I just get "C" for right arrow and "D" for left arrow.

Any ideas on how I can get these keys to work in darwin bash?

13

OS X uses emacs key binding my default. This is true is virtually every application on OS X, it's rather nice. It means things like C-a and C-e are beginning/end of line. You also get the nifty backward-word-kill with M-backspace, oh, and kill-line with C-k.

This should mean that in your terminal forward/backward-word are bound to M-f and M-b, respectively (M = Meta = alt/option), however that is not the case. On OS X forward/backword-word are bound to M-→ and M-← by default.

You can alter this behavior by changing how the GNU Readline Library is configured for your account. This takes place in your ~/.inputrc file. You can get a big list of bindable commands with man readline as well as in the online documentation like this here..

So to answer your question, you want to remap what Readline does when it sees C-→ and C-← to do what it does on your linux server.

The syntax for a ~/.inputrc file is pretty simple for what you want to do: key-sequence: action.

This should be what you need to get the desired behavior:

"\e[5C": forward-word
"\e[5D": backward-word

Here's another page with additional useful bindings.

(You could probably get away with copying /etc/inputrc from your linux box to your OS X ~/.inputrc)

  • A note: If you are using tmux with xterm-keys a lot, you will also need \e[1;5C and \e[1;5D to also trigger forward-word and backward-word. – Arne Jan 26 '14 at 10:45
  • 2
    Another note: If still not working, it may be because of a shortcut conflict with Mission Control/Spaces. System Preferences -> Keyboard -> Shortcuts -> Mission Control, Move left/right a space – bhh1988 Jul 7 '14 at 5:25
  • I don't understand "OS X uses emacs key binding by default." "Ctrl-arrow" is also an emacs key binding. – Greg Mar 8 '19 at 2:45
3

put in ~/.inputrc following lines:

"\e[5C": forward-word
"\e[5D": backward-word
0

These days it seems that the escape sequences that Ctrl-Arrows output in the terminal have changed. Here is what works for me as of today (end of 2018):

"\e[1;5C": forward-word "\e[1;5D": backward-word

Note: you can always figure out the actual escape sequences by typing cat -v in the Terminal, and pressing Ctrl-Left Arrow or Ctrl-Right Arrow. Here is a sample output for my own Ctrl-Left Arrow:

^[[1;5C ^[[1;5C

To translate into .inputrc lingo, replace the escape sign ^[ with \e and stick the result inside the double quotes.

0

As @bhh1988 mentioned, the Mission Control configuration prevents the Ctrl-Keys working with the arrow keys in bash. I didn't want to interfere with those shortcuts, so I use the Option (i.e. Alt) key instead. Currently on Mojave using a German keyboard (don't know if that's relevant) I put the following in .inputrc to use Option-left-arrow and Option-right-arrow to move between words.

"\e\e[C": forward-word
"\e\e[D": backward-word
0

UPDATE Jan 2020

On the newest versions of OSX the default shell is zsh. Therefore the magic incantation to get ctrl-arrowleft and ctrl-arrowright to work as expected is the following:

bindkey '^[[1;5D' backward-word
bindkey '^[[1;5C' forward-word

(put it into your .zshrc)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.