Skip to content

Commit 4dbfbd1

Browse files
authored
Merge pull request #190 from bfredl/oob
update to new get_lines/set_lines API
2 parents 1047bd8 + 87b5e53 commit 4dbfbd1

File tree

2 files changed

+32
-55
lines changed

2 files changed

+32
-55
lines changed

neovim/api/buffer.py

Lines changed: 25 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@
1010
basestring = str
1111

1212

13+
def adjust_index(idx, default=None):
14+
"""Convert from python indexing convention to nvim indexing convention."""
15+
if idx is None:
16+
return default
17+
elif idx < 0:
18+
return idx - 1
19+
else:
20+
return idx
21+
22+
1323
class Buffer(Remote):
1424

1525
"""A remote Nvim buffer."""
@@ -31,19 +41,13 @@ def __getitem__(self, idx):
3141
the whole buffer.
3242
"""
3343
if not isinstance(idx, slice):
34-
return self._session.request('buffer_get_line', self, idx)
35-
include_end = False
36-
start = idx.start
37-
end = idx.stop
38-
if start is None:
39-
start = 0
40-
if end is None:
41-
end = -1
42-
include_end = True
43-
return self._session.request('buffer_get_line_slice', self, start, end,
44-
True, include_end)
44+
i = adjust_index(idx)
45+
return self.request('buffer_get_lines', i, i + 1, True)[0]
46+
start = adjust_index(idx.start, 0)
47+
end = adjust_index(idx.stop, -1)
48+
return self.request('buffer_get_lines', start, end, False)
4549

46-
def __setitem__(self, idx, lines):
50+
def __setitem__(self, idx, item):
4751
"""Replace a buffer line or slice by integer index.
4852
4953
Like with `__getitem__`, indexes may be negative.
@@ -52,23 +56,13 @@ def __setitem__(self, idx, lines):
5256
the whole buffer.
5357
"""
5458
if not isinstance(idx, slice):
55-
if lines is None:
56-
return self._session.request('buffer_del_line', self, idx)
57-
else:
58-
return self._session.request('buffer_set_line', self, idx,
59-
lines)
60-
if lines is None:
61-
lines = []
62-
include_end = False
63-
start = idx.start
64-
end = idx.stop
65-
if start is None:
66-
start = 0
67-
if end is None:
68-
end = -1
69-
include_end = True
70-
return self._session.request('buffer_set_line_slice', self, start, end,
71-
True, include_end, lines)
59+
i = adjust_index(idx)
60+
lines = [item] if item is not None else []
61+
return self.request('buffer_set_lines', i, i + 1, True, lines)
62+
lines = item if item is not None else []
63+
start = adjust_index(idx.start, 0)
64+
end = adjust_index(idx.stop, -1)
65+
return self.request('buffer_set_lines', start, end, False, lines)
7266

7367
def __iter__(self):
7468
"""Iterate lines of a buffer.
@@ -87,26 +81,13 @@ def __delitem__(self, idx):
8781
8882
This is the same as __setitem__(idx, [])
8983
"""
90-
if not isinstance(idx, slice):
91-
self.__setitem__(idx, None)
92-
else:
93-
self.__setitem__(idx, [])
94-
95-
def get_line_slice(self, start, stop, start_incl, end_incl):
96-
"""More flexible wrapper for retrieving slices."""
97-
return self._session.request('buffer_get_line_slice', self, start,
98-
stop, start_incl, end_incl)
99-
100-
def set_line_slice(self, start, stop, start_incl, end_incl, lines):
101-
"""More flexible wrapper for replacing slices."""
102-
return self._session.request('buffer_set_line_slice', self, start,
103-
stop, start_incl, end_incl, lines)
84+
self.__setitem__(idx, None)
10485

10586
def append(self, lines, index=-1):
10687
"""Append a string or list of lines to the buffer."""
10788
if isinstance(lines, (basestring, bytes)):
10889
lines = [lines]
109-
return self._session.request('buffer_insert', self, index, lines)
90+
return self.request('buffer_set_lines', index, index, True, lines)
11091

11192
def mark(self, name):
11293
"""Return (row, col) tuple for a named mark."""

neovim/plugin/script_host.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,23 +96,21 @@ def python_do_range(self, start, stop, code):
9696
self._set_current_range(start, stop)
9797
nvim = self.nvim
9898
start -= 1
99-
stop -= 1
10099
fname = '_vim_pydo'
101100

102101
# define the function
103102
function_def = 'def %s(line, linenr):\n %s' % (fname, code,)
104103
exec(function_def, self.module.__dict__)
105104
# get the function
106105
function = self.module.__dict__[fname]
107-
while start <= stop:
106+
while start < stop:
108107
# Process batches of 5000 to avoid the overhead of making multiple
109108
# API calls for every line. Assuming an average line length of 100
110109
# bytes, approximately 488 kilobytes will be transferred per batch,
111110
# which can be done very quickly in a single API call.
112111
sstart = start
113112
sstop = min(start + 5000, stop)
114-
lines = nvim.current.buffer.get_line_slice(sstart, sstop, True,
115-
True)
113+
lines = nvim.current.buffer.api.get_lines(sstart, sstop, True)
116114

117115
exception = None
118116
newlines = []
@@ -123,9 +121,8 @@ def python_do_range(self, start, stop, code):
123121
# Update earlier lines, and skip to the next
124122
if newlines:
125123
end = sstart + len(newlines) - 1
126-
nvim.current.buffer.set_line_slice(sstart, end,
127-
True, True,
128-
newlines)
124+
nvim.current.buffer.api.set_lines(sstart, end,
125+
True, newlines)
129126
sstart += len(newlines) + 1
130127
newlines = []
131128
pass
@@ -138,11 +135,10 @@ def python_do_range(self, start, stop, code):
138135
break
139136
linenr += 1
140137

141-
start = sstop + 1
138+
start = sstop
142139
if newlines:
143-
end = sstart + len(newlines) - 1
144-
nvim.current.buffer.set_line_slice(sstart, end, True, True,
145-
newlines)
140+
end = sstart + len(newlines)
141+
nvim.current.buffer.api.set_lines(sstart, end, True, newlines)
146142
if exception:
147143
raise exception
148144
# delete the function

0 commit comments

Comments
 (0)