I can see that Ctrl+left/right jumps to the beginning/end of line. How to change this to Cmd+left/right arrow?
-
1I described it here: https://github.com/nikoloza/articles/blob/master/devtools/iterm-key-bindings.md – nikoloza Dec 19 '16 at 18:29
-
1If you want those shortcuts to work in VIM too, see this answer: http://stackoverflow.com/a/9611698/991068 – Razvan Grigore Jan 12 '17 at 20:34
14 Answers
Add in iTerm2 the following Profile Shortcut Keys
FOR | ACTION | SEND |
---|---|---|
⌘ ← | "SEND HEX CODE" | 0x01 |
⌘ → | "SEND HEX CODE" | 0x05 |
⌥ ← | "SEND ESC SEQ" | b |
⌥ → | "SEND ESC SEQ" | f |
Here is a visual for those who need it
-
3Do you know what the code/sequence for Command+Delete is? (clear out the prompt) – Steven Lu Mar 31 '13 at 18:37
-
12I answered my first comment elsewhere, basically hex-code 0x15 gives Ctrl+U which clears the line. However I am finding 0x01 Ctrl+A to interfere with Tmux usage. Therefore I intend to map it instead to the Home key (same functionality as Fn+Left on a Mac keyboard). – Steven Lu Apr 04 '13 at 01:28
-
7The escape sequence for Home is [1~ and the escape sequence for End is [4~ – Steven Lu Apr 04 '13 at 03:12
-
1As in, Home is the sequence `^[[1~` and End is the sequence `^[[4~`. This will not interfere with tmux. I do, however, suggest taking advantage of tmux integration in iTerm. – Steven Lu Apr 04 '13 at 03:33
-
@nivoc: how do you know this? How I can learn to write my own hex code that serves the purpose I want? – Novellizator Mar 31 '15 at 17:47
-
1Installing my new Mac, figuring out shortcuts don't work on iTerm, coming here, using this answer, pleased, want to upvote, figuring out I already did (probably with my previous mac). Thanks ;) – Avi Apr 06 '15 at 11:13
-
2
-
for "⌥←" and "⌥→", I should also remove the key in Profile -> Key tab. and then it will work as expected. – Jerry Chen Jul 02 '15 at 13:53
-
I was hitting command and arrow one after another and was wondering why command does not get typed in :/ – Tarun Aug 04 '16 at 13:04
-
49The correct binding is `⌘← "SEND ESC SEQ" OH` for Home and `⌘→ "SEND ESC SEQ" OF` for End (those are uppercase 'o's not zeros). This simulates actually pressing the Home and End keys, and as such will work in bash, vim, etc. – Timothy Zorn Feb 03 '17 at 08:38
-
Mine had issues with the last two commands so don't forget to remove the previous bindings from profiles. – sinaza Apr 26 '18 at 17:56
-
Use ^[[1~ and ^[[4~ not 0x1 and 0x4. 0x1 will interfere with tmux/screen if your prefix is Ctrl-A. – user464014 May 11 '20 at 21:43
-
1for gods###, add a step: RESTART THE TERMINAL when done. I literally spent 30 minutes adding and removing shortkeys as they would not work initially lol. Joking apart, great tip – Alejandro Moreno Aug 04 '20 at 11:20
-
Why is it saying "The keyboard shortcut you have set for this profile will take precedence over an existing shortcut for the same key combination in a global shortcut." when I try the end/beginning of line commands? – wordsforthewise Aug 30 '21 at 13:31
-
1It's worth pointing out that these bindings can be set from `~/.zshrc` so they work in other terminals as well (like the one built into VS Code).`bindkey '^[b' backward-word; bindkey '^[f' forward-word; bindkey "^A" beginning-of-line; bindkey "^E" end-of-line` – colton7909 Nov 18 '21 at 19:22
To jump between words and start/end of lines in iTerm2 pick one of the two solutions below.
1. Simple solution (recommended)
- Open Preferences
- Click "Profile" tab
- Select a profile in the list on the left (eg "Default")
- Click "Keys" tab
- Click "Key Mappings" tab (if it exists)
- Click the "Presets" dropdown and select "Natural Text Editing"
Note: if you have several profiles (f.e. Default and Hotkey Window) and want the same modification to be applied for all profiles, use these steps instead:
- Click "Keys" tab
- Choose "Key Bindings"
2. Mapping keys manually (Advanced)
If you don't want to use the "Natural Text Editing" preset mentioned above, you can map the keys you need manually:
- Open Preferences
- Click "Profile" tab
- Select a profile in the list on the left (eg "Default")
- Click "Keys" tab
- Click "Key Mappings" tab (if it exists)
- Click the
[+]
iconjuimp - Add the shortcuts from the table below
SHORTCUT | DESCRIPTION | ACTION | SEND |
---|---|---|---|
⌘ ← | Jump left to beginning of line | "SEND HEX CODE" | 0x01 |
⌘ → | Jump right to end of line | "SEND HEX CODE" | 0x05 |
⌘ ← Delete | Delete line | "SEND HEX CODE" | 0x15 |
⌥ ← | Jump left to beginning of word | "SEND HEX CODE" | 0x1b 0x62 |
⌥ → | Jump right to end of word | "SEND HEX CODE" | 0x1b 0x66 |
⌥ ← DELETE | Delete word | "SEND HEX CODE" | 0x1b 0x08 |
⌘ z | Undo | "SEND HEX CODE" | 0x1f |
Note
If keyboard bindings already exists for the shortcuts above, they must be removed for the new ones to take effect.

- 22,833
- 7
- 52
- 36
-
4This worked well for me in iTerm2 and was very easy to follow, thanks! – Natetronn Apr 09 '15 at 18:31
-
5Just clarifying what do the original bindings for ⌥← do? I see it `Says send Hex Codes: 0x1b 0x1b 0x5b 0x44`. Would be good to know in case people did not want to remove this. – aug Apr 30 '15 at 20:17
-
3Does iTerm have a way to bundle these into a preset we can just load? Seems annoying to type in manually but this worked for me and was awesome. Thanks a lto! – aug Jun 06 '17 at 23:54
-
1
-
1
-
2
-
-
This works on Mac and when I ssh, but it doesn't work with screen. Any suggestion on how to get it to work with screen on linux (ssh and then screen). thanks – solora Nov 16 '21 at 17:09
-
1This should be the accepted answer. The easy way, no hex modifications. – Mehdi Karamnejad Dec 15 '21 at 03:19
-
@sqren if you're going to steal someone's answer and use it as your own, can I at least get a citation? – Travis Feb 11 '22 at 02:44
-
1
-
1
-
Darn thing drove me nuts for months. Thanks, this was the help I needed!! – analyst_47 Mar 21 '22 at 17:03
-
-
This should be the accepted one. But If you could change the description of `⌥ ←` and `⌥ →` to `Jump left to beginning of word` and `Jump right to beginning of word` respectively, that would be better! – hustnzj Sep 25 '22 at 08:00
-
Boss answer! `Terminal.app Compatibility` is also a good option if you're used to the macOS Terminal. – Jannik Jul 18 '23 at 08:10
I see there's a lot of good answers already, but this should provide the closest to native OSX functionality as possible in more than just your shell. I verified that this works in ZSH, Bash, node, python -i, iex and irb/pry sessions (using rb-readline gem for readline, but should work for all).
Open the iTerm preferences ⌘+, and navigate to the Profiles
tab (the Keys
tab can be used, but adding keybinding to your profile allows you to save your profile and sync it to multiple computers) and keys
sub-tab and enter the following:
Delete all characters left of the cursor
⌘+←Delete Send Hex Codes:
0x15
More compatible, but functionality sometimes is to delete the entire line rather than just the characters to the left of the curser. I personally use this and then overwrite my zsh bindkey for^U
to delete only stuff to the left of the cursor (see below).or
0x18 0x7f
Less compatible, doesn't work in node and won't work in zsh by default, see below to fix zsh (bash/irb/pry should be fine), performs desired functionality when it does work.
Delete all characters right of the cursor
⌘+fn+←Delete or ⌘+Delete→ Send Hex Codes:
0x0b
Delete one word to left of cursor
⌥+←Delete Send Hex Codes:
0x1b 0x08
Breaks in Elixir's IEX, seems to work fine everywhere elseor
0x17
Works everywhere, but doesn't stop at normal word breaks in IRB and will instead delete until it sees a literal space.
Delete one word to right of cursor
⌥+fn←Delete or ⌥+Delete→ Send Hex Codes:
0x1b 0x64
Move cursor to the front of line
⌘+← Send Hex Codes:
0x01
Move cursor to the end of line
⌘+→ Send Hex Codes:
0x05
Move cursor one word left
⌥+← Send Hex Codes:
0x1b 0x62
Move cursor one word right
⌥+→ Send Hex Codes:
0x1b 0x66
Undo
⌘+z Send Hex Codes:
0x1f
Redo typically not bound in bash, zsh or readline, so we can set it to a unused hexcode which we can then fix in zsh
⇧+⌘+Z or ⌘+y Send Hex Codes:
0x18 0x1f
Now how to fix any that don't work
For zsh, you can setup binding for the not yet functional ⌘+←Delete and ⇧+⌘+Z/⌘+y by running:
# changes hex 0x15 to delete everything to the left of the cursor,
# rather than the whole line
$ echo 'bindkey "^U" backward-kill-line' >> ~/.zshrc
# binds hex 0x18 0x7f with deleting everything to the left of the cursor
$ echo 'bindkey "^X\\x7f" backward-kill-line' >> ~/.zshrc
# adds redo
$ echo 'bindkey "^X^_" redo' >> ~/.zshrc
# reload your .zshrc for changes to take effect
$ source ~/.zshrc
I'm unable to find a solution for adding redo in bash or readline, so if anyone know a solution for either of those, please comment below and I'll try to add them in.
For anyone looking for the lookup table on how to convert key sequences to hex, I find this table very helpful.
-
3That is really useful, makes a lot of difference! I would like to point it out that some people can get confused with the `$` in front of `echo` (just remove it?). Other than that, it's perfect. Thank you. – Edmundo Santos Dec 15 '15 at 15:45
-
⌥+← Send Hex Codes: 0x1b 0x62 does not work for me, not that the converse (-> works). – Christophe May 27 '16 at 14:12
-
@Christophe What shell are you using? For bash, run `bind -p | grep backward-word` for zsh run `bindkey | grep backward-word` and let me know what the output is. Both zsh and bash should both bind `backward-word` to `"\eb"` or `"^[b"` (which are both `esc` + `b`) by default. – Travis May 27 '16 at 14:48
-
@Travis Here is what I get: ➜ / bindkey | grep backward-word "^[B" backward-word "^[[1;5D" backward-word "^[b" backward-word – Christophe May 27 '16 at 18:14
-
The result is that going backward inserts 3 'b' by the way (forward works). – Christophe May 27 '16 at 18:18
-
1@Christophe So it looks like the key binding is there like it should be. Either you made a mistake adding the hex values in or keybinding for backward-word is being overwritten. Run `bindkey | grep "\^\[b"` and that'll tell you if something else is overwriting it after it's been set. It **should** only return `#=> "^[b" backward-word`. If it's being overwritten, you'll have to find where its being overwritten and remove it. If that's not possible, you can run `echo 'bindkey "^[b" backward-word' >> ~/.zshrc` it will add it to the last line of your `.zshrc`, then restart iTerm and it should work – Travis May 27 '16 at 19:36
-
Let me know if that doesn't work for you. I'm happy to help where I can as I know how frustrating a broken keybinding can be. – Travis May 27 '16 at 19:39
-
@Travis, sorry did not come back to this before today. So your debug line returns me: `"^[b" backward-word`. And only that. So looks like I'm good? But still does not work. I have a French keyboard layout if that matters. – Christophe May 30 '16 at 13:01
-
2@Christophe check the `keys` tab in the iTerm preferences to see if it's also mapping `⌥`+`←` to something. If so remove it. You can test if your `b` is working correctly by quickly pressing `esc` releasing, then pressing `b`. That should jump a word to the left. Alternatively, you can map `⌥`+`←` to hex `0x1b 0x42` **or** `0x1b 0x5b 0x31 0x3b 0x35 0x44`. I verified that both of those work for me. I really think you have `⌥`+`←` being overwritten in iTerm though, either in your `profile` `keys` tab or `keys` tab. – Travis May 31 '16 at 14:10
-
-
1the Undo command in iTerm is I-N-S-A-N-E. everyone will want that, i bind it to cmd-u so it doesn't collide with the iterm default shortcut for cmd-z. – Merlin Oct 24 '17 at 08:20
-
3
-
8I did this manually in and I thought why can't I import a profile to do this? Then I created [GabLeRoux/iterm2-macos-dynamic-profile](https://github.com/GabLeRoux/iterm2-macos-dynamic-profile) based on these instructions. It works flawlessly, thanks – GabLeRoux Aug 01 '18 at 19:07
-
In recent versions of iTerm, there's a "Natural Text Editing" preset of keys which has many of these key-bindings pre-set. Was also noted here: https://stackoverflow.com/a/42575631/544618 – nomæd Sep 22 '18 at 15:46
-
1@GabLeRoux By god man, don't hide that gem in a comment hidden in a collapsible section of the comments to this answer! Make an answer of your own and shamelessly promote your repo. Also, Travis, you should point to this repo in your own answer so that others don't have to do go through the manual process. – elifiner Dec 28 '18 at 21:16
-
Has anyone had luck with `⌥+←Delete` working on directories deleting folder by folder and not the whole directory? I'm using `0x1b 0x08` (iTerm2 & zsh) Sorry for necroing btw ♂️ – JBK Apr 18 '19 at 07:21
-
@JBK if you're referring to `⌥+←Delete` to delete by each directory level in `path/to/something`, then `0x1b 0x08` *should* work. Verify that when you type `bindkey | grep "\^\[\^H"` you should get `"^[^H" backward-kill-word` returned. If not, ideally you would want to remap `^[^H` to `backward-kill-word` by adding it to your `.zshrc` with `echo 'bindkey "^\[^H" backward-kill-word' >> ~/.zshrc` – Travis Apr 18 '19 at 16:44
-
@Travis First of all - thanks for replying! I get `backward-kill-word` for `bindkey | grep "\^\[\^H"` and have added `bindkey "^\[^H" backward-kill-word'` to my `.zshrc` file regardless, `⌥+←Delete` still deletes whole paths. Looking at my `.zshrc` file I had `autoload -U select-word-style select-word-style bash` configured inside, is it of any concern to the issue? – JBK Apr 19 '19 at 11:51
-
1@JBK redefining the behavior is starting to step outside of my knowhow. However one of the answers within here might be able to help you https://stackoverflow.com/questions/444951/zsh-stop-backward-kill-word-on-directory-delimiter – Travis Apr 19 '19 at 12:48
-
1@Travis thanks Travis, I got it fixed. My issue was that I sourced the `zsh-syntax-highlighting` plugin before using autoload! Thanks a lot for your time – JBK Apr 19 '19 at 15:18
-
-
@alper If you simply run `bindkey "^U" backward-kill-line` in your terminal, it'll only work within that terminal session. If you run `echo 'bindkey "^U" backward-kill-line' >> ~/.zshrc` , it will append `bindkey "^U" backward-kill-line` to your `~/.zshrc` file, which is loaded every time a new zsh session is created, so it will bind the key for all new sessions. – Travis May 14 '20 at 19:42
-
I tried that but seems like it does not work on the zsh session where I connected to a remote machine using `ssh` @Travis – alper May 14 '20 at 20:47
-
@alper if `bindkey "^U" backward-kill-line` works by running it in your terminal for that session, then it sounds like your .zshrc is loading properly. Drop a `echo "hello world"` into your .zshrc to confirm if you'd like. – Travis May 15 '20 at 00:27
In iTerm 3.0.12 you can switch to Natural Text Editing
preset:
iTerm → Preferences → Profiles → Keys
Warning As it is a preset, it can override the keys you have binded before. So it's better to save your current key bindings before applying a preset.

- 12,630
- 8
- 75
- 122
-
2Could you elaborate more your answer? As in, what that preset includes and might overwrite? – Neithan Max Nov 15 '17 at 22:00
-
Thanks for the answer. Also chiming in it's probably best practice to apply this to your own custom profile that way you aren't screwing with the defaults and can toggle the profile as a natural text editing "mode" – aug Jan 29 '18 at 18:36
-
1
-
@CarlesAlcolea I think it will remove your custom presets and hotkeys so you should export the profile if you want to save them. – wordsforthewise Aug 30 '21 at 13:34
-
For quick reference of anyone who wants to go to the end of line or start of line in iTerm2, the above link http://hackaddict.blogspot.com/2007/07/skip-to-next-or-previous-word-in-iterm.html notes that in iTerm2:
- Ctrl+A, jumps to the start of the line, while
- Ctrl+E, jumps to the end of the line.
-
2
-
3@GangadharJannu: Totally agree. It goes straight to the ans. Should be on the top. – Chau Pham Oct 19 '19 at 03:14
-
agreed i knew the `ctrl` + `A` to get to start of line but couldn't find the end of line. this needs to be marked as the answer. – covard Jul 15 '20 at 15:17
-
This answer just get straight to the point without any additional "key-mapping" hassle stuff like the rest. This should be on the top – ThangLeQuoc Oct 08 '22 at 04:00
-
Follow the tutorial you listed above for setting up your key preferences in iterm2.
- Create a new shorcut key
- Choose "Send escape sequence" as the action
- Then, to set cmd-left, in the text below that:
- Enter [H for line start
OR - Enter [F for line end
- Enter [H for line start

- 3,368
- 5
- 32
- 47

- 23,051
- 7
- 53
- 50
-
1
-
1
-
Love this! the other solutions did not work for me. I Spend hours frustrated that I could not use ctrl+a and ctrl+e in iterm2. But I did not want to give up fish for it. This totally works thank you! – FLY Jan 31 '19 at 14:03
-
-
I up-voted this answer a while ago. Now working on a new installation I find this answer again. Only thing that works! – FLY Oct 27 '22 at 08:47
I used Travis answer and I created a dynamic profile you can import based on its instructions.
GabLeRoux/iterm2-macos-dynamic-profile
Instructions are in the readme and it's a lot faster to import this than it is to add them all manually. I made this an answer as per @gooli's request because this was hidden in a comment. Hope you enjoy this

- 16,715
- 16
- 63
- 81
Just to help out anyone that is having the same issue but specifically using Zsh shell with iTerm 2. It turns out that Zsh doesn't read /etc/inputrc
properly, and so fails to understand any key bindings you set up through the preferences!
To fix this, you need to add some key bindings to your .zshrc
file, such as:
# key bindings
bindkey "\e[1~" beginning-of-line
bindkey "\e[4~" end-of-line
Note the backslashes in the example above before the "e", the linked article does not show them, so add them into your .zshrc
file when adding bindings.

- 3,947
- 1
- 21
- 20
The old fashion emacs bindings can still work in iterm2 and os x terminal:
Preferences -> Profiles -> Keys (sub tab in profiles)
- Set
Left/Right option <kbd>⌥</kbd> key acts as +Esc
(similar in os x terminal)
This should enable alt-f and alt-b for moving words by words. (Still ctrl-a and ctrl-e always work as usual)
If set as meta
those old bindings will work while some iterm2 bindings unavailable.

- 9,737
- 13
- 54
- 63
As Explains in here, you can do it with a simple steps:
By default, word jumps (option + → or ←) and word deletions (option + backspace) do not work. To enable these, go to "iTerm → Preferences → Profiles → Keys → Load Preset... → Natural Text Editing → Boom! Head explodes"

- 789
- 6
- 19
bind -p
will show a list of bound escaped keys in your shell, that might help giving you more ideas / search terms.

- 7,286
- 2
- 34
- 19
-
6`bind -p` only works in Bourne shells (bash, sh) for zsh, csh tcsh, use `bindkey`. – Travis May 18 '15 at 16:04
explained in https://aaronaddleman.com/articles/hexcodes-and-iterm/
you can use xxd -psd
to get key hex code.

- 956
- 1
- 10
- 18
For me, the following combination worked:
Key | Action | Esc+ | End result |
---|---|---|---|
⌘← | Send Escape Sequence | a | Send ^[ a |
⌘→ | Send Escape Sequence | e | Send ^[ e |

- 15,731
- 6
- 49
- 56