Skip to content

Commit 7e1a6a8

Browse files
committed
add :eval command
1 parent 1d130bc commit 7e1a6a8

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
@@ -344,6 +345,7 @@ endfunction
344345
" FINALLY .ea .body
345346
" ENDTRY .ea
346347
" THROW .ea .left
348+
" EVAL .ea .left
347349
" ECHO .ea .list
348350
" ECHON .ea .list
349351
" ECHOHL .ea .str
@@ -888,6 +890,8 @@ function! s:VimLParser._parse_command(parser) abort
888890
call self.parse_cmd_tcl()
889891
elseif a:parser ==# 'parse_cmd_throw'
890892
call self.parse_cmd_throw()
893+
elseif a:parser ==# 'parse_cmd_eval'
894+
call self.parse_cmd_eval()
891895
elseif a:parser ==# 'parse_cmd_try'
892896
call self.parse_cmd_try()
893897
elseif a:parser ==# 'parse_cmd_unlet'
@@ -1812,6 +1816,14 @@ function! s:VimLParser.parse_cmd_throw() abort
18121816
call self.add_node(node)
18131817
endfunction
18141818

1819+
function! s:VimLParser.parse_cmd_eval() abort
1820+
let node = s:Node(s:NODE_EVAL)
1821+
let node.pos = self.ea.cmdpos
1822+
let node.ea = self.ea
1823+
let node.left = self.parse_expr()
1824+
call self.add_node(node)
1825+
endfunction
1826+
18151827
function! s:VimLParser.parse_cmd_echo() abort
18161828
let node = s:Node(s:NODE_ECHO)
18171829
let node.pos = self.ea.cmdpos
@@ -2215,6 +2227,7 @@ let s:VimLParser.builtin_commands = [
22152227
\ {'name': 'endtry', 'minlen': 4, 'flags': 'TRLBAR|SBOXOK|CMDWIN', 'parser': 'parse_cmd_endtry'},
22162228
\ {'name': 'endwhile', 'minlen': 4, 'flags': 'TRLBAR|SBOXOK|CMDWIN', 'parser': 'parse_cmd_endwhile'},
22172229
\ {'name': 'enew', 'minlen': 3, 'flags': 'BANG|TRLBAR', 'parser': 'parse_cmd_common'},
2230+
\ {'name': 'eval', 'minlen': 4, 'flags': 'EXTRA|NOTRLCOM|SBOXOK|CMDWIN', 'parser': 'parse_cmd_eval'},
22182231
\ {'name': 'ex', 'minlen': 2, 'flags': 'BANG|FILE1|EDITCMD|ARGOPT|TRLBAR', 'parser': 'parse_cmd_common'},
22192232
\ {'name': 'execute', 'minlen': 3, 'flags': 'EXTRA|NOTRLCOM|SBOXOK|CMDWIN', 'parser': 'parse_cmd_execute'},
22202233
\ {'name': 'exit', 'minlen': 3, 'flags': 'RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN', 'parser': 'parse_cmd_common'},
@@ -4762,6 +4775,9 @@ function! s:Compiler.compile(node) abort
47624775
elseif a:node.type ==# s:NODE_EXCALL
47634776
call self.compile_excall(a:node)
47644777
return s:NIL
4778+
elseif a:node.type ==# s:NODE_EVAL
4779+
call self.compile_eval(a:node)
4780+
return s:NIL
47654781
elseif a:node.type ==# s:NODE_LET
47664782
call self.compile_let(a:node)
47674783
return s:NIL
@@ -4992,6 +5008,10 @@ function! s:Compiler.compile_excall(node) abort
49925008
call self.out('(call %s)', self.compile(a:node.left))
49935009
endfunction
49945010

5011+
function! s:Compiler.compile_eval(node) abort
5012+
call self.out('(eval %s)', self.compile(a:node.left))
5013+
endfunction
5014+
49955015
function! s:Compiler.compile_let(node) abort
49965016
let left = ''
49975017
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
@@ -14,6 +14,8 @@
1414
(echo a b c))
1515
(delfunction s:foo)
1616
(call (s:foo 1 2 3))
17+
(eval (filter odds 'v:val % 2'))
18+
(eval 42)
1719
(let = a (dict ("x" "y")))
1820
(let = (a b . c) (list 1 2 3))
1921
(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
@@ -18,6 +18,8 @@ for [a, b; c] in d
1818
endfor
1919
delfunction s:foo
2020
call s:foo(1, 2, 3)
21+
eval filter(odds, 'v:val % 2')
22+
eval 42
2123
let a = {"x": "y"}
2224
let [a, b; c] = [1, 2, 3]
2325
let [a, b; c] += [1, 2, 3]

0 commit comments

Comments
 (0)