воскресенье, 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 комментариев:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ОтветитьУдалить
  13. thevoan

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

    ОтветитьУдалить