Vim in OSX: How to do page-up/page-down/go to EOL through a vim file opened in terminal?

In putty, which is how I primarily used VIM, I could do the following:

  • Page up/down : Using the native Page up/down key. In Mac, the alternative is Fn + Up/Down, which doesn't work in the terminal (doesn't scroll inside the vim file, but scrolls the terminal buffer)
  • Similarly, the Fn + right/left keys do not take me to start/end of line

How do I emulate this functionality in Mac OS X ?


This isn't specifically a mac question, this is really a vi question.

In navigation mode, ctrl-f scrolls down a page and ctrl-b scrolls up a page (think "F"orward and "B"ack). Ctrl-d scrolls down half a page, and ctrl-u scrolls up half a page.

^ takes you to the beginning of a line, and $ to the end. I know, I know, but there are historical reasons for that.

Here's a really good cheat-sheet on vi controls. vi is a little bit arcane, but once you internalize it, it's the quickest and slickest text editor in the world.


Terminal's default preferences map Shift-Page Up and Shift-Page Down to the character sequences that tell programs like Vim and Emacs to scroll (ESC [ 5 ~ and ESC [ 6 ~).

If you want these keys to send character sequences to the terminal without the Shift modifier, you can customize the keyboard map:

Terminal > Preferences > Settings > [profile] > Keyboard

If you do this, I recommend you invert the meaning of the Shift modifier for these keys by swapping the mappings for the shifted and unshifted keys, so that the alternative behaviors are still available. Also, see the View menu, which contains scrolling commands that use the Command modifier so they're available regardless of the terminal keyboard map.

Similarly, Shift-Home and Shift-End are mapped to move to the start/end of the current line (ESC [ H and ESC [ F). These sequences are understood by Bash, but you may have to customize Vim to understand them, or edit the mappings specifically for Vim. Vim, Emacs, and some other programs send an escape sequence to put the terminal into “Application Cursor Mode”, where the Home/End keys send ESC O H and ESC O F, but Terminal (as of 10.9) does not implement this behavior. So you may wish to change the keyboard map to send these other codes instead (Bash also understands them). (On other OSes, Home and End are used for start/end of line, so Terminal provides them with the Shift modifier for symmetry.)

Control-Left Arrow and Control-Right Arrow are also mapped to "move to start/end of line" sequences by default, though they're different from the ones mapped to Shift-Home and Shift-End. Instead, they're mapped to the Emacs- and Bash-compatible sequences ESC [ 5 D and ESC [ 5 C. Assuming these aren't in use by Vim, the simplest approach would be to customize Vim to accept these, using ~/.vimrc.

Note that in more-recent versions of macOS, Terminal no longer has explicit mappings for Home and End in the preferences by default. Instead, it has a dynamic behavior where the keys automatically map to start/end-of-line when the alternate screen is active—e.g., when using a full-screen application like emacs, vim, screen or tmux. When using a line-oriented program like a shell on the main screen, they continue to scroll the terminal view by default. The Shift modifier inverts the behavior.


The easiest and best solution is n+, where n is the number of lines you would like to go down, and is the down key.

I regularly just do 12+ and 22+.