148

I was reading up in the Linux manual and I noticed that it said I could use control+left and control+right to move forward and back words in the terminal while editing.

"Pressing Ctrl plus the Left or Right arrow key moves backward or forward a word at a time, as does pressing Esc and then B or F."

On OS X control+left and control+right normally control spaces. I have disabled those. I also tried to use the preferences pane to set the keyboard shortcuts:

enter image description here

enter image description here

However this does not work and causes this error:

enter image description here

Also, if I am in iTerm and use alt+escape then B or F the character moves back and forth. This was happening before any of my config changes. But I'd really like to be able to use control + the arrow keys.

Gaff
  • 18,569
  • 15
  • 57
  • 68
cwd
  • 17,668
  • 42
  • 121
  • 159
  • Incidentally, a more parsimonious way to achieve this might simply be to map command+left and command+right instead of ctrl+left and ctrl+right. I didn't need to disable anything system-wide to accomplish this. – Translunar Jul 16 '14 at 19:35

8 Answers8

163

bash

Just add the following to ~/.inputrc:

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

See this archived Wiki post for some more explanation. If you want to use the alt key instead for word-to-word movement (like default OS X behavior), use:

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

zsh

zsh by default does not use the readline library and therefore won't read ~/.inputrc. To get the same functionality, you could add the following to your ~/.zshrc to use ctrl:

bindkey -e
bindkey '\e\e[C' forward-word
bindkey '\e\e[D' backward-word 

To use the alt key:

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

See this documentation for more about the built-in zsh line editor (zle).


Why is this? You've set up your profile to use the Xterm defaults:

enter image description here

This is why you'll need to "catch" this sequence and tell readline what to do.


If the above still doesn't work and you are using OS X 10.9 (Mavericks) or there abouts, you probably need to disable the global Mission Control shortcuts which prevent Control+arrow keys from reaching iTerm, even if Mission Control itself is disabled. You can do so from System Preferences → Keyboard → Shortcuts → Mission Control:

mission control keyboard prefs

Steve Bennett
  • 1,740
  • 6
  • 21
  • 40
slhck
  • 223,558
  • 70
  • 607
  • 592
  • 4
    I try to follow the instruction to get the alt + left and alt + right keys working. I added the two lines to my .inputrc file, but the only thing what happens when I press the keys is that either a "D" or a "C" gets printed to the shell. I'm using iTerm2 with zsh shell. Any ideas? – Flo Nov 27 '12 at 11:23
  • 2
    @Flo Try adding the lines `bindkey -e`, `bindkey '^[[1;9C' forward-word` and `bindkey '^[[1;9D' backward-word` to your `~/.zshrc` instead. IIRC zsh won't read `.inputrc` – or at least it works for me this way. – slhck Nov 27 '12 at 11:49
  • @slhck, sure I will create a new question, though alt+left does work on vim, alt+right doesn't. Very weird, I will create a new question now. – seds Sep 02 '13 at 16:15
  • @Ben No idea, sorry! I'm really just the guy who uses vim for commit messages and quick fixes. I bountied your question so you'd get more attention on it. – slhck Sep 06 '13 at 06:01
  • ***UGH, god***, THANK YOU. especially for the `zsh` specific info. I was going to ***SCREAM*** if I typed `D` oe more time! – mralexgray Oct 11 '13 at 06:35
  • 2
    Not working for me with ctrl-left/right + bash, but works fine if I set it up for alt-left/right. – Dalin Jan 18 '14 at 03:22
  • 5
    Added an edit about Mission Control shortcuts preventing any of this from working in the most aggravatingly opaque manner. Hopefully it saves someone from going through the same thing I just did urgh... – rubyruy Jan 22 '14 at 18:22
  • 13
    For OSX + zsh + iTerm2 + ctrl-left/right use the following: `bindkey -e; bindkey '\e\e[C' forward-word; bindkey '\e\e[D' backward-word` – Artur Bodera Apr 11 '14 at 09:30
  • For some reason my OSX preferences were restored to defaults.. – Koen. Apr 28 '14 at 15:19
  • This works but only in the local shell. If I ssh to another box it only moves 1 character. In the default terminal app ^left and ^right work locally and remotely. Anyone have an idea? – marcantonio May 22 '15 at 23:49
  • Disregard. I just needed to start a new ssh session! – marcantonio May 22 '15 at 23:55
  • @ArturBodera thanks for posting! works perfectly and interprets holding the arrow key down as repeated movements, rather than having to press the arrow key each time for each word (which I had to do with the BetterTouchTool solution http://superuser.com/a/584175/83693) – Julian A. Nov 27 '15 at 23:31
  • The link http://code.google.com/p/iterm2/wiki/Keybindings is dead, do you know where is it relocated to? – gerrytan Jan 20 '16 at 21:45
  • @gerrytan You can still access it through the [Wayback Archive](https://web.archive.org/web/20121226151631/http://code.google.com/p/iterm2/wiki/Keybindings). – slhck Jan 21 '16 at 10:51
  • You really don't need `bindkey -e` to make this work. Maybe you just like EMACS and are trying subconsciously bring people to it. Try it with `bindkey -v` for `vi`. – DrBeco Oct 07 '19 at 21:29
  • What worked for me in ~/.zprofile to navigate words with Control+Arrows is the following: `bindkey -e` `bindkey '^[[1;5C' forward-word` `bindkey '^[[1;5D' backward-word` – Saverio Proto Sep 02 '22 at 07:07
95

Working solution for zsh. Simple, straightforward, out-of-the-box.

  1. Goto: ⌘, Preferences → Profiles → Keys → Keyboard Behavior

  2. Load Preset: Natural Text Editing

Load Preset "Natural Text Editing"

Happy Torturer
  • 1,051
  • 7
  • 5
  • 2
    Thanks @Happy Torturer, I believe it's best answer mostly because I don't have on plain Terminal.app that problem so I don't want to modify bash/zsh, just want to work everything like in Terminal.app. – galuszkak Sep 23 '17 at 17:07
  • 1
    This, this, this. Thank you so much for this solution! I've gone through this maddening process with each Mac I get. I now know the simplest way to make this happen. Thank you! – vernonk Nov 22 '17 at 04:55
  • This should be the accepted answer. I wonder, is there any way to load this preset from the command line rather than going through the settings GUI? – Janosh Dec 16 '19 at 09:20
  • This should've improved the @rassom answer rather than providing a same answer with screenshot. – Player1 Jun 01 '21 at 15:40
  • 1
    Worked for me, but I needed to also disable misson control shortcuts that were having higher priority, once disabled that "Naturel Text Editing" worked – Guillaume Petit Nov 27 '21 at 21:14
  • I appear to be missing this preset :/ – Shayne Dec 02 '22 at 01:58
  • This should be the correct answer. – Jay Aug 08 '23 at 03:53
19

I fixed it this way:

In top menu; go to

Profiles 
-> Open profiles... 
-> Edit profiles... (button) 
-> Keys (tab) 
-> Load Preset... (dropdown) 
->  Choose "Natural text editing". Done! :-)

enter image description here

Player1
  • 107
  • 5
rassom
  • 753
  • 2
  • 8
  • 16
7

I used a different approach. Using BetterTouchTool I programmed a custom keyboard shortcut for iTerm2. When I press alt-left in iTerm2, it sends the keyboard shortcut ctrl-left with the action "Send keyboard shortcut to specific application". The application is iTerm2. I did the same for alt-right mapped to ctrl-right.

The effect is that pressing alt-left or alt-right in iTerm sends a ctrl-left or ctrl-right directly to iTerm2, bypassing the usual system-wide shortcut to move a desktop left or right. Like this I get the typical mac behaviour in iTerm2, on local terminal sessions, but also on remote SSH sessions and I can use the standard ctrl-left / ctrl-right to move to different desktops. I wrote it up here:

http://www.callum-macdonald.com/2013/04/17/ctrl-left-and-ctrl-right-on-iterm2/

chmac
  • 467
  • 5
  • 8
  • 3
    BetterTouchTool is not open source and could very well be doing things you wish it wasn't. The guy says he's a student but he could just as well be a three letter agency. – revacuate Jan 04 '16 at 17:43
7

Actually, I found the easiest solution was to go to my profile settings (found in Profiles/Keys), removing the offending profile shortcuts(as profile overrides global in iTerm), in my case alt+left and alt+right and then the global shortcuts worked perfectly for me!

Also, if you're using OS X, it's probably best to stick with system wide shortcuts, i.e. using alt+left and alt+right instead for this purpose, having different behaviour in terminal is bound to cause a pain eventually.

Other than that chmac's solution to use Better Touch Tool was an elegant way to change control+arrow's behaviour in iterm only.

nayyarv
  • 71
  • 1
  • 1
  • actually this is the best solution. It is confusing as most of us go to `Keys` tab. Instead we have to go to `Profiles` tab -> A profile(eg default) -> keys. – Paschalis Nov 03 '15 at 17:26
  • This is definitely the safest and easiest solution. – revacuate Jan 04 '16 at 19:14
2

This post teaches this and others shortcuts as ⌥←Delete to delete a word:

http://elweb.co/making-iterm-2-work-with-normal-mac-osx-keyboard-shortcuts/

Seralto
  • 121
  • 3
1

You need to go into the Profiles tab and delete the mapping for alt+left and alt+right as by default it outputs some hex values.

Giacomo1968
  • 53,069
  • 19
  • 162
  • 212
Sid
  • 111
  • 2
0

In the newer versions of iTerm (as of writing 3.4.19):

Navigate to PreferencesProfilesKeysKey Mappings.

From Presets dropdown, select Natural Text Editing.

Saikat
  • 395
  • 1
  • 5
  • 14