When I quit VIM and open the same file again, I am positioned at the start of the file. How can I preserve the last cursor position?
-
possible duplicate of [How do you make Vim take you back where you were when you last edited a file?](http://stackoverflow.com/questions/1682536/how-do-you-make-vim-take-you-back-where-you-were-when-you-last-edited-a-file) – mloskot Oct 25 '11 at 18:55
-
4Funny that Vim already remembers this position, it's the `"` mark. So even if you don't have this in your `.vimrc` you can press `g\`"` (g, backtick, doublequote) – Tomasz Gandor Oct 05 '20 at 10:19
9 Answers
Taken from http://amix.dk/vim/vimrc.html
" Return to last edit position when opening files (You want this!)
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif

- 659
- 5
- 2
-
2Can you explain what the `if` statement is doing here? I'm reading it as "Only restore the cursor if the cursor is after the first line or before the last line", and it's not clear to me what difference that makes. I currently added `autocmd BufReadPost * normal! g\`"zv` to my vimrc and it seems to work, but I guess I don't understand the potential pitfalls of unconditional mark restoring. – robru Jun 08 '14 at 15:36
-
12Ah, if the file is truncated outside of vim, and vim's mark is on a line that no longer exists, vim throws an error. Fixed that with `autocmd BufReadPost * silent! normal! g\`"zv` – robru Jun 08 '14 at 15:42
-
4I didn't know why the `zv` part... Turns out it "unfolds" current line. Wow, there's always something more to learn even if you know how to quit Vim. – Tomasz Gandor Oct 05 '20 at 10:16
-
1This actually worked for me, where the `source $VIMRUNTIME/vimrc_example.vim` and `silent! source $VIMRUNTIME/defaults.vim` didn't. – Viktor Nordling May 19 '22 at 00:37
-
@TomaszGandor Is no one going to acknowledge the joke Tomasz made here? I chuckled, haha. – Nathan majicvr.com Feb 18 '23 at 14:24
The "out of the box" .vimrc
enables this with the statement:
source $VIMRUNTIME/vimrc_example.vim
You may just need to restore this statement in your .vimrc
. In any case, see vimrc_example.vim
and also see the line()
function in the Vim manual for a discussion of how it works.

- 3,753
- 1
- 28
- 30
-
That worked for me on mac os x. I cp'd the file, chmod 600, and life was grand. – tggagne Mar 27 '15 at 03:07
-
2this does a bunch of other things too: https://github.com/vim/vim/blob/master/runtime/vimrc_example.vim – localhostdotdev May 13 '19 at 15:50
-
The last edit position is automatically preserved by Vim, and is available as "special" jump mark .
. Other special marks include "
(position you saved from) and '
(position you jumped from).
You can jump to a mark by typing '<mark>
, so '.
will take you to the place of the last edit, ''
will take you back to where you were, and '"
takes you to the position you saved the file at.
That and more about Vim marks at Vim.Wikia.

- 67,862
- 21
- 134
- 209
There is a plugin (I am the author) called vim-lastplace that will intelligently return you to the last edit that you made.
It also has a configuration option to ignore certain file types. By default it will ignore commit messages for git, svn, and mercurial. For these file types it will start your cursor at the first line. The code snippets above will jump into the middle of your commit message file (where you left off in your previous commit) even though that's probably not what you want. vim-lastplace fixes this problem.

- 862
- 8
- 16
For Neovim users who are looking for a pure Lua version:
-- Restore cursor position
vim.api.nvim_create_autocmd({ "BufReadPost" }, {
pattern = { "*" },
callback = function()
vim.api.nvim_exec('silent! normal! g`"zv', false)
end,
})

- 996
- 13
- 14
A more up-to-date version of the currently accepted answer:
silent! source $VIMRUNTIME/defaults.vim

- 4,832
- 6
- 37
- 51
Make sure ~/.viminfo
is readable and writable by the user running vim. Somehow I had ended up with a copy readable only by root in my standard user home directory, which meant that the last cursor position could not be stored.

- 247
- 2
- 5
I'm adding more complete example to @Mariano answer https://stackoverflow.com/a/14449484/108654 with some additional checks
" Only do this part when compiled with support for autocommands
if has("autocmd")
augroup redhat
autocmd!
" When editing a file, always jump to the last cursor position
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal! g'\"" |
\ endif
augroup END
endif

- 4,273
- 1
- 20
- 38

- 1,188
- 8
- 25
You could try the :mks
command (make session). It stores a script file which, when run through vim, restores your current editing session, including all open files and the cursor position.

- 20,353
- 1
- 39
- 56
-
It creates a Session.vim file in the local directory. This is not what I wanted. I now vim can automatically save the editing position and restore it when the same file is opened. I just don't know how. – Dmitry Negoda Oct 25 '11 at 19:04