I know the combination Ctrl+A to jump to the beginning of the current command, and Ctrl+E to jump to the end.
But is there any way to jump word by word, like Alt+←/→ in Cocoa applications does?
Out of the box you can use the quite bizarre Esc+F to move to the beginning of the next word and Esc+B to move to the beginning of the current word.
Esc
+F
when at the end of a line or the other key combo at the start of the line, it just inserts the letter instead. Annoying!
~/.inputrc
.
Commented
Mar 11, 2014 at 6:11
On macOS (all versions) the following keyboard shortcuts work by default.
Note that you have to make set the Option key to act like the Meta key. You can do this in Terminal by accessing preferences (CMD+,) and selecting Profiles -> Keyboard. In iTerm2 select Profiles -> Keys -> General and select "Option key as Esc+."
Additionally some Emacs-style key bindings for simple text navigation seem to work on bash shells. You can use:
/
characters, which is a pain. Any idea how to include /
as a word separator?
By default, the Terminal has these shortcuts to move (left and right) word-by-word:
You can configure alt+← and → to generate those sequences for you:
⌥ ←
if it's there, or add it if it's not.\033b
(you can't type this text manually).\033f
) Alternatively, you can refer to this blog post over at textmate:
B
for back or F
for forward into the Esc+
field
alt left
and alt right
to generate those sequences
Switch to iTerm2. It's free and much nicer than plain old terminal. Also it has a lot more options for customization, like keyboard shortcuts.
Also I love that you can use cmd and 1-9 to switch between tabs. Try it and you will never go back to regular terminal :)
How to set up custom keyboard preferences in iterm2
I often hit the wrong button (cmd / control / alt) with an arrow key and so i have my arrow key combinations with those buttons all set to jump forward and back words, but please do what fits you best.
Ctrl + Arrow Left
or Right
- Up
and Down
works :/ tried with and without the new profile set as default
Actually there is a much better approach. Hold option ( alt on some keyboards) and press the arrow keys left or right to move by word. Simple as that.
option←
option→
Also ctrle will take you to the end of the line and ctrla will take you to the start.
[D
and [C
. To fix this, add bind '"[D": backward-word'
and bind '"[C": forward-word'
to my .bashrc
.
Commented
May 5, 2017 at 15:44
.bashrc
but it didn't work, anything wrong for me ? (I use RubyMine)
.bashrc
when the terminal boots. Try echo "here"
and see if that message displays when you open a new terminal. Also, you have to close and re-open the terminal or run source ~/.bashrc
to get it to read the new file.
Commented
May 23, 2017 at 15:17
I have Alt+←/→ working: open Preferences » Settings » Keyboard, set the entry for option cursor left to send string to shell: \033b, and set option cursor right to send string to shell: \033f. You can also use this for other Control key combinations.
Enable option as meta key
. By the way, it's very cool. The key is sure to be much more convenient to be reached compare to Esc+B or Esc+F
Commented
Jul 20, 2010 at 6:31
Use Natural Text Editing preset!
Essentially it binds, among other key sequences, Option + LeftArrow to ^[b
sequence and Option + RightArrow to ^[f
This works in fish and bash, as well as in psql terminal.
Actually it depends on what shell you use, however most shells have similar bindings. The bindings you are referring to (e.g. Ctrl+A and Ctrl+E) are bindings you will find in many other programs and they are used for ages, BTW also work in most UI apps.
Here's a look of default bindings for Bash:
Most Important Bash Keyboard Shortcuts
Please also note that you can customize them. You need to create a file, name as you wish, I named mine .bash_key_bindings and put it into my home directory. There you can set some general bash options and you can also set key bindings. To make sure they are applied, you need to modify a file named ".bashrc" that bash reads in upon start-up (you must create it, if it does not exist) and make the following call there:
bind -f ~/.bash_key_bindings
~ means home directory in bash, as stated above, you can name the file as you like and also place it where you like as long as you feed the right path+name to bind.
Let me show you some excerpts of my .bash_key_bindings file:
set meta-flag on
set input-meta on
set output-meta on
set convert-meta off
set show-all-if-ambiguous on
set bell-style none
set print-completions-horizontally off
These just set a couple of options (e.g. disable the bell; this can be all looked up on the bash webpage).
"A": self-insert
"B": self-insert
"C": self-insert
"D": self-insert
"E": self-insert
"F": self-insert
"G": self-insert
"H": self-insert
"I": self-insert
"J": self-insert
These make sure that the characters alone just do nothing but making sure the character is "typed" (they insert themselves on the shell).
"\C-dW": kill-word
"\C-dL": kill-line
"\C-dw": backward-kill-word
"\C-dl": backward-kill-line
"\C-da": kill-line
This is quite interesting. If I hit Ctrl+D alone (I selected d for delete), nothing happens. But if I then type a lower case w, the word to the left of the cursor is deleted. If I type an upper case, however, the word to the right of the cursor is killed. Same goes for l and L regarding the whole line starting from the cursor. If I type an "a", the whole line is actually deleted (everything before and after the cursor).
I placed jumping one word forward on Ctrl+F and one word backward on Ctrl+B
"\C-f": forward-word
"\C-b": backward-word
As you can see, you can make a shortcut, that leads to an action immediately, or you can make one, that just inits a character sequence and then you have to type one (or more) characters to cause an action to take place as shown in the example further above.
So if you are not happy with the default bindings, feel free to customize them as you like. Here's a link to the bash manual for more information.
command
key code? In your example, control
is \C
, but how is command
?
Commented
Nov 7, 2014 at 16:00
Meta
in bash (\M
), cmd+left would be \M-\e[D
. However, you cannot map cmd+... to anything, all command shortcuts are handled (and thus swallowed) by the Terminal app itself (those never get forwarded to the shell) and cmd+left maps to "previous window" if you have multiple terminal windows open. Sorry, it's just not possible with Terminal app.
If you happen to be a Vim user, you could try bash's vim mode. Run this or put it in your ~/.bashrc
file:
set -o vi
By default you're in insert mode; hit escape and you can move around just like you can in normal-mode Vim, so movement by word is w
or b
, and the usual movement keys also work.
If you check Use option as meta key
in the keyboard tab of the preferences, then the default emacs style commands for forward- and backward-word and ⌥F
(Alt+F) and ⌥B
(Alt+B) respectively.
I'd recommend reading From Bash to Z-Shell. If you want to increase your bash/zsh prowess!
As of Mac OS X Lion 10.7, Terminal maps Option-Left/Right Arrow to Esc-b/f by default, so this is now built-in for bash and other programs that use these emacs-compatible keybindings.
In Bash, these are bound to Esc-B and Esc-F.
Bash has many, many more keyboard shortcuts; have a look at the output of bind -p
to see what they are.
Under iterm2
's Preferences > Profile > Keys, you click the +
below Key Mappings and record a new shortcut. For Action, select Send Escape Sequence
and type b
or f
for backwards and forwards respectively.
When I tried to record one for (Ctrl+←), I noticed in the Keyboard Shortcut field that the arrow never showed up. Turns out I had to disable the default mac's System Preferences > Keyboard > Shortcuts > Mission Control shorcuts first to get things to work, as they'll override iterm2's default shortcuts. Should be true for the standard terminal app, too.
Here's the CLI way to do so, verified it works on bash
.
Add the following to your ~/.inputrc
:
# macOS Option + Left/Right arrow keys to move the cursor wordwise
"\e\e[C": forward-word
"\e\e[D": backward-word
The advantage of this method is that it is terminal application agnostic - doesn't matter whether you use Terminal.app, iTerm2, or any other application.
Inspiration got from this other answer.
~/.inputrc
, that solved a 3h issue I had with all shell with commands Ctrl-A
or Ctrl-E
not working simply because it had a set editing-mode vi
line on it..............
For some reason, my terminal's option+arrow weren't working. To fix this on macOS 10.15.6, I opened the terminal app's preferences, and had to set the bindings.
Option-left = \033b
Option-right = \033e
For some reason, the option-right
I had was set up to be \033f
. Now that it's fixed, I can freely skip around words in the termianl again.
New answer for iTerm2 Build 3.3.4 users:
Step 1: (macOS X) System Preferences > Keyboard > Shortcuts tab > Select Mission Control (left panel) > Uncheck shortcuts that labeled as "Move left a space" and "Move right a space"
Step 2: (iTerm2 Build 3.3.4) Preferences > Profiles > Select * Default (left panel) > Keys tab > Delete both "⌥->" and "⌥<-" entries > Set both "Left Option (⌥) Key:" and "Right Option (⌥) Key:" to Esc+
No messing around with shell profiles, no messing around with inferior masOS (default) Terminal, no awkwards Esc+F/B, rinse & repeat non-sense.
Done deal!!!
Enjoy this tip, my fellow PROGRAMMERS!
As answered previously, you can add set -o vi
in your ~/.bashrc
to use vi
/vim
key bindings, or else you can add following part in .bashrc
to move with Ctrl
and arrow keys:
# bindings to move 1 word left/right with ctrl+left/right in terminal, just some apple stuff!
bind '"\e[5C": forward-word'
bind '"\e[5D": backward-word'
# bindings to move 1 word left/right with ctrl+left/right in iTerm2, just some apple stuff!
bind '"\e[1;5C": forward-word'
bind '"\e[1;5D": backward-word'
To start effect of these lines of code, either source ~/.bashrc
or start a new terminal session.
in Cot Editor or in Terminal simple way to skip word without changing any settings is to use
Option_Key + -> (right arrow) to move one word to right
Option_key + <- (left arrow) to move one word to left
Profiles › Keys › Key Mappings
Profiles › Keyboard
Just check the "Use Option as meta key" option in Terminal > Preferences > Settings > [profile] > Keyboard, as mentioned here already by @cris-page.
Note however, that in macOS Catalina (10.15) and newer, zsh becomes the default shell for newly added users: its default configuration considers only whitespaces as word-boundaries, whereas the old bash makes meta-left/right jump to the nearest non-alphanumerical character (similar to B
/W
as opposed to b
/w
for those familiar with vim):
v----v- bash jumps here
$ vim some-folder/what.txt_<- jump left twice from here
^---^- zsh jumps here by default
(similar motions are true for meta-backspace as well)
There are more than one ways to make zsh command line editor navigation work similarly to bash's - here is one such method:
# Place in your profile init script, e.g. `~/.zshrc`
autoload -U select-word-style
select-word-style bash
ALT
shortcuts have been added to Terminal in the latest OS X version.