On Mon, Jan 10, 2011 at 03:30:47PM +0300, ZyX wrote:
> Reply to message «Re: How to mimic vim assignment in vimscript?»,
> sent 14:26:41 10 January 2011, Monday
> by Marc Weber:
>
> > or the like. However be careful: eval can run arbitrary code. I don't
> > know about a "safe" way to do this without writing a parser or looking
> > for an existing one.
> If you are going to look onto a parser, I can suggest my own jsonvim and
> yamlvim
> parsers: first is used to parse json (which is much similar to vimscript),
> second parses yaml (which is superset of json). In the first case the code
> will
> look like this:
>
> function! ParseVars()
> let s:j=load#LoadFuncdict("json")
> let lastline=line('$')
> let curline=1
> let toparse=[]
> let prevwasmatch=0
> while curline<=lastline
> let linestr=getline(curline)
> let match=matchlist(linestr, '\([a-zA-Z]\w*\)\s*=\s*\(.*\)$')
> if !empty(match)
> call add(toparse, [match[1], match[2]])
> let prevwasmatch=1
> elseif linestr=~'^\s*\\' && prevwasmatch
> let toparse[-1][1].=matchstr(linestr, '\\\zs.*')
> else
> let prevwasmatch=0
> endif
> let curline+=1
> endwhile
> for [varname, varstr] in toparse
> let b:{varname}=s:j.loads(varstr)
> endfor
> endfunction
>
> Replacing "json" with "yaml" here is enough to switch to yaml parser, which
> have
> the following advantage: it will parse the incorrect vim variable assignment
> a = [[1:"foo"], [2:"bar"]]
> as
> a=[[{'1': 'foo'}], [{'2': 'bar'}]]
> (complaining about converting number to string, you may ignore these messages
> or
> even add `silent' before ``let b:{varname}''), while json parser will fail
> (because this code is incorrect). Using these parsers should be safe enough.
Thanks for inspiration in vimscript! I decided to use a fixed pattern
to avoid complicated, user should use following format to specify the
var:
a = [
\[1, opt1],
\[2, opt2],
\]
>
> Original message:
> > Excerpts from Yue Wu's message of Mon Jan 10 12:21:30 +0100 2011:
> > > Hi, list,
> > >
> > > I'm writing a vim script, in which I want to support buffer defined
> > > vars in two patterns, say, user can put the following lines into a
> > >
> > > file:
> > > a = [[1:"foo"],[2:"bar"]]
> >
> > The most simple way is:
> >
> > call map(filter(getlines(0,line('$')), 'match your var assignment here
> > v:val =~ 'regex'"), 'eval(v:val)') (untested)
> >
> > or the like. However be careful: eval can run arbitrary code. I don't
> > know about a "safe" way to do this without writing a parser or looking
> > for an existing one.
> >
> > Marc Weber
--
Regards,
Yue Wu
Key Laboratory of Modern Chinese Medicines
Department of Traditional Chinese Medicine
China Pharmaceutical University
No.24, Tongjia Xiang Street, Nanjing 210009, China
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php