Vim is kind and remembers the locations you have recently visited. In your :jump and :changes list, you can see your history just like in browser. This list contains all location where you jumped from. Just like in a browser, each window has its own jump list.

For example searching, substitute, and marks are jumps, however scrolling does not count as jump. A good “go to definition” lsp implementation works the same way, but sadly not all does this and it can annoying.


  • ^o: Jump back in history.
  • ^i: Jump forward in history.

So for example, if you are using vim-go and you call :GoDef, you will end up somewhere else in your codebase, but if you want to go back where you were before the jump, just press ^o (Ctrl + o).

As I mentioned above, we can list our jump list with :jump, the format is simple (as stated in the header of the output). A single > character at the beginning of the line marks your current location. The current position is always jump 0 and the counter goes up on both sides.

   1     1    0 # Jumps
>  0     4   17 `:jump` list, you can see your history just like in browser. This list contains
   1    15    6 * `C-i`: Jump forward in history.

This list can be very long and pressing ^o 20 times sounds like something we shouldn’t do, and yes we shouldn’t do that, we can add a [count] before jump, so if we want to jump back 20 locations, we can use 20^o.

Edit locations

There is a special “jump list” called “change list”, it marks all changes you made in a file. A single “insert mode session” counts as one change. We can list changes with :changes, it has a similar format, but instead of a filename, it shows the content of the line.

  • g;: Jump back in history.
  • g,: Jump forward in history.