Reply to message «Re: syntax coloring», 
sent 19:13:18 15 April 2011, Friday
by rameo:

> Please let me ask you one more question...
> How do you close this session and reopens a custom one (happens once
> in a while)?
I don't use one continious vim session and don't load any sessions at 
vim startup (the `just the same error' meant that I used an autocommand 
in a similar way and got the same error, not that I used the same code). 
Instead I create a new session file almost each time when vim exits 
and load one of created sessions at vim startup:
1. due to virtual desktops I almost never close any of my projects' windows,
2. I use vim to quickly edit something from command-line, loading any sessions 
   will discard the most significant part of vim invocation arguments 
   for this use-case.
Saving session at vim exit is for the case when I have to reload vim 
(mostly plugin or kernel updates).
Here is my code:

    "▶2 mksession
    if has('mksession')
        function s:InitSes()
            let sesdir=expand('~/.vimsessions')
            if !isdirectory(sesdir)
                call mkdir(expand(sesdir), "", 0700)
            endif
            let sesfile=os#JoinPath(sesdir, '.sessions.lst')
            let sessions=[]
            if filereadable(sesfile)
                let sessions+=readfile(sesfile, 'b')
                while !empty(sessions) && empty(sessions[-1])
                    call remove(sessions, -1)
                endwhile
            endif
            let sessplitted=map(copy(sessions),
                        \'split(v:val, ''\v%(\\@<!%(\\\\)*)@<=,'')')
            let sesdirs=map(copy(sessplitted), 
'((empty(v:val))?(""):(v:val[0]))')
            let sesfiles=map(copy(sessplitted), 
'((empty(v:val))?([]):(v:val[1:]))')
            execute "cd ".fnameescape(resolve(fnamemodify('.', ':p')))
            let curdir=escape(fnamemodify('.', ':p'), ',\')
            return [sesdir, sesfile, sessions, sesdirs, sesfiles, curdir]
        endfunction
        let s:_functions['s:InitSes']=function('s:InitSes')
        function s:MakeSession()
            let [sesdir, sesfile, sessions, sesdirs, sesfiles, 
curdir]=s:InitSes()
            let files=sort(map(filter(map(filter(range(1, bufnr('$')),
                        \                        'getbufvar(v:val, 
"&bt")!=#"help"'),
                        \                 'bufname(v:val)'),
                        \             'filereadable(v:val)'),
                        \      'escape(fnamemodify(resolve(fnamemodify(v:val, 
":p")), 
":~:."), ",\\")'))
            if empty(files)
                return
            endif
            let sesstr=join([curdir]+files, ',')
            let sindex=index(sessions, sesstr)
            if sindex==-1
                let sindex=index(sessions, '')
            endif
            if sindex==-1
                let sesname=os#JoinPath(sesdir, len(sesdirs).'.vim')
                call add(sessions, sesstr)
            else
                let sesname=os#JoinPath(sesdir, sindex.'.vim')
                let sessions[sindex]=sesstr
            endif
            execute 'mksession! '.fnameescape(sesname)
            call writefile(sessions, sesfile, 'b')
        endfunction
        let s:_functions['s:MakeSession']=function('s:MakeSession')
        function s:LoadSession(bang, ...)
            let [sesdir, sesfile, sessions, sesdirs, sesfiles, 
curdir]=s:InitSes()
            if a:0 && string(+a:1)==#a:1 && a:1<len(sessions) &&
                        \!empty(sessions[a:1])
                let dirsessions=[[+a:1, sesdirs[a:1], sessions[a:1]]]
            else
                let dirsessions=filter(map(copy(sesdirs),
                            \              '[v:key, v:val, sessions[v:key]]'),
                            \          'v:val[1]==#curdir'.
                            \                   ((a:0)?(' && 
v:val[2]=~?a:1'):('')))
            endif
            if len(dirsessions)==1 || (!empty(dirsessions) && a:bang)
                let sesid=dirsessions[0][0]
                let sesname=os#JoinPath(sesdir, sesid.'.vim')
                execute 'source '.fnameescape(sesname)
                call delete(sesname)
                if sesid==(len(sessions)-1)
                    call remove(sessions, -1)
                else
                    let sessions[sesid]=""
                endif
                call writefile(sessions, sesfile, 'b')
            endif
        endfunction
        let s:_functions['s:LoadSession']=function('s:LoadSession')
        function s:PrintSessions()
            let [sesdir, sesfile, sessions, sesdirs, sesfiles, 
curdir]=s:InitSes()
            call map(sessions,
                        \'printf("%'.len(len(sessions)-1).'u %s", v:key, 
v:val)')
            echo join(sessions, "\n")
        endfunction
        let s:_functions['s:PrintSessions']=function('s:PrintSessions')
        autocmd VimLeavePre * call s:MakeSession()
        command -nargs=? -bang LoadSession   call s:LoadSession(<bang>0, 
<q-args>)
        command -bar           PrintSessions call s:PrintSessions()
        let s:_commands+=['LoadSession', 'PrintSessions']
    endif
    "▲2

I am going to evolve this into plugin sometime.

Original message:
> On Apr 15, 1:43 pm, ZyX <zyx....@gmail.com> wrote:
> > Reply to message «syntax coloring»,
> > sent 11:06:33 15 April 2011, Friday
> > 
> > by rameo:
> > > When I start VIM it shows my tabs and reloads my buffers from the last
> > > time.
> > > 
> > > I use a session to do this.
> > > 
> > > au VimEnter * exe "so d:\\Session.vim"
> > > au VimLeave * exe "'mksession! d:\\Session.vim'"
> > 
> > You have made just the same mistake as me some time ago: all
> > filetype-related files are loaded using an autocommand, but by default
> > no autocommands are allowed when you are executing an autocommand, so
> > you should add `nested' just after the pattern. By the way, why do you
> > use `exe'? The following works as well:
> >     augroup SaveRestoreSessions
> >         autocmd!
> >         autocmd VimEnter * nested source D:\session.vim
> >         autocmd VimLeave * nested mksession! D:\session.vim
> >     augroup END
> > 
> > See `:h autocmd-nested' for more details.
> > 
> > Original message:
> > > When I start VIM it shows my tabs and reloads my buffers from the last
> > > time.
> > > 
> > > I use a session to do this.
> > > 
> > > au VimEnter * exe "so d:\\Session.vim"
> > > au VimLeave * exe "'mksession! d:\\Session.vim'"
> > > 
> > > My reopened files do not have syntax coloring.
> > > I have to do ":e" in every file where I need syntax coloring to view
> > > syntax coloring.
> > > 
> > > I know that I can add "localoptions" in sessionoptions but this slows
> > > down my vim (I noted that it uses 20-25% more CPU). Without
> > > "localoptions" my vim is much faster.
> > > 
> > > How do you resolve this?
> > > Don't you use sessions?
> > 
> >  signature.asc
> > < 1KViewDownload
> 
> Great! It does work.
> Thanks a lot!
> 
> Please let me ask you one more question...
> How do you close this session and reopens a custom one (happens once
> in a while)?

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to