/
scanner_command_edit.py
104 lines (81 loc) · 2.7 KB
/
scanner_command_edit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from .state import EOF
from .tokens import TokenEof
from .tokens_base import TOKEN_COMMAND_EDIT
from .tokens_base import TokenOfCommand
from Vintageous.ex.ex_error import ERR_INVALID_ARGUMENT
from Vintageous.ex import register_ex_command
plus_plus_translations = {
'ff': 'fileformat',
'bin': 'binary',
'enc': 'fileencoding',
'nobin': 'nobinary',
}
@register_ex_command('edit', 'e')
class TokenEdit(TokenOfCommand):
def __init__(self, params, *args, **kwargs):
super().__init__(params,
TOKEN_COMMAND_EDIT,
'edit', *args, **kwargs)
self.target_command = 'ex_edit'
@property
def plusplus(self):
return self.params ['++']
@property
def command(self):
return self.params ['cmd']
@property
def file_name(self):
return self.params ['file_name']
@property
def count(self):
return self.params ['count']
def scan_command_edit(state):
params = {
'++': None,
'cmd': None,
'file_name': None,
'count': None,
}
c = state.consume()
if c == EOF:
return None, [TokenEdit(params), TokenEof()]
bang = c == '!'
if not bang:
state.backup()
while True:
c = state.consume()
if c == EOF:
return None, [TokenEdit(params, forced=bang), TokenEof()]
if c == '+':
k = state.consume()
if k == '+':
state.ignore()
# TODO: expect_match should work with emit()
# http://vimdoc.sourceforge.net/htmldoc/editing.html#[++opt]
m = state.expect_match(
r'(?:f(?:ile)?f(?:ormat)?|(?:file)?enc(?:oding)?|(?:no)?bin(?:ary)?|bad|edit)(?=\s|$)',
lambda: VimError(ERR_INVALID_ARGUMENT))
name = m.group(0)
params['++'] = plus_plus_translations.get(name, name)
state.ignore()
raise NotImplementedError('param not implemented')
continue
state.backup()
state.ignore()
state.expect_match(r'.+$')
params['cmd'] = state.emit()
raise NotImplementedError('param not implemented')
continue
if c != ' ':
state.match(r'.*')
params['file_name'] = state.emit().strip()
state.skip(' ')
state.ignore()
continue
if c == '#':
state.ignore()
m = state.expect_match(r'\d+')
params['count'] = m.group(0)
raise NotImplementedError('param not implemented')
continue
return None, [TokenEdit(params, forced=bang), TokenEof()]