Skip to content

Commit 02c2d5b

Browse files
authored
Merge pull request #161 from vim-jp/add-eval-excmd
Add :eval command
2 parents 50d8ac4 + 24709a5 commit 02c2d5b

File tree

5 files changed

+64
-2
lines changed

5 files changed

+64
-2
lines changed

autoload/vimlparser.vim

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ let s:NODE_CURLYNAMEEXPR = 91
139139
let s:NODE_LAMBDA = 92
140140
let s:NODE_BLOB = 93
141141
let s:NODE_CONST = 94
142+
let s:NODE_EVAL = 95
142143

143144
let s:TOKEN_EOF = 1
144145
let s:TOKEN_EOL = 2
@@ -345,6 +346,7 @@ endfunction
345346
" FINALLY .ea .body
346347
" ENDTRY .ea
347348
" THROW .ea .left
349+
" EVAL .ea .left
348350
" ECHO .ea .list
349351
" ECHON .ea .list
350352
" ECHOHL .ea .str
@@ -889,6 +891,8 @@ function! s:VimLParser._parse_command(parser) abort
889891
call self.parse_cmd_tcl()
890892
elseif a:parser ==# 'parse_cmd_throw'
891893
call self.parse_cmd_throw()
894+
elseif a:parser ==# 'parse_cmd_eval'
895+
call self.parse_cmd_eval()
892896
elseif a:parser ==# 'parse_cmd_try'
893897
call self.parse_cmd_try()
894898
elseif a:parser ==# 'parse_cmd_unlet'
@@ -1820,6 +1824,14 @@ function! s:VimLParser.parse_cmd_throw() abort
18201824
call self.add_node(node)
18211825
endfunction
18221826

1827+
function! s:VimLParser.parse_cmd_eval() abort
1828+
let node = s:Node(s:NODE_EVAL)
1829+
let node.pos = self.ea.cmdpos
1830+
let node.ea = self.ea
1831+
let node.left = self.parse_expr()
1832+
call self.add_node(node)
1833+
endfunction
1834+
18231835
function! s:VimLParser.parse_cmd_echo() abort
18241836
let node = s:Node(s:NODE_ECHO)
18251837
let node.pos = self.ea.cmdpos
@@ -2223,6 +2235,7 @@ let s:VimLParser.builtin_commands = [
22232235
\ {'name': 'endtry', 'minlen': 4, 'flags': 'TRLBAR|SBOXOK|CMDWIN', 'parser': 'parse_cmd_endtry'},
22242236
\ {'name': 'endwhile', 'minlen': 4, 'flags': 'TRLBAR|SBOXOK|CMDWIN', 'parser': 'parse_cmd_endwhile'},
22252237
\ {'name': 'enew', 'minlen': 3, 'flags': 'BANG|TRLBAR', 'parser': 'parse_cmd_common'},
2238+
\ {'name': 'eval', 'minlen': 2, 'flags': 'EXTRA|NOTRLCOM|SBOXOK|CMDWIN', 'parser': 'parse_cmd_eval'},
22262239
\ {'name': 'ex', 'minlen': 2, 'flags': 'BANG|FILE1|EDITCMD|ARGOPT|TRLBAR', 'parser': 'parse_cmd_common'},
22272240
\ {'name': 'execute', 'minlen': 3, 'flags': 'EXTRA|NOTRLCOM|SBOXOK|CMDWIN', 'parser': 'parse_cmd_execute'},
22282241
\ {'name': 'exit', 'minlen': 3, 'flags': 'RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN', 'parser': 'parse_cmd_common'},
@@ -4770,6 +4783,9 @@ function! s:Compiler.compile(node) abort
47704783
elseif a:node.type ==# s:NODE_EXCALL
47714784
call self.compile_excall(a:node)
47724785
return s:NIL
4786+
elseif a:node.type ==# s:NODE_EVAL
4787+
call self.compile_eval(a:node)
4788+
return s:NIL
47734789
elseif a:node.type ==# s:NODE_LET
47744790
call self.compile_let(a:node)
47754791
return s:NIL
@@ -5011,6 +5027,10 @@ function! s:Compiler.compile_excall(node) abort
50115027
call self.out('(call %s)', self.compile(a:node.left))
50125028
endfunction
50135029

5030+
function! s:Compiler.compile_eval(node) abort
5031+
call self.out('(eval %s)', self.compile(a:node.left))
5032+
endfunction
5033+
50145034
function! s:Compiler.compile_let(node) abort
50155035
let left = ''
50165036
if a:node.left isnot# s:NIL

js/vimlparser.js

Lines changed: 22 additions & 1 deletion
Large diffs are not rendered by default.

py/vimlparser.py

Lines changed: 18 additions & 1 deletion
Large diffs are not rendered by default.

test/test1.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
(echo a b c))
1919
(delfunction s:foo)
2020
(call (s:foo 1 2 3))
21+
(eval (filter odds 'v:val % 2'))
22+
(eval 42)
2123
(let = a (dict ("x" "y")))
2224
(let = (a b . c) (list 1 2 3))
2325
(let += (a b . c) (list 1 2 3))

test/test1.vim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ for [a, b; c] in d
2424
endfor
2525
delfunction s:foo
2626
call s:foo(1, 2, 3)
27+
eval filter(odds, 'v:val % 2')
28+
eval 42
2729
let a = {"x": "y"}
2830
let [a, b; c] = [1, 2, 3]
2931
let [a, b; c] += [1, 2, 3]

0 commit comments

Comments
 (0)