Skip to content

Commit 94f248e

Browse files
author
Florian Proksch
committed
Added neovim support for all languages. Added test cases to reflect neovim features and the absence of neovim features for regular vim parsing. Added a toggle option as an argument that defaults to regular vim if not specified for all languages.
1 parent 8235a27 commit 94f248e

11 files changed

+125
-11
lines changed

autoload/vimlparser.vim

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,16 @@ endfunction
1111
" @brief Read input as VimScript and return stringified AST.
1212
" @param input Input filename or string of VimScript.
1313
" @return Stringified AST.
14-
function! vimlparser#test(input)
14+
function! vimlparser#test(input, ...)
1515
try
16+
if a:0 > 0
17+
let l:neovim = a:1
18+
else
19+
let l:neovim = 0
20+
endif
1621
let i = type(a:input) == 1 && filereadable(a:input) ? readfile(a:input) : a:input
1722
let r = s:StringReader.new(i)
18-
let p = s:VimLParser.new()
23+
let p = s:VimLParser.new(l:neovim)
1924
let c = s:Compiler.new()
2025
echo join(c.compile(p.parse(r)), "\n")
2126
catch
@@ -409,7 +414,13 @@ function! s:VimLParser.new(...)
409414
return obj
410415
endfunction
411416

412-
function! s:VimLParser.__init__()
417+
function! s:VimLParser.__init__(...)
418+
if a:0 > 0
419+
let self.neovim = a:1
420+
else
421+
let self.neovim = 0
422+
endif
423+
413424
let self.find_command_cache = {}
414425
endfunction
415426

@@ -823,6 +834,24 @@ function! s:VimLParser.find_command()
823834
endif
824835
endfor
825836

837+
if self.neovim
838+
for x in self.neovim_additional_commands
839+
if stridx(x.name, name) == 0 && len(name) >= x.minlen
840+
unlet cmd
841+
let cmd = x
842+
break
843+
endif
844+
endfor
845+
846+
for x in self.neovim_removed_commands
847+
if stridx(x.name, name) == 0 && len(name) >= x.minlen
848+
unlet cmd
849+
let cmd = s:NIL
850+
break
851+
endif
852+
endfor
853+
endif
854+
826855
" FIXME: user defined command
827856
if (cmd is s:NIL || cmd.name ==# 'Print') && name =~# '^[A-Z]'
828857
let name .= self.reader.read_alnum()
@@ -1789,6 +1818,18 @@ function! s:VimLParser.parse_wincmd()
17891818
call self.add_node(node)
17901819
endfunction
17911820

1821+
let s:VimLParser.neovim_additional_commands = [
1822+
\ {'name': 'tnoremap', 'minlen': 8, 'flags': 'EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN', 'parser': 'parse_cmd_common'}]
1823+
1824+
let s:VimLParser.neovim_removed_commands = [
1825+
\ {"name":"Print", "minlen":1, "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN", "parser":"parse_cmd_common"},
1826+
\ {"name":"fixdel", "minlen":3, "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"},
1827+
\ {"name":"helpfind", "minlen":5, "flags":"EXTRA|NOTRLCOM", "parser":"parse_cmd_common"},
1828+
\ {"name":"open", "minlen":1, "flags":"RANGE|BANG|EXTRA", "parser":"parse_cmd_common"},
1829+
\ {"name":"shell", "minlen":2, "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"},
1830+
\ {"name":"tearoff", "minlen":2, "flags":"NEEDARG|EXTRA|TRLBAR|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"},
1831+
\ {"name":"gvim", "minlen":2, "flags":"BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}]
1832+
17921833
let s:VimLParser.builtin_commands = [
17931834
\ {'name': 'append', 'minlen': 1, 'flags': 'BANG|RANGE|ZEROR|TRLBAR|CMDWIN|MODIFY', 'parser': 'parse_cmd_append'},
17941835
\ {'name': 'abbreviate', 'minlen': 2, 'flags': 'EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN', 'parser': 'parse_cmd_common'},

js/vimlparser.js

Lines changed: 43 additions & 3 deletions
Large diffs are not rendered by default.

py/vimlparser.py

Lines changed: 26 additions & 4 deletions
Large diffs are not rendered by default.

test/run.sh

100644100755
File mode changed.

test/run.vim

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ function! s:run()
1010
let outfile = fnamemodify(vimfile, ':r') . '.out'
1111
let src = readfile(vimfile)
1212
let r = s:vimlparser.StringReader.new(src)
13-
let p = s:vimlparser.VimLParser.new()
13+
if vimfile =~# 'test_neo'
14+
let l:neovim = 1
15+
else
16+
let l:neovim = 0
17+
endif
18+
let p = s:vimlparser.VimLParser.new(l:neovim)
1419
let c = s:vimlparser.Compiler.new()
1520
try
1621
let out = c.compile(p.parse(r))

test/test_neo_helpfind_removed.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vimlparser: E492: Not an editor command: helpfind: line 1 col 1

test/test_neo_helpfind_removed.vim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
helpfind

test/test_neo_tnoremap.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(excmd "tnoremap <Esc> <C-\\><C-N>")

test/test_neo_tnoremap.vim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
tnoremap <Esc> <C-\><C-N>

test/test_noneo_tnoremap.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vimlparser: E492: Not an editor command: tnoremap <Esc> <C-\><C-N>: line 1 col 1

0 commit comments

Comments
 (0)