Skip to content

Commit 21af5e0

Browse files
committed
Fix wincmd (Vimjas/vint#148)
1 parent 26787cc commit 21af5e0

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

autoload/vimlparser.vim

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1766,6 +1766,29 @@ function! s:VimLParser.ends_excmds(c)
17661766
return a:c ==# '' || a:c ==# '|' || a:c ==# '"' || a:c ==# '<EOF>' || a:c ==# '<EOL>'
17671767
endfunction
17681768

1769+
" FIXME: validate argument
1770+
function! s:VimLParser.parse_wincmd()
1771+
let c = self.reader.getn(1)
1772+
if c ==# ''
1773+
throw s:Err('E471: Argument required', self.reader.getpos())
1774+
elseif c ==# 'g' || c ==# "\x07" " <C-G>
1775+
let c2 = self.reader.getn(1)
1776+
if c2 ==# '' || s:iswhite(c2)
1777+
throw s:Err('E474: Invalid Argument', self.reader.getpos())
1778+
endif
1779+
endif
1780+
let end = self.reader.getpos()
1781+
call self.reader.skip_white()
1782+
if !self.ends_excmds(self.reader.peek())
1783+
throw s:Err('E474: Invalid Argument', self.reader.getpos())
1784+
endif
1785+
let node = s:Node(s:NODE_EXCMD)
1786+
let node.pos = self.ea.cmdpos
1787+
let node.ea = self.ea
1788+
let node.str = self.reader.getstr(self.ea.linepos, end)
1789+
call self.add_node(node)
1790+
endfunction
1791+
17691792
let s:VimLParser.builtin_commands = [
17701793
\ {'name': 'append', 'minlen': 1, 'flags': 'BANG|RANGE|ZEROR|TRLBAR|CMDWIN|MODIFY', 'parser': 'parse_cmd_append'},
17711794
\ {'name': 'abbreviate', 'minlen': 2, 'flags': 'EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN', 'parser': 'parse_cmd_common'},
@@ -2256,7 +2279,7 @@ let s:VimLParser.builtin_commands = [
22562279
\ {'name': 'wall', 'minlen': 2, 'flags': 'BANG|TRLBAR|CMDWIN', 'parser': 'parse_cmd_common'},
22572280
\ {'name': 'while', 'minlen': 2, 'flags': 'EXTRA|NOTRLCOM|SBOXOK|CMDWIN', 'parser': 'parse_cmd_while'},
22582281
\ {'name': 'winsize', 'minlen': 2, 'flags': 'EXTRA|NEEDARG|TRLBAR', 'parser': 'parse_cmd_common'},
2259-
\ {'name': 'wincmd', 'minlen': 4, 'flags': 'NEEDARG|WORD1|RANGE|NOTADR', 'parser': 'parse_cmd_common'},
2282+
\ {'name': 'wincmd', 'minlen': 4, 'flags': 'NEEDARG|WORD1|RANGE|NOTADR', 'parser': 'parse_wincmd'},
22602283
\ {'name': 'winpos', 'minlen': 4, 'flags': 'EXTRA|TRLBAR|CMDWIN', 'parser': 'parse_cmd_common'},
22612284
\ {'name': 'wnext', 'minlen': 2, 'flags': 'RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR', 'parser': 'parse_cmd_common'},
22622285
\ {'name': 'wprevious', 'minlen': 2, 'flags': 'RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR', 'parser': 'parse_cmd_common'},

test/test_wincmd.ok

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
(if 1
2+
(excmd "wincmd p"))

test/test_wincmd.vim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
if 1 | wincmd p | endif

0 commit comments

Comments
 (0)