def _execute_action( self, action, context, additional_locals={} ): mark_to_use = '`' with _vim.save_mark(mark_to_use): _vim.set_mark_from_pos(mark_to_use, _vim.get_cursor_pos()) cursor_line_before = _vim.buf.line_till_cursor locals = { 'context': context, } locals.update(additional_locals) snip = self._eval_code(action, locals) if snip.cursor.is_set(): vim.current.window.cursor = snip.cursor.to_vim_cursor() else: new_mark_pos = _vim.get_mark_pos(mark_to_use) cursor_invalid = False if _vim._is_pos_zero(new_mark_pos): cursor_invalid = True else: _vim.set_cursor_from_pos(new_mark_pos) if cursor_line_before != _vim.buf.line_till_cursor: cursor_invalid = True if cursor_invalid: raise RuntimeError( 'line under the cursor was modified, but ' + '"snip.cursor" variable is not set; either set set ' + '"snip.cursor" to new cursor position, or do not ' + 'modify cursor line' ) return snip