воскресенье, 14 февраля 2010 г.

Восстановление позиции курсора при открытии файла в Vim

Не знаю, как я раньше жил без этого, но вот на днях залез в гугл, и оказалось, что настроить Vim так, чтобы при открытии файла он каждый раз восстанавливал позицию курсора, с которой файл был закрыт в прошлый раз, очень просто: для этого даже не надо ставить никакие плагины, достаточно прописать в ~/.vimrc следующие строки:
if has("autocmd")
    " When editing a file, always jump to the last known cursor position.
    " Don't do it when the position is invalid or when inside an event
    " handler (happens when dropping a file on gvim).
    autocmd BufReadPost *
        \ if line("'\"") > 0 && line("'\"") <= line("$") |
        \   exe "normal g`\"" |
        \ endif
endif

Update:
А еще лучше использовать следующий код:
if has("autocmd")
    set viewoptions=cursor,folds
    au BufWinLeave * mkview
    au BufWinEnter * silent loadview
endif
Он помимо курсора еще и фолдинги восстанавливает (спасибо за подсказку lyn4ed).

13 комментариев:

bosha комментирует...

Странно.Vim должен был по умолчанию так делать..

zed_0xff комментирует...

в некоторых линукс-дистрах это есть из коробки.
в частности, в Gentoo.

bappoy комментирует...

Обычно сразу после установки системы (debian) я открываю /etc/vim/vimrc и раскомментирую все строки, кроме mouse. там еще куча всего интересного.

Анонимный комментирует...

вау, вот это действительно то, что раздражало меня :-)
спасибо за подсказку!

никак пока не могу привыкнуть к этими режимам, все время пытаюсь редактировать текст в нормальном, бр-р-р...

lyn4ed комментирует...

Это несколько педальное решение при наличии mkview и loadview — тут и фолдинги сохраняются.

kapsh комментирует...

У меня эта фича давно в .vimrc. Если память не изменяет - стащил из дефолтного конфига в дебиане =)

Анонимный комментирует...

По-моему, как раз удобно, что:
1) Файл всегда при открытии показывается на первой строке, поскольку это вполне ожидаемое поведение.
2) Есть простая команда перехода на метку, '", которая работает как и все остальные такие команды.
Другими словами, не вижу проблемы ввести '" после открытия файла, если нужно перейти к месту последнего редактирования.

Unknown комментирует...

> Это несколько педальное решение при наличии mkview и loadview — тут и фолдинги сохраняются.

lyn4ed, спасибо, про mkview я тоже забыл. :) А ведь раньше читал про него в документации...

Сейчас заменил вышеприведенные строки на:
set viewoptions=cursor,folds
au BufWinLeave * mkview
au BufWinEnter * silent loadview

Unknown комментирует...

kostix, ну это уже дело вкуса. А вот если использовать mkview/loadview (см. выше), то и фолдинги восстанавливаются, что действительно может быть очень удобно.

dimio комментирует...

Надо же, а я был уверен, что именно из вашего конфига у vim утащил mkview и loadview.

Andrey Vorobyev комментирует...

У меня при 2-ом способе когда открываю vim (без указания файла) высвечивается предупреждение:

Обнаружена ошибка при обработке BufWinEnter Автокоманды для "*": нет имени файла

хотя сохранение фолдингов, положения курсора работает.
Не подскажете как можно исправить?

Pavel комментирует...

Скоре всего это из-за недртрее или ему подобным плагинам, т.к. данные буферы не связаны ни с какими файлами.

SkriP комментирует...

thevoan

мне помогло: https://vi.stackexchange.com/questions/13864/bufwinleave-mkview-with-unnamed-file-error-32