andycaramba
@andycaramba
Web Developer (JavaScript, PHP, Anything else)

При восстановлении сессии в Vim слетает подсветка синтаксиса?

Только начинаю осваивать Vim и захотелось мне настроить его таким образом, чтоб при запуске из конкретной директории (например директории проекта) он восстанавливал все ранее открытые файлы для этой самой директории.


Для этого в _vimrc прописал следующее

function! SessionDir()
    if has('win32')
        let sessiondir = $VIM . '/vimfiles/sessions/'.
            \substitute(fnamemodify(".",":pwd"), ':', '', '')  
    else
        let sessiondir = $HOME . '/.vim/sessions/'.
            \substitute(fnamemodify(".",":pwd"), '^'.$HOME, '~', '')           
    endif

    return sessiondir
endfunctio

function! SaveSession()
    let sessiondir = SessionDir()

    " Create session directory if it doesn't exist
    if !isdirectory(sessiondir)
        call mkdir(sessiondir, 'p', 0700)
    endif

    execute "mksession! " . sessiondir . "/session.vim"
endfunction

function! RestoreSession()
    let sessiondir = SessionDir()

    if argc() == 0 && filereadable(sessiondir . "/session.vim")
        execute "source " . sessiondir . "/session.vim"
    endif
endfunction

autocmd VimLeave * call SaveSession()
autocmd VimEnter * call RestoreSession()


Сессии вроде сохраняются и восстанавливаются как надо, но вот при восстановлении сессии слетает подсветка синтаксиса для всех уже открытых файлов. И :set filetype? возвращает пустую строку.


До этого просто сохранял текущую сессию, без привязки к директории запуска Vim. Код в _vimrc был таким

autocmd VimLeave * execute "mksession! " . $VIM . "/vimfiles/session.vim"

autocmd VimEnter * nested if argc() == 0 && filereadable($VIM . "/vimfiles/session.vim") |
    \ execute "source " . $VIM . "/vimfiles/session.vim"


И проблем никаких небыло.


Session options выславлены в
set ssop = blank, curdir, buffers, tabpages, unix, slash, winpos, winsize, resize


Опции, необходимые для подсветки синтаксиса, включены
filetype on
filetype plugin on 
filetype indent on
syntax on


Заранее прошу прощения за столь нубский код и вопрос.
  • Вопрос задан
  • 3072 просмотра
Решения вопроса 1
@ZyXI
Проблема здесь:
autocmd VimEnter * call RestoreSession()

до этого у вас было правильно
autocmd VimEnter * nested …

. Суть в том, что новой командой вы запрещаете Vim вложенные события, тогда как старой разрешали. Определение типа файлов, загрузка синтаксиса и соотвествующих дополнений делается по событию, поэтому вам необходимо добавить nested сразу после шаблона:
autocmd VimEnter * nested call RestoreSession()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
klen
@klen
Я реализовывал подобный механизм, за одним исключением автосохраненная сессия загружается не автоматически, а все таки по команде (комбинации клавиш). Чтобы восстанавливать настройки после загрузки сессии, у меня делается `source vimrc`.

Вы можете посмотреть мои настройки здесь: github.com/klen/.vim/blob/master/rc.vim
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы