How can I get control+left arrow to go back one word in iTerm2?

64,380

Solution 1

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

Solution 2

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"

Solution 3

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

Solution 4

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/

Solution 5

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.

Share:
64,380

Related videos on Youtube

cwd
Author by

cwd

Updated on September 18, 2022

Comments

  • cwd
    cwd almost 2 years

    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.

    • Admin
      Admin almost 10 years
      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.
  • Flo
    Flo over 11 years
    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?
  • slhck
    slhck over 11 years
    @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.
  • seds
    seds almost 11 years
    @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.
  • slhck
    slhck almost 11 years
    @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.
  • mralexgray
    mralexgray over 10 years
    UGH, god, THANK YOU. especially for the zsh specific info. I was going to SCREAM if I typed D oe more time!
  • Dalin
    Dalin over 10 years
    Not working for me with ctrl-left/right + bash, but works fine if I set it up for alt-left/right.
  • rubyruy
    rubyruy over 10 years
    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...
  • Artur Bodera
    Artur Bodera about 10 years
    For OSX + zsh + iTerm2 + ctrl-left/right use the following: bindkey -e; bindkey '\e\e[C' forward-word; bindkey '\e\e[D' backward-word
  • Orlin Bobchev
    Orlin Bobchev about 10 years
    For some reason my OSX preferences were restored to defaults..
  • marcantonio
    marcantonio about 9 years
    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
    marcantonio about 9 years
    Disregard. I just needed to start a new ssh session!
  • Paschalis
    Paschalis over 8 years
    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.
  • Julian A.
    Julian A. over 8 years
    @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 superuser.com/a/584175/83693)
  • revacuate
    revacuate over 8 years
    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
    revacuate over 8 years
    This is definitely the safest and easiest solution.
  • gerrytan
    gerrytan over 8 years
    The link code.google.com/p/iterm2/wiki/Keybindings is dead, do you know where is it relocated to?
  • slhck
    slhck over 8 years
    @gerrytan You can still access it through the Wayback Archive.
  • Philip
    Philip about 8 years
    This did it for me!
  • DavidPostill
    DavidPostill about 8 years
    This doesn't actually answer the question, which is about using <ctrl><left>
  • Seralto
    Seralto about 8 years
    All you have to do is use the shortcut that fits your need. "<ctrl><left>" or whatever you want.
  • DavidPostill
    DavidPostill about 8 years
    So please quote the essential parts of the answer from the reference link(s), as the answer can become invalid if the linked page(s) change.
  • galuszkak
    galuszkak almost 7 years
    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.
  • vernonk
    vernonk over 6 years
    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!
  • MaylorTaylor
    MaylorTaylor almost 6 years
    all i have under that preset is "Factory Defaults"
  • DrBeco
    DrBeco over 4 years
    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.
  • Casimir
    Casimir over 4 years
    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?
  • Player1
    Player1 about 3 years
    This should've improved the @rassom answer rather than providing a same answer with screenshot.
  • Guillaume Petit
    Guillaume Petit over 2 years
    Worked for me, but I needed to also disable misson control shortcuts that were having higher priority, once disabled that "Naturel Text Editing" worked