2017-01-18 11:10:12,208 [DEBUG @ msgpack_stream.py:send:33] 4117 - sent [0, 1, 'vim_get_api_info', ()] 2017-01-18 11:10:12,208 [DEBUG @ base.py:send:113] 4117 - Sending 'vim_get_api_info' 2017-01-18 11:10:12,209 [DEBUG @ base.py:run:138] 4117 - Entering event loop 2017-01-18 11:10:12,209 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,209 [DEBUG @ msgpack_stream.py:_on_data:56] 4117 - received message: [0, 1, 'poll', []] 2017-01-18 11:10:12,209 [DEBUG @ async_session.py:_on_request:86] 4117 - received request: poll, [] 2017-01-18 11:10:12,209 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,209 [DEBUG @ msgpack_stream.py:_on_data:59] 4117 - unpacker needs more data... 2017-01-18 11:10:12,209 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,209 [DEBUG @ msgpack_stream.py:_on_data:56] 4117 - received message: [1, 1, None, [2, {'functions': [{'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_line_count'}, {'name': 'buffer_get_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_set_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index'], ['String', 'line']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_del_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_get_line_slice', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'include_start'], ['Boolean', 'include_end']], 'since': 0, 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'method': False}, {'return_type': 'ArrayOf(String)', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing']], 'name': 'nvim_buf_get_lines'}, {'name': 'buffer_set_line_slice', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'include_start'], ['Boolean', 'include_end'], ['ArrayOf(String)', 'replacement']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing'], ['ArrayOf(String)', 'replacement']], 'name': 'nvim_buf_set_lines'}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_get_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_buf_set_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_del_var'}, {'name': 'buffer_set_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_del_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_get_option'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_buf_set_option'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_get_number'}, {'return_type': 'String', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_get_name'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_set_name'}, {'return_type': 'Boolean', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_is_valid'}, {'name': 'buffer_insert', 'parameters': [['Buffer', 'buffer'], ['Integer', 'lnum'], ['ArrayOf(String)', 'lines']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'return_type': 'ArrayOf(Integer, 2)', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_get_mark'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['String', 'hl_group'], ['Integer', 'line'], ['Integer', 'col_start'], ['Integer', 'col_end']], 'name': 'nvim_buf_add_highlight'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['Integer', 'line_start'], ['Integer', 'line_end']], 'name': 'nvim_buf_clear_highlight'}, {'return_type': 'ArrayOf(Window)', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_list_wins'}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'name': 'nvim_tabpage_get_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_tabpage_set_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'name': 'nvim_tabpage_del_var'}, {'name': 'tabpage_set_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'tabpage_del_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Window', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_get_win'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_get_number'}, {'return_type': 'Boolean', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_is_valid'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Integer', 'width'], ['Integer', 'height'], ['Dictionary', 'options']], 'name': 'nvim_ui_attach'}, {'name': 'ui_attach', 'parameters': [['Integer', 'width'], ['Integer', 'height'], ['Boolean', 'enable_rgb']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_ui_detach'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Integer', 'width'], ['Integer', 'height']], 'name': 'nvim_ui_try_resize'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name'], ['Object', 'value']], 'name': 'nvim_ui_set_option'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'command']], 'name': 'nvim_command'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'keys'], ['String', 'mode'], ['Boolean', 'escape_csi']], 'name': 'nvim_feedkeys'}, {'return_type': 'Integer', 'since': 1, 'method': False, 'parameters': [['String', 'keys']], 'name': 'nvim_input'}, {'return_type': 'String', 'since': 1, 'method': False, 'parameters': [['String', 'str'], ['Boolean', 'from_part'], ['Boolean', 'do_lt'], ['Boolean', 'special']], 'name': 'nvim_replace_termcodes'}, {'return_type': 'String', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_command_output'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'expr']], 'name': 'nvim_eval'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'fname'], ['Array', 'args']], 'name': 'nvim_call_function'}, {'return_type': 'Integer', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_strwidth'}, {'return_type': 'ArrayOf(String)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_runtime_paths'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'dir']], 'name': 'nvim_set_current_dir'}, {'return_type': 'String', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_line'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'line']], 'name': 'nvim_set_current_line'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_del_current_line'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_var'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name'], ['Object', 'value']], 'name': 'nvim_set_var'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_del_var'}, {'name': 'vim_set_var', 'parameters': [['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_del_var', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_vvar'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_option'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name'], ['Object', 'value']], 'name': 'nvim_set_option'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_out_write'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_err_write'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_err_writeln'}, {'return_type': 'ArrayOf(Buffer)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_bufs'}, {'return_type': 'Buffer', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_buf'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_set_current_buf'}, {'return_type': 'ArrayOf(Window)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_wins'}, {'return_type': 'Window', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_win'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Window', 'window']], 'name': 'nvim_set_current_win'}, {'return_type': 'ArrayOf(Tabpage)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_tabpages'}, {'return_type': 'Tabpage', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_tabpage'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_set_current_tabpage'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'event']], 'name': 'nvim_subscribe'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'event']], 'name': 'nvim_unsubscribe'}, {'return_type': 'Integer', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_color_by_name'}, {'return_type': 'Dictionary', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_color_map'}, {'return_type': 'Array', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_api_info'}, {'return_type': 'Array', 'since': 1, 'method': False, 'parameters': [['Array', 'calls']], 'name': 'nvim_call_atomic'}, {'return_type': 'Buffer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_buf'}, {'return_type': 'ArrayOf(Integer, 2)', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_cursor'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['ArrayOf(Integer, 2)', 'pos']], 'name': 'nvim_win_set_cursor'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_height'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['Integer', 'height']], 'name': 'nvim_win_set_height'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_width'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['Integer', 'width']], 'name': 'nvim_win_set_width'}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name']], 'name': 'nvim_win_get_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_win_set_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name']], 'name': 'nvim_win_del_var'}, {'name': 'window_set_var', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'window_del_var', 'parameters': [['Window', 'window'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name']], 'name': 'nvim_win_get_option'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_win_set_option'}, {'return_type': 'ArrayOf(Integer, 2)', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_position'}, {'return_type': 'Tabpage', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_tabpage'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_number'}, {'return_type': 'Boolean', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_is_valid'}, {'name': 'buffer_line_count', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing']], 'since': 0, 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_set_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing'], ['ArrayOf(String)', 'replacement']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_set_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_number', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_name', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_set_name', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_is_valid', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'Boolean', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_mark', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_add_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['String', 'hl_group'], ['Integer', 'line'], ['Integer', 'col_start'], ['Integer', 'col_end']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_clear_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['Integer', 'line_start'], ['Integer', 'line_end']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_get_windows', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'ArrayOf(Window)', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_get_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_get_window', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'Window', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_is_valid', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'Boolean', 'deprecated_since': 1, 'method': True}, {'name': 'ui_detach', 'parameters': [], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'ui_try_resize', 'parameters': [['Integer', 'width'], ['Integer', 'height']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_command', 'parameters': [['String', 'command']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_feedkeys', 'parameters': [['String', 'keys'], ['String', 'mode'], ['Boolean', 'escape_csi']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_input', 'parameters': [['String', 'keys']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_replace_termcodes', 'parameters': [['String', 'str'], ['Boolean', 'from_part'], ['Boolean', 'do_lt'], ['Boolean', 'special']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'vim_command_output', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'vim_eval', 'parameters': [['String', 'expr']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_call_function', 'parameters': [['String', 'fname'], ['Array', 'args']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_strwidth', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_list_runtime_paths', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_change_directory', 'parameters': [['String', 'dir']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_line', 'parameters': [], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_line', 'parameters': [['String', 'line']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_del_current_line', 'parameters': [], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_var', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_vvar', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_option', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_option', 'parameters': [['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_out_write', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_err_write', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_report_error', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_buffers', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(Buffer)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_buffer', 'parameters': [], 'since': 0, 'return_type': 'Buffer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_buffer', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_windows', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(Window)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_window', 'parameters': [], 'since': 0, 'return_type': 'Window', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_window', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_tabpages', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(Tabpage)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_tabpage', 'parameters': [], 'since': 0, 'return_type': 'Tabpage', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_tabpage', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_subscribe', 'parameters': [['String', 'event']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_unsubscribe', 'parameters': [['String', 'event']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_name_to_color', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_color_map', 'parameters': [], 'since': 0, 'return_type': 'Dictionary', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_api_info', 'parameters': [], 'since': 0, 'return_type': 'Array', 'deprecated_since': 1, 'method': False}, {'name': 'window_get_buffer', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Buffer', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_cursor', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_cursor', 'parameters': [['Window', 'window'], ['ArrayOf(Integer, 2)', 'pos']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_height', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_height', 'parameters': [['Window', 'window'], ['Integer', 'height']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_width', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_width', 'parameters': [['Window', 'window'], ['Integer', 'width']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_var', 'parameters': [['Window', 'window'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_option', 'parameters': [['Window', 'window'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_option', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_position', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_tabpage', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Tabpage', 'deprecated_since': 1, 'method': True}, {'name': 'window_is_valid', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Boolean', 'deprecated_since': 1, 'method': True}], 'version': {'major': 0, 'api_prerelease': False, 'api_compatible': 0, 'patch': 7, 'minor': 1, 'api_level': 1}, 'types': {'Buffer': {'prefix': 'nvim_buf_', 'id': 0}, 'Window': {'prefix': 'nvim_win_', 'id': 1}, 'Tabpage': {'prefix': 'nvim_tabpage_', 'id': 2}}, 'error_types': {'Exception': {'id': 0}, 'Validation': {'id': 1}}}]] 2017-01-18 11:10:12,210 [DEBUG @ async_session.py:_on_response:95] 4117 - received response: None, [2, {'functions': [{'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_line_count'}, {'name': 'buffer_get_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_set_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index'], ['String', 'line']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_del_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_get_line_slice', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'include_start'], ['Boolean', 'include_end']], 'since': 0, 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'method': False}, {'return_type': 'ArrayOf(String)', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing']], 'name': 'nvim_buf_get_lines'}, {'name': 'buffer_set_line_slice', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'include_start'], ['Boolean', 'include_end'], ['ArrayOf(String)', 'replacement']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing'], ['ArrayOf(String)', 'replacement']], 'name': 'nvim_buf_set_lines'}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_get_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_buf_set_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_del_var'}, {'name': 'buffer_set_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'buffer_del_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_get_option'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_buf_set_option'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_get_number'}, {'return_type': 'String', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_get_name'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_set_name'}, {'return_type': 'Boolean', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_buf_is_valid'}, {'name': 'buffer_insert', 'parameters': [['Buffer', 'buffer'], ['Integer', 'lnum'], ['ArrayOf(String)', 'lines']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'return_type': 'ArrayOf(Integer, 2)', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'name': 'nvim_buf_get_mark'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['String', 'hl_group'], ['Integer', 'line'], ['Integer', 'col_start'], ['Integer', 'col_end']], 'name': 'nvim_buf_add_highlight'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['Integer', 'line_start'], ['Integer', 'line_end']], 'name': 'nvim_buf_clear_highlight'}, {'return_type': 'ArrayOf(Window)', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_list_wins'}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'name': 'nvim_tabpage_get_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_tabpage_set_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'name': 'nvim_tabpage_del_var'}, {'name': 'tabpage_set_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'tabpage_del_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Window', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_get_win'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_get_number'}, {'return_type': 'Boolean', 'since': 1, 'method': True, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_tabpage_is_valid'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Integer', 'width'], ['Integer', 'height'], ['Dictionary', 'options']], 'name': 'nvim_ui_attach'}, {'name': 'ui_attach', 'parameters': [['Integer', 'width'], ['Integer', 'height'], ['Boolean', 'enable_rgb']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_ui_detach'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Integer', 'width'], ['Integer', 'height']], 'name': 'nvim_ui_try_resize'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name'], ['Object', 'value']], 'name': 'nvim_ui_set_option'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'command']], 'name': 'nvim_command'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'keys'], ['String', 'mode'], ['Boolean', 'escape_csi']], 'name': 'nvim_feedkeys'}, {'return_type': 'Integer', 'since': 1, 'method': False, 'parameters': [['String', 'keys']], 'name': 'nvim_input'}, {'return_type': 'String', 'since': 1, 'method': False, 'parameters': [['String', 'str'], ['Boolean', 'from_part'], ['Boolean', 'do_lt'], ['Boolean', 'special']], 'name': 'nvim_replace_termcodes'}, {'return_type': 'String', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_command_output'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'expr']], 'name': 'nvim_eval'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'fname'], ['Array', 'args']], 'name': 'nvim_call_function'}, {'return_type': 'Integer', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_strwidth'}, {'return_type': 'ArrayOf(String)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_runtime_paths'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'dir']], 'name': 'nvim_set_current_dir'}, {'return_type': 'String', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_line'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'line']], 'name': 'nvim_set_current_line'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_del_current_line'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_var'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name'], ['Object', 'value']], 'name': 'nvim_set_var'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_del_var'}, {'name': 'vim_set_var', 'parameters': [['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_del_var', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_vvar'}, {'return_type': 'Object', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_option'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'name'], ['Object', 'value']], 'name': 'nvim_set_option'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_out_write'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_err_write'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'str']], 'name': 'nvim_err_writeln'}, {'return_type': 'ArrayOf(Buffer)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_bufs'}, {'return_type': 'Buffer', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_buf'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Buffer', 'buffer']], 'name': 'nvim_set_current_buf'}, {'return_type': 'ArrayOf(Window)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_wins'}, {'return_type': 'Window', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_win'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Window', 'window']], 'name': 'nvim_set_current_win'}, {'return_type': 'ArrayOf(Tabpage)', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_list_tabpages'}, {'return_type': 'Tabpage', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_current_tabpage'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['Tabpage', 'tabpage']], 'name': 'nvim_set_current_tabpage'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'event']], 'name': 'nvim_subscribe'}, {'return_type': 'void', 'since': 1, 'method': False, 'parameters': [['String', 'event']], 'name': 'nvim_unsubscribe'}, {'return_type': 'Integer', 'since': 1, 'method': False, 'parameters': [['String', 'name']], 'name': 'nvim_get_color_by_name'}, {'return_type': 'Dictionary', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_color_map'}, {'return_type': 'Array', 'since': 1, 'method': False, 'parameters': [], 'name': 'nvim_get_api_info'}, {'return_type': 'Array', 'since': 1, 'method': False, 'parameters': [['Array', 'calls']], 'name': 'nvim_call_atomic'}, {'return_type': 'Buffer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_buf'}, {'return_type': 'ArrayOf(Integer, 2)', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_cursor'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['ArrayOf(Integer, 2)', 'pos']], 'name': 'nvim_win_set_cursor'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_height'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['Integer', 'height']], 'name': 'nvim_win_set_height'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_width'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['Integer', 'width']], 'name': 'nvim_win_set_width'}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name']], 'name': 'nvim_win_get_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_win_set_var'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name']], 'name': 'nvim_win_del_var'}, {'name': 'window_set_var', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'window_del_var', 'parameters': [['Window', 'window'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'return_type': 'Object', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name']], 'name': 'nvim_win_get_option'}, {'return_type': 'void', 'since': 1, 'method': True, 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'name': 'nvim_win_set_option'}, {'return_type': 'ArrayOf(Integer, 2)', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_position'}, {'return_type': 'Tabpage', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_tabpage'}, {'return_type': 'Integer', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_get_number'}, {'return_type': 'Boolean', 'since': 1, 'method': True, 'parameters': [['Window', 'window']], 'name': 'nvim_win_is_valid'}, {'name': 'buffer_line_count', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing']], 'since': 0, 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_set_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing'], ['ArrayOf(String)', 'replacement']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_set_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_number', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_name', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_set_name', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_is_valid', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'Boolean', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_get_mark', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'since': 0, 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_add_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['String', 'hl_group'], ['Integer', 'line'], ['Integer', 'col_start'], ['Integer', 'col_end']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'buffer_clear_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['Integer', 'line_start'], ['Integer', 'line_end']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_get_windows', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'ArrayOf(Window)', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_get_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_get_window', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'Window', 'deprecated_since': 1, 'method': True}, {'name': 'tabpage_is_valid', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'Boolean', 'deprecated_since': 1, 'method': True}, {'name': 'ui_detach', 'parameters': [], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'ui_try_resize', 'parameters': [['Integer', 'width'], ['Integer', 'height']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_command', 'parameters': [['String', 'command']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_feedkeys', 'parameters': [['String', 'keys'], ['String', 'mode'], ['Boolean', 'escape_csi']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_input', 'parameters': [['String', 'keys']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_replace_termcodes', 'parameters': [['String', 'str'], ['Boolean', 'from_part'], ['Boolean', 'do_lt'], ['Boolean', 'special']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'vim_command_output', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'vim_eval', 'parameters': [['String', 'expr']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_call_function', 'parameters': [['String', 'fname'], ['Array', 'args']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_strwidth', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_list_runtime_paths', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_change_directory', 'parameters': [['String', 'dir']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_line', 'parameters': [], 'since': 0, 'return_type': 'String', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_line', 'parameters': [['String', 'line']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_del_current_line', 'parameters': [], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_var', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_vvar', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_option', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_option', 'parameters': [['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_out_write', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_err_write', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_report_error', 'parameters': [['String', 'str']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_buffers', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(Buffer)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_buffer', 'parameters': [], 'since': 0, 'return_type': 'Buffer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_buffer', 'parameters': [['Buffer', 'buffer']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_windows', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(Window)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_window', 'parameters': [], 'since': 0, 'return_type': 'Window', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_window', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_tabpages', 'parameters': [], 'since': 0, 'return_type': 'ArrayOf(Tabpage)', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_current_tabpage', 'parameters': [], 'since': 0, 'return_type': 'Tabpage', 'deprecated_since': 1, 'method': False}, {'name': 'vim_set_current_tabpage', 'parameters': [['Tabpage', 'tabpage']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_subscribe', 'parameters': [['String', 'event']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_unsubscribe', 'parameters': [['String', 'event']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': False}, {'name': 'vim_name_to_color', 'parameters': [['String', 'name']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_color_map', 'parameters': [], 'since': 0, 'return_type': 'Dictionary', 'deprecated_since': 1, 'method': False}, {'name': 'vim_get_api_info', 'parameters': [], 'since': 0, 'return_type': 'Array', 'deprecated_since': 1, 'method': False}, {'name': 'window_get_buffer', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Buffer', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_cursor', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_cursor', 'parameters': [['Window', 'window'], ['ArrayOf(Integer, 2)', 'pos']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_height', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_height', 'parameters': [['Window', 'window'], ['Integer', 'height']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_width', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Integer', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_width', 'parameters': [['Window', 'window'], ['Integer', 'width']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_var', 'parameters': [['Window', 'window'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_option', 'parameters': [['Window', 'window'], ['String', 'name']], 'since': 0, 'return_type': 'Object', 'deprecated_since': 1, 'method': True}, {'name': 'window_set_option', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'since': 0, 'return_type': 'void', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_position', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'method': True}, {'name': 'window_get_tabpage', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Tabpage', 'deprecated_since': 1, 'method': True}, {'name': 'window_is_valid', 'parameters': [['Window', 'window']], 'since': 0, 'return_type': 'Boolean', 'deprecated_since': 1, 'method': True}], 'version': {'major': 0, 'api_prerelease': False, 'api_compatible': 0, 'patch': 7, 'minor': 1, 'api_level': 1}, 'types': {'Buffer': {'prefix': 'nvim_buf_', 'id': 0}, 'Window': {'prefix': 'nvim_win_', 'id': 1}, 'Tabpage': {'prefix': 'nvim_tabpage_', 'id': 2}}, 'error_types': {'Exception': {'id': 0}, 'Validation': {'id': 1}}}] 2017-01-18 11:10:12,210 [DEBUG @ base.py:stop:149] 4117 - Stopped event loop 2017-01-18 11:10:12,210 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,210 [DEBUG @ msgpack_stream.py:_on_data:59] 4117 - unpacker needs more data... 2017-01-18 11:10:12,210 [DEBUG @ base.py:run:140] 4117 - Exited event loop 2017-01-18 11:10:12,211 [INFO @ script_host.py:setup:52] 4117 - install import hook/path 2017-01-18 11:10:12,211 [INFO @ script_host.py:setup:57] 4117 - redirect sys.stdout and sys.stderr 2017-01-18 11:10:12,211 [DEBUG @ session.py:_on_request:201] 4117 - received rpc request, greenlet will handle it 2017-01-18 11:10:12,211 [DEBUG @ host.py:_on_request:91] 4117 - calling request handler for "poll", args: "[]" 2017-01-18 11:10:12,211 [DEBUG @ host.py:_on_request:93] 4117 - request handler for 'poll []' returns: ok 2017-01-18 11:10:12,211 [DEBUG @ session.py:handler:187] 4117 - greenlet finished executing, sending ok as response 2017-01-18 11:10:12,211 [DEBUG @ async_session.py:send:133] 4117 - sending response to request 1: [1, 1, None, 'ok'] 2017-01-18 11:10:12,211 [DEBUG @ msgpack_stream.py:send:33] 4117 - sent [1, 1, None, 'ok'] 2017-01-18 11:10:12,211 [DEBUG @ base.py:send:113] 4117 - Sending 'ok' 2017-01-18 11:10:12,211 [DEBUG @ session.py:handler:197] 4117 - greenlet is now dying... 2017-01-18 11:10:12,211 [DEBUG @ base.py:run:138] 4117 - Entering event loop 2017-01-18 11:10:12,212 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,212 [DEBUG @ msgpack_stream.py:_on_data:56] 4117 - received message: [0, 2, 'python_execute', ['import sys, tokenize, cStringIO, types\nfrom token import NAME, DEDENT, NEWLINE, STRING\n\ndebugstmts=[]\ndef dbg(s): debugstmts.append(s)\ndef showdbg():\n for d in debugstmts: print "DBG: %s " % d\n\ndef vimcomplete(context,match):\n global debugstmts\n debugstmts = []\n try:\n import vim\n def complsort(x,y):\n try:\n xa = x[\'abbr\']\n ya = y[\'abbr\']\n if xa[0] == \'_\':\n if xa[1] == \'_\' and ya[0:2] == \'__\':\n return xa > ya\n elif ya[0:2] == \'__\':\n return -1\n elif y[0] == \'_\':\n return xa > ya\n else:\n return 1\n elif ya[0] == \'_\':\n return -1\n else:\n return xa > ya\n except:\n return 0\n cmpl = Completer()\n cmpl.evalsource(\'\\n\'.join(vim.current.buffer),vim.eval("line(\'.\')"))\n all = cmpl.get_completions(context,match)\n all.sort(complsort)\n dictstr = \'[\'\n # have to do this for double quoting\n for cmpl in all:\n dictstr += \'{\'\n for x in cmpl: dictstr += \'"%s":"%s",\' % (x,cmpl[x])\n dictstr += \'"icase":0},\'\n if dictstr[-1] == \',\': dictstr = dictstr[:-1]\n dictstr += \']\'\n #dbg("dict: %s" % dictstr)\n vim.command("silent let g:pythoncomplete_completions = %s" % dictstr)\n #dbg("Completion dict:\\n%s" % all)\n except vim.error:\n dbg("VIM Error: %s" % vim.error)\n\nclass Completer(object):\n def __init__(self):\n self.compldict = {}\n self.parser = PyParser()\n\n def evalsource(self,text,line=0):\n sc = self.parser.parse(text,line)\n src = sc.get_code()\n dbg("source: %s" % src)\n try: exec(src) in self.compldict\n except: dbg("parser: %s, %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n for l in sc.locals:\n try: exec(l) in self.compldict\n except: dbg("locals: %s, %s [%s]" % (sys.exc_info()[0],sys.exc_info()[1],l))\n\n def _cleanstr(self,doc):\n return doc.replace(\'"\',\' \').replace("\'",\' \')\n\n def get_arguments(self,func_obj):\n def _ctor(obj):\n try: return class_ob.__init__.im_func\n except AttributeError:\n for base in class_ob.__bases__:\n rc = _find_constructor(base)\n if rc is not None: return rc\n return None\n\n arg_offset = 1\n if type(func_obj) == types.ClassType: func_obj = _ctor(func_obj)\n elif type(func_obj) == types.MethodType: func_obj = func_obj.im_func\n else: arg_offset = 0\n \n arg_text=\'\'\n if type(func_obj) in [types.FunctionType, types.LambdaType]:\n try:\n cd = func_obj.func_code\n real_args = cd.co_varnames[arg_offset:cd.co_argcount]\n defaults = func_obj.func_defaults or \'\'\n defaults = map(lambda name: "=%s" % name, defaults)\n defaults = [""] * (len(real_args)-len(defaults)) + defaults\n items = map(lambda a,d: a+d, real_args, defaults)\n if func_obj.func_code.co_flags & 0x4:\n items.append("...")\n if func_obj.func_code.co_flags & 0x8:\n items.append("***")\n arg_text = (\',\'.join(items)) + \')\'\n\n except:\n dbg("arg completion: %s: %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n pass\n if len(arg_text) == 0:\n # The doc string sometimes contains the function signature\n # this works for alot of C modules that are part of the\n # standard library\n doc = func_obj.__doc__\n if doc:\n doc = doc.lstrip()\n pos = doc.find(\'\\n\')\n if pos > 0:\n sigline = doc[:pos]\n lidx = sigline.find(\'(\')\n ridx = sigline.find(\')\')\n if lidx > 0 and ridx > 0:\n arg_text = sigline[lidx+1:ridx] + \')\'\n if len(arg_text) == 0: arg_text = \')\'\n return arg_text\n\n def get_completions(self,context,match):\n dbg("get_completions(\'%s\',\'%s\')" % (context,match))\n stmt = \'\'\n if context: stmt += str(context)\n if match: stmt += str(match)\n try:\n result = None\n all = {}\n ridx = stmt.rfind(\'.\')\n if len(stmt) > 0 and stmt[-1] == \'(\':\n result = eval(_sanitize(stmt[:-1]), self.compldict)\n doc = result.__doc__\n if doc is None: doc = \'\'\n args = self.get_arguments(result)\n return [{\'word\':self._cleanstr(args),\'info\':self._cleanstr(doc)}]\n elif ridx == -1:\n match = stmt\n all = self.compldict\n else:\n match = stmt[ridx+1:]\n stmt = _sanitize(stmt[:ridx])\n result = eval(stmt, self.compldict)\n all = dir(result)\n\n dbg("completing: stmt:%s" % stmt)\n completions = []\n\n try: maindoc = result.__doc__\n except: maindoc = \' \'\n if maindoc is None: maindoc = \' \'\n for m in all:\n if m == "_PyCmplNoType": continue #this is internal\n try:\n dbg(\'possible completion: %s\' % m)\n if m.find(match) == 0:\n if result is None: inst = all[m]\n else: inst = getattr(result,m)\n try: doc = inst.__doc__\n except: doc = maindoc\n typestr = str(inst)\n if doc is None or doc == \'\': doc = maindoc\n\n wrd = m[len(match):]\n c = {\'word\':wrd, \'abbr\':m, \'info\':self._cleanstr(doc)}\n if "function" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "method" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "module" in typestr:\n c[\'word\'] += \'.\'\n elif "class" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\'\n completions.append(c)\n except:\n i = sys.exc_info()\n dbg("inner completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return completions\n except:\n i = sys.exc_info()\n dbg("completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return []\n\nclass Scope(object):\n def __init__(self,name,indent,docstr=\'\'):\n self.subscopes = []\n self.docstr = docstr\n self.locals = []\n self.parent = None\n self.name = name\n self.indent = indent\n\n def add(self,sub):\n #print \'push scope: [%s@%s]\' % (sub.name,sub.indent)\n sub.parent = self\n self.subscopes.append(sub)\n return sub\n\n def doc(self,str):\n """ Clean up a docstring """\n d = str.replace(\'\\n\',\' \')\n d = d.replace(\'\\t\',\' \')\n while d.find(\' \') > -1: d = d.replace(\' \',\' \')\n while d[0] in \'"\\\'\\t \': d = d[1:]\n while d[-1] in \'"\\\'\\t \': d = d[:-1]\n dbg("Scope(%s)::docstr = %s" % (self,d))\n self.docstr = d\n\n def local(self,loc):\n self._checkexisting(loc)\n self.locals.append(loc)\n\n def copy_decl(self,indent=0):\n """ Copy a scope\'s declaration only, at the specified indent level - not local variables """\n return Scope(self.name,indent,self.docstr)\n\n def _checkexisting(self,test):\n "Convienance function... keep out duplicates"\n if test.find(\'=\') > -1:\n var = test.split(\'=\')[0].strip()\n for l in self.locals:\n if l.find(\'=\') > -1 and var == l.split(\'=\')[0].strip():\n self.locals.remove(l)\n\n def get_code(self):\n str = ""\n if len(self.docstr) > 0: str += \'"""\'+self.docstr+\'"""\\n\'\n for l in self.locals:\n if l.startswith(\'import\'): str += l+\'\\n\'\n str += \'class _PyCmplNoType:\\n def __getattr__(self,name):\\n return None\\n\'\n for sub in self.subscopes:\n str += sub.get_code()\n for l in self.locals:\n if not l.startswith(\'import\'): str += l+\'\\n\'\n\n return str\n\n def pop(self,indent):\n #print \'pop scope: [%s] to [%s]\' % (self.indent,indent)\n outer = self\n while outer.parent != None and outer.indent >= indent:\n outer = outer.parent\n return outer\n\n def currentindent(self):\n #print \'parse current indent: %s\' % self.indent\n return \' \'*self.indent\n\n def childindent(self):\n #print \'parse child indent: [%s]\' % (self.indent+1)\n return \' \'*(self.indent+1)\n\nclass Class(Scope):\n def __init__(self, name, supers, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.supers = supers\n def copy_decl(self,indent=0):\n c = Class(self.name,self.supers,indent, self.docstr)\n for s in self.subscopes:\n c.add(s.copy_decl(indent+1))\n return c\n def get_code(self):\n str = \'%sclass %s\' % (self.currentindent(),self.name)\n if len(self.supers) > 0: str += \'(%s)\' % \',\'.join(self.supers)\n str += \':\\n\'\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n if len(self.subscopes) > 0:\n for s in self.subscopes: str += s.get_code()\n else:\n str += \'%spass\\n\' % self.childindent()\n return str\n\n\nclass Function(Scope):\n def __init__(self, name, params, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.params = params\n def copy_decl(self,indent=0):\n return Function(self.name,self.params,indent, self.docstr)\n def get_code(self):\n str = "%sdef %s(%s):\\n" % \\\n (self.currentindent(),self.name,\',\'.join(self.params))\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n str += "%spass\\n" % self.childindent()\n return str\n\nclass PyParser:\n def __init__(self):\n self.top = Scope(\'global\',0)\n self.scope = self.top\n self.parserline = 0\n\n def _parsedotname(self,pre=None):\n #returns (dottedname, nexttoken)\n name = []\n if pre is None:\n tokentype, token, indent = self.next()\n if tokentype != NAME and token != \'*\':\n return (\'\', token)\n else: token = pre\n name.append(token)\n while True:\n tokentype, token, indent = self.next()\n if token != \'.\': break\n tokentype, token, indent = self.next()\n if tokentype != NAME: break\n name.append(token)\n return (".".join(name), token)\n\n def _parseimportlist(self):\n imports = []\n while True:\n name, token = self._parsedotname()\n if not name: break\n name2 = \'\'\n if token == \'as\': name2, token = self._parsedotname()\n imports.append((name, name2))\n while token != "," and "\\n" not in token:\n tokentype, token, indent = self.next()\n if token != ",": break\n return imports\n\n def _parenparse(self):\n name = \'\'\n names = []\n level = 1\n while True:\n tokentype, token, indent = self.next()\n if token in (\')\', \',\') and level == 1:\n if \'=\' not in name: name = name.replace(\' \', \'\')\n names.append(name.strip())\n name = \'\'\n if token == \'(\':\n level += 1\n name += "("\n elif token == \')\':\n level -= 1\n if level == 0: break\n else: name += ")"\n elif token == \',\' and level == 1:\n pass\n else:\n name += "%s " % str(token)\n return names\n\n def _parsefunction(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, fname, ind = self.next()\n if tokentype != NAME: return None\n\n tokentype, open, ind = self.next()\n if open != \'(\': return None\n params=self._parenparse()\n\n tokentype, colon, ind = self.next()\n if colon != \':\': return None\n\n return Function(fname,params,indent)\n\n def _parseclass(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, cname, ind = self.next()\n if tokentype != NAME: return None\n\n super = []\n tokentype, next, ind = self.next()\n if next == \'(\':\n super=self._parenparse()\n elif next != \':\': return None\n\n return Class(cname,super,indent)\n\n def _parseassignment(self):\n assign=\'\'\n tokentype, token, indent = self.next()\n if tokentype == tokenize.STRING or token == \'str\': \n return \'""\'\n elif token == \'(\' or token == \'tuple\':\n return \'()\'\n elif token == \'[\' or token == \'list\':\n return \'[]\'\n elif token == \'{\' or token == \'dict\':\n return \'{}\'\n elif tokentype == tokenize.NUMBER:\n return \'0\'\n elif token == \'open\' or token == \'file\':\n return \'file\'\n elif token == \'None\':\n return \'_PyCmplNoType()\'\n elif token == \'type\':\n return \'type(_PyCmplNoType)\' #only for method resolution\n else:\n assign += token\n level = 0\n while True:\n tokentype, token, indent = self.next()\n if token in (\'(\',\'{\',\'[\'):\n level += 1\n elif token in (\']\',\'}\',\')\'):\n level -= 1\n if level == 0: break\n elif level == 0:\n if token in (\';\',\'\\n\'): break\n assign += token\n return "%s" % assign\n\n def next(self):\n type, token, (lineno, indent), end, self.parserline = self.gen.next()\n if lineno == self.curline:\n #print \'line found [%s] scope=%s\' % (line.replace(\'\\n\',\'\'),self.scope.name)\n self.currentscope = self.scope\n return (type, token, indent)\n\n def _adjustvisibility(self):\n newscope = Scope(\'result\',0)\n scp = self.currentscope\n while scp != None:\n if type(scp) == Function:\n slice = 0\n #Handle \'self\' params\n if scp.parent != None and type(scp.parent) == Class:\n slice = 1\n newscope.local(\'%s = %s\' % (scp.params[0],scp.parent.name))\n for p in scp.params[slice:]:\n i = p.find(\'=\')\n if len(p) == 0: continue\n pvar = \'\'\n ptype = \'\'\n if i == -1:\n pvar = p\n ptype = \'_PyCmplNoType()\'\n else:\n pvar = p[:i]\n ptype = _sanitize(p[i+1:])\n if pvar.startswith(\'**\'):\n pvar = pvar[2:]\n ptype = \'{}\'\n elif pvar.startswith(\'*\'):\n pvar = pvar[1:]\n ptype = \'[]\'\n\n newscope.local(\'%s = %s\' % (pvar,ptype))\n\n for s in scp.subscopes:\n ns = s.copy_decl(0)\n newscope.add(ns)\n for l in scp.locals: newscope.local(l)\n scp = scp.parent\n\n self.currentscope = newscope\n return self.currentscope\n\n #p.parse(vim.current.buffer[:],vim.eval("line(\'.\')"))\n def parse(self,text,curline=0):\n self.curline = int(curline)\n buf = cStringIO.StringIO(\'\'.join(text) + \'\\n\')\n self.gen = tokenize.generate_tokens(buf.readline)\n self.currentscope = self.scope\n\n try:\n freshscope=True\n while True:\n tokentype, token, indent = self.next()\n #dbg( \'main: token=[%s] indent=[%s]\' % (token,indent))\n\n if tokentype == DEDENT or token == "pass":\n self.scope = self.scope.pop(indent)\n elif token == \'def\':\n func = self._parsefunction(indent)\n if func is None:\n print "function: syntax error..."\n continue\n dbg("new scope: function")\n freshscope = True\n self.scope = self.scope.add(func)\n elif token == \'class\':\n cls = self._parseclass(indent)\n if cls is None:\n print "class: syntax error..."\n continue\n freshscope = True\n dbg("new scope: class")\n self.scope = self.scope.add(cls)\n \n elif token == \'import\':\n imports = self._parseimportlist()\n for mod, alias in imports:\n loc = "import %s" % mod\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif token == \'from\':\n mod, token = self._parsedotname()\n if not mod or token != "import":\n print "from: syntax error..."\n continue\n names = self._parseimportlist()\n for name, alias in names:\n loc = "from %s import %s" % (mod,name)\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif tokentype == STRING:\n if freshscope: self.scope.doc(token)\n elif tokentype == NAME:\n name,token = self._parsedotname(token) \n if token == \'=\':\n stmt = self._parseassignment()\n dbg("parseassignment: %s = %s" % (name, stmt))\n if stmt != None:\n self.scope.local("%s = %s" % (name,stmt))\n freshscope = False\n except StopIteration: #thrown on EOF\n pass\n except:\n dbg("parse error: %s, %s @ %s" %\n (sys.exc_info()[0], sys.exc_info()[1], self.parserline))\n return self._adjustvisibility()\n\ndef _sanitize(str):\n val = \'\'\n level = 0\n for c in str:\n if c in (\'(\',\'{\',\'[\'):\n level += 1\n elif c in (\']\',\'}\',\')\'):\n level -= 1\n elif level == 0:\n val += c\n return val\n\nsys.path.extend([\'.\',\'..\'])\n', 4, 4]] 2017-01-18 11:10:12,212 [DEBUG @ async_session.py:_on_request:86] 4117 - received request: python_execute, ['import sys, tokenize, cStringIO, types\nfrom token import NAME, DEDENT, NEWLINE, STRING\n\ndebugstmts=[]\ndef dbg(s): debugstmts.append(s)\ndef showdbg():\n for d in debugstmts: print "DBG: %s " % d\n\ndef vimcomplete(context,match):\n global debugstmts\n debugstmts = []\n try:\n import vim\n def complsort(x,y):\n try:\n xa = x[\'abbr\']\n ya = y[\'abbr\']\n if xa[0] == \'_\':\n if xa[1] == \'_\' and ya[0:2] == \'__\':\n return xa > ya\n elif ya[0:2] == \'__\':\n return -1\n elif y[0] == \'_\':\n return xa > ya\n else:\n return 1\n elif ya[0] == \'_\':\n return -1\n else:\n return xa > ya\n except:\n return 0\n cmpl = Completer()\n cmpl.evalsource(\'\\n\'.join(vim.current.buffer),vim.eval("line(\'.\')"))\n all = cmpl.get_completions(context,match)\n all.sort(complsort)\n dictstr = \'[\'\n # have to do this for double quoting\n for cmpl in all:\n dictstr += \'{\'\n for x in cmpl: dictstr += \'"%s":"%s",\' % (x,cmpl[x])\n dictstr += \'"icase":0},\'\n if dictstr[-1] == \',\': dictstr = dictstr[:-1]\n dictstr += \']\'\n #dbg("dict: %s" % dictstr)\n vim.command("silent let g:pythoncomplete_completions = %s" % dictstr)\n #dbg("Completion dict:\\n%s" % all)\n except vim.error:\n dbg("VIM Error: %s" % vim.error)\n\nclass Completer(object):\n def __init__(self):\n self.compldict = {}\n self.parser = PyParser()\n\n def evalsource(self,text,line=0):\n sc = self.parser.parse(text,line)\n src = sc.get_code()\n dbg("source: %s" % src)\n try: exec(src) in self.compldict\n except: dbg("parser: %s, %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n for l in sc.locals:\n try: exec(l) in self.compldict\n except: dbg("locals: %s, %s [%s]" % (sys.exc_info()[0],sys.exc_info()[1],l))\n\n def _cleanstr(self,doc):\n return doc.replace(\'"\',\' \').replace("\'",\' \')\n\n def get_arguments(self,func_obj):\n def _ctor(obj):\n try: return class_ob.__init__.im_func\n except AttributeError:\n for base in class_ob.__bases__:\n rc = _find_constructor(base)\n if rc is not None: return rc\n return None\n\n arg_offset = 1\n if type(func_obj) == types.ClassType: func_obj = _ctor(func_obj)\n elif type(func_obj) == types.MethodType: func_obj = func_obj.im_func\n else: arg_offset = 0\n \n arg_text=\'\'\n if type(func_obj) in [types.FunctionType, types.LambdaType]:\n try:\n cd = func_obj.func_code\n real_args = cd.co_varnames[arg_offset:cd.co_argcount]\n defaults = func_obj.func_defaults or \'\'\n defaults = map(lambda name: "=%s" % name, defaults)\n defaults = [""] * (len(real_args)-len(defaults)) + defaults\n items = map(lambda a,d: a+d, real_args, defaults)\n if func_obj.func_code.co_flags & 0x4:\n items.append("...")\n if func_obj.func_code.co_flags & 0x8:\n items.append("***")\n arg_text = (\',\'.join(items)) + \')\'\n\n except:\n dbg("arg completion: %s: %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n pass\n if len(arg_text) == 0:\n # The doc string sometimes contains the function signature\n # this works for alot of C modules that are part of the\n # standard library\n doc = func_obj.__doc__\n if doc:\n doc = doc.lstrip()\n pos = doc.find(\'\\n\')\n if pos > 0:\n sigline = doc[:pos]\n lidx = sigline.find(\'(\')\n ridx = sigline.find(\')\')\n if lidx > 0 and ridx > 0:\n arg_text = sigline[lidx+1:ridx] + \')\'\n if len(arg_text) == 0: arg_text = \')\'\n return arg_text\n\n def get_completions(self,context,match):\n dbg("get_completions(\'%s\',\'%s\')" % (context,match))\n stmt = \'\'\n if context: stmt += str(context)\n if match: stmt += str(match)\n try:\n result = None\n all = {}\n ridx = stmt.rfind(\'.\')\n if len(stmt) > 0 and stmt[-1] == \'(\':\n result = eval(_sanitize(stmt[:-1]), self.compldict)\n doc = result.__doc__\n if doc is None: doc = \'\'\n args = self.get_arguments(result)\n return [{\'word\':self._cleanstr(args),\'info\':self._cleanstr(doc)}]\n elif ridx == -1:\n match = stmt\n all = self.compldict\n else:\n match = stmt[ridx+1:]\n stmt = _sanitize(stmt[:ridx])\n result = eval(stmt, self.compldict)\n all = dir(result)\n\n dbg("completing: stmt:%s" % stmt)\n completions = []\n\n try: maindoc = result.__doc__\n except: maindoc = \' \'\n if maindoc is None: maindoc = \' \'\n for m in all:\n if m == "_PyCmplNoType": continue #this is internal\n try:\n dbg(\'possible completion: %s\' % m)\n if m.find(match) == 0:\n if result is None: inst = all[m]\n else: inst = getattr(result,m)\n try: doc = inst.__doc__\n except: doc = maindoc\n typestr = str(inst)\n if doc is None or doc == \'\': doc = maindoc\n\n wrd = m[len(match):]\n c = {\'word\':wrd, \'abbr\':m, \'info\':self._cleanstr(doc)}\n if "function" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "method" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "module" in typestr:\n c[\'word\'] += \'.\'\n elif "class" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\'\n completions.append(c)\n except:\n i = sys.exc_info()\n dbg("inner completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return completions\n except:\n i = sys.exc_info()\n dbg("completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return []\n\nclass Scope(object):\n def __init__(self,name,indent,docstr=\'\'):\n self.subscopes = []\n self.docstr = docstr\n self.locals = []\n self.parent = None\n self.name = name\n self.indent = indent\n\n def add(self,sub):\n #print \'push scope: [%s@%s]\' % (sub.name,sub.indent)\n sub.parent = self\n self.subscopes.append(sub)\n return sub\n\n def doc(self,str):\n """ Clean up a docstring """\n d = str.replace(\'\\n\',\' \')\n d = d.replace(\'\\t\',\' \')\n while d.find(\' \') > -1: d = d.replace(\' \',\' \')\n while d[0] in \'"\\\'\\t \': d = d[1:]\n while d[-1] in \'"\\\'\\t \': d = d[:-1]\n dbg("Scope(%s)::docstr = %s" % (self,d))\n self.docstr = d\n\n def local(self,loc):\n self._checkexisting(loc)\n self.locals.append(loc)\n\n def copy_decl(self,indent=0):\n """ Copy a scope\'s declaration only, at the specified indent level - not local variables """\n return Scope(self.name,indent,self.docstr)\n\n def _checkexisting(self,test):\n "Convienance function... keep out duplicates"\n if test.find(\'=\') > -1:\n var = test.split(\'=\')[0].strip()\n for l in self.locals:\n if l.find(\'=\') > -1 and var == l.split(\'=\')[0].strip():\n self.locals.remove(l)\n\n def get_code(self):\n str = ""\n if len(self.docstr) > 0: str += \'"""\'+self.docstr+\'"""\\n\'\n for l in self.locals:\n if l.startswith(\'import\'): str += l+\'\\n\'\n str += \'class _PyCmplNoType:\\n def __getattr__(self,name):\\n return None\\n\'\n for sub in self.subscopes:\n str += sub.get_code()\n for l in self.locals:\n if not l.startswith(\'import\'): str += l+\'\\n\'\n\n return str\n\n def pop(self,indent):\n #print \'pop scope: [%s] to [%s]\' % (self.indent,indent)\n outer = self\n while outer.parent != None and outer.indent >= indent:\n outer = outer.parent\n return outer\n\n def currentindent(self):\n #print \'parse current indent: %s\' % self.indent\n return \' \'*self.indent\n\n def childindent(self):\n #print \'parse child indent: [%s]\' % (self.indent+1)\n return \' \'*(self.indent+1)\n\nclass Class(Scope):\n def __init__(self, name, supers, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.supers = supers\n def copy_decl(self,indent=0):\n c = Class(self.name,self.supers,indent, self.docstr)\n for s in self.subscopes:\n c.add(s.copy_decl(indent+1))\n return c\n def get_code(self):\n str = \'%sclass %s\' % (self.currentindent(),self.name)\n if len(self.supers) > 0: str += \'(%s)\' % \',\'.join(self.supers)\n str += \':\\n\'\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n if len(self.subscopes) > 0:\n for s in self.subscopes: str += s.get_code()\n else:\n str += \'%spass\\n\' % self.childindent()\n return str\n\n\nclass Function(Scope):\n def __init__(self, name, params, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.params = params\n def copy_decl(self,indent=0):\n return Function(self.name,self.params,indent, self.docstr)\n def get_code(self):\n str = "%sdef %s(%s):\\n" % \\\n (self.currentindent(),self.name,\',\'.join(self.params))\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n str += "%spass\\n" % self.childindent()\n return str\n\nclass PyParser:\n def __init__(self):\n self.top = Scope(\'global\',0)\n self.scope = self.top\n self.parserline = 0\n\n def _parsedotname(self,pre=None):\n #returns (dottedname, nexttoken)\n name = []\n if pre is None:\n tokentype, token, indent = self.next()\n if tokentype != NAME and token != \'*\':\n return (\'\', token)\n else: token = pre\n name.append(token)\n while True:\n tokentype, token, indent = self.next()\n if token != \'.\': break\n tokentype, token, indent = self.next()\n if tokentype != NAME: break\n name.append(token)\n return (".".join(name), token)\n\n def _parseimportlist(self):\n imports = []\n while True:\n name, token = self._parsedotname()\n if not name: break\n name2 = \'\'\n if token == \'as\': name2, token = self._parsedotname()\n imports.append((name, name2))\n while token != "," and "\\n" not in token:\n tokentype, token, indent = self.next()\n if token != ",": break\n return imports\n\n def _parenparse(self):\n name = \'\'\n names = []\n level = 1\n while True:\n tokentype, token, indent = self.next()\n if token in (\')\', \',\') and level == 1:\n if \'=\' not in name: name = name.replace(\' \', \'\')\n names.append(name.strip())\n name = \'\'\n if token == \'(\':\n level += 1\n name += "("\n elif token == \')\':\n level -= 1\n if level == 0: break\n else: name += ")"\n elif token == \',\' and level == 1:\n pass\n else:\n name += "%s " % str(token)\n return names\n\n def _parsefunction(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, fname, ind = self.next()\n if tokentype != NAME: return None\n\n tokentype, open, ind = self.next()\n if open != \'(\': return None\n params=self._parenparse()\n\n tokentype, colon, ind = self.next()\n if colon != \':\': return None\n\n return Function(fname,params,indent)\n\n def _parseclass(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, cname, ind = self.next()\n if tokentype != NAME: return None\n\n super = []\n tokentype, next, ind = self.next()\n if next == \'(\':\n super=self._parenparse()\n elif next != \':\': return None\n\n return Class(cname,super,indent)\n\n def _parseassignment(self):\n assign=\'\'\n tokentype, token, indent = self.next()\n if tokentype == tokenize.STRING or token == \'str\': \n return \'""\'\n elif token == \'(\' or token == \'tuple\':\n return \'()\'\n elif token == \'[\' or token == \'list\':\n return \'[]\'\n elif token == \'{\' or token == \'dict\':\n return \'{}\'\n elif tokentype == tokenize.NUMBER:\n return \'0\'\n elif token == \'open\' or token == \'file\':\n return \'file\'\n elif token == \'None\':\n return \'_PyCmplNoType()\'\n elif token == \'type\':\n return \'type(_PyCmplNoType)\' #only for method resolution\n else:\n assign += token\n level = 0\n while True:\n tokentype, token, indent = self.next()\n if token in (\'(\',\'{\',\'[\'):\n level += 1\n elif token in (\']\',\'}\',\')\'):\n level -= 1\n if level == 0: break\n elif level == 0:\n if token in (\';\',\'\\n\'): break\n assign += token\n return "%s" % assign\n\n def next(self):\n type, token, (lineno, indent), end, self.parserline = self.gen.next()\n if lineno == self.curline:\n #print \'line found [%s] scope=%s\' % (line.replace(\'\\n\',\'\'),self.scope.name)\n self.currentscope = self.scope\n return (type, token, indent)\n\n def _adjustvisibility(self):\n newscope = Scope(\'result\',0)\n scp = self.currentscope\n while scp != None:\n if type(scp) == Function:\n slice = 0\n #Handle \'self\' params\n if scp.parent != None and type(scp.parent) == Class:\n slice = 1\n newscope.local(\'%s = %s\' % (scp.params[0],scp.parent.name))\n for p in scp.params[slice:]:\n i = p.find(\'=\')\n if len(p) == 0: continue\n pvar = \'\'\n ptype = \'\'\n if i == -1:\n pvar = p\n ptype = \'_PyCmplNoType()\'\n else:\n pvar = p[:i]\n ptype = _sanitize(p[i+1:])\n if pvar.startswith(\'**\'):\n pvar = pvar[2:]\n ptype = \'{}\'\n elif pvar.startswith(\'*\'):\n pvar = pvar[1:]\n ptype = \'[]\'\n\n newscope.local(\'%s = %s\' % (pvar,ptype))\n\n for s in scp.subscopes:\n ns = s.copy_decl(0)\n newscope.add(ns)\n for l in scp.locals: newscope.local(l)\n scp = scp.parent\n\n self.currentscope = newscope\n return self.currentscope\n\n #p.parse(vim.current.buffer[:],vim.eval("line(\'.\')"))\n def parse(self,text,curline=0):\n self.curline = int(curline)\n buf = cStringIO.StringIO(\'\'.join(text) + \'\\n\')\n self.gen = tokenize.generate_tokens(buf.readline)\n self.currentscope = self.scope\n\n try:\n freshscope=True\n while True:\n tokentype, token, indent = self.next()\n #dbg( \'main: token=[%s] indent=[%s]\' % (token,indent))\n\n if tokentype == DEDENT or token == "pass":\n self.scope = self.scope.pop(indent)\n elif token == \'def\':\n func = self._parsefunction(indent)\n if func is None:\n print "function: syntax error..."\n continue\n dbg("new scope: function")\n freshscope = True\n self.scope = self.scope.add(func)\n elif token == \'class\':\n cls = self._parseclass(indent)\n if cls is None:\n print "class: syntax error..."\n continue\n freshscope = True\n dbg("new scope: class")\n self.scope = self.scope.add(cls)\n \n elif token == \'import\':\n imports = self._parseimportlist()\n for mod, alias in imports:\n loc = "import %s" % mod\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif token == \'from\':\n mod, token = self._parsedotname()\n if not mod or token != "import":\n print "from: syntax error..."\n continue\n names = self._parseimportlist()\n for name, alias in names:\n loc = "from %s import %s" % (mod,name)\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif tokentype == STRING:\n if freshscope: self.scope.doc(token)\n elif tokentype == NAME:\n name,token = self._parsedotname(token) \n if token == \'=\':\n stmt = self._parseassignment()\n dbg("parseassignment: %s = %s" % (name, stmt))\n if stmt != None:\n self.scope.local("%s = %s" % (name,stmt))\n freshscope = False\n except StopIteration: #thrown on EOF\n pass\n except:\n dbg("parse error: %s, %s @ %s" %\n (sys.exc_info()[0], sys.exc_info()[1], self.parserline))\n return self._adjustvisibility()\n\ndef _sanitize(str):\n val = \'\'\n level = 0\n for c in str:\n if c in (\'(\',\'{\',\'[\'):\n level += 1\n elif c in (\']\',\'}\',\')\'):\n level -= 1\n elif level == 0:\n val += c\n return val\n\nsys.path.extend([\'.\',\'..\'])\n', 4, 4] 2017-01-18 11:10:12,212 [DEBUG @ session.py:_on_request:201] 4117 - received rpc request, greenlet will handle it 2017-01-18 11:10:12,212 [DEBUG @ host.py:_on_request:91] 4117 - calling request handler for "python_execute", args: "['import sys, tokenize, cStringIO, types\nfrom token import NAME, DEDENT, NEWLINE, STRING\n\ndebugstmts=[]\ndef dbg(s): debugstmts.append(s)\ndef showdbg():\n for d in debugstmts: print "DBG: %s " % d\n\ndef vimcomplete(context,match):\n global debugstmts\n debugstmts = []\n try:\n import vim\n def complsort(x,y):\n try:\n xa = x[\'abbr\']\n ya = y[\'abbr\']\n if xa[0] == \'_\':\n if xa[1] == \'_\' and ya[0:2] == \'__\':\n return xa > ya\n elif ya[0:2] == \'__\':\n return -1\n elif y[0] == \'_\':\n return xa > ya\n else:\n return 1\n elif ya[0] == \'_\':\n return -1\n else:\n return xa > ya\n except:\n return 0\n cmpl = Completer()\n cmpl.evalsource(\'\\n\'.join(vim.current.buffer),vim.eval("line(\'.\')"))\n all = cmpl.get_completions(context,match)\n all.sort(complsort)\n dictstr = \'[\'\n # have to do this for double quoting\n for cmpl in all:\n dictstr += \'{\'\n for x in cmpl: dictstr += \'"%s":"%s",\' % (x,cmpl[x])\n dictstr += \'"icase":0},\'\n if dictstr[-1] == \',\': dictstr = dictstr[:-1]\n dictstr += \']\'\n #dbg("dict: %s" % dictstr)\n vim.command("silent let g:pythoncomplete_completions = %s" % dictstr)\n #dbg("Completion dict:\\n%s" % all)\n except vim.error:\n dbg("VIM Error: %s" % vim.error)\n\nclass Completer(object):\n def __init__(self):\n self.compldict = {}\n self.parser = PyParser()\n\n def evalsource(self,text,line=0):\n sc = self.parser.parse(text,line)\n src = sc.get_code()\n dbg("source: %s" % src)\n try: exec(src) in self.compldict\n except: dbg("parser: %s, %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n for l in sc.locals:\n try: exec(l) in self.compldict\n except: dbg("locals: %s, %s [%s]" % (sys.exc_info()[0],sys.exc_info()[1],l))\n\n def _cleanstr(self,doc):\n return doc.replace(\'"\',\' \').replace("\'",\' \')\n\n def get_arguments(self,func_obj):\n def _ctor(obj):\n try: return class_ob.__init__.im_func\n except AttributeError:\n for base in class_ob.__bases__:\n rc = _find_constructor(base)\n if rc is not None: return rc\n return None\n\n arg_offset = 1\n if type(func_obj) == types.ClassType: func_obj = _ctor(func_obj)\n elif type(func_obj) == types.MethodType: func_obj = func_obj.im_func\n else: arg_offset = 0\n \n arg_text=\'\'\n if type(func_obj) in [types.FunctionType, types.LambdaType]:\n try:\n cd = func_obj.func_code\n real_args = cd.co_varnames[arg_offset:cd.co_argcount]\n defaults = func_obj.func_defaults or \'\'\n defaults = map(lambda name: "=%s" % name, defaults)\n defaults = [""] * (len(real_args)-len(defaults)) + defaults\n items = map(lambda a,d: a+d, real_args, defaults)\n if func_obj.func_code.co_flags & 0x4:\n items.append("...")\n if func_obj.func_code.co_flags & 0x8:\n items.append("***")\n arg_text = (\',\'.join(items)) + \')\'\n\n except:\n dbg("arg completion: %s: %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n pass\n if len(arg_text) == 0:\n # The doc string sometimes contains the function signature\n # this works for alot of C modules that are part of the\n # standard library\n doc = func_obj.__doc__\n if doc:\n doc = doc.lstrip()\n pos = doc.find(\'\\n\')\n if pos > 0:\n sigline = doc[:pos]\n lidx = sigline.find(\'(\')\n ridx = sigline.find(\')\')\n if lidx > 0 and ridx > 0:\n arg_text = sigline[lidx+1:ridx] + \')\'\n if len(arg_text) == 0: arg_text = \')\'\n return arg_text\n\n def get_completions(self,context,match):\n dbg("get_completions(\'%s\',\'%s\')" % (context,match))\n stmt = \'\'\n if context: stmt += str(context)\n if match: stmt += str(match)\n try:\n result = None\n all = {}\n ridx = stmt.rfind(\'.\')\n if len(stmt) > 0 and stmt[-1] == \'(\':\n result = eval(_sanitize(stmt[:-1]), self.compldict)\n doc = result.__doc__\n if doc is None: doc = \'\'\n args = self.get_arguments(result)\n return [{\'word\':self._cleanstr(args),\'info\':self._cleanstr(doc)}]\n elif ridx == -1:\n match = stmt\n all = self.compldict\n else:\n match = stmt[ridx+1:]\n stmt = _sanitize(stmt[:ridx])\n result = eval(stmt, self.compldict)\n all = dir(result)\n\n dbg("completing: stmt:%s" % stmt)\n completions = []\n\n try: maindoc = result.__doc__\n except: maindoc = \' \'\n if maindoc is None: maindoc = \' \'\n for m in all:\n if m == "_PyCmplNoType": continue #this is internal\n try:\n dbg(\'possible completion: %s\' % m)\n if m.find(match) == 0:\n if result is None: inst = all[m]\n else: inst = getattr(result,m)\n try: doc = inst.__doc__\n except: doc = maindoc\n typestr = str(inst)\n if doc is None or doc == \'\': doc = maindoc\n\n wrd = m[len(match):]\n c = {\'word\':wrd, \'abbr\':m, \'info\':self._cleanstr(doc)}\n if "function" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "method" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "module" in typestr:\n c[\'word\'] += \'.\'\n elif "class" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\'\n completions.append(c)\n except:\n i = sys.exc_info()\n dbg("inner completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return completions\n except:\n i = sys.exc_info()\n dbg("completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return []\n\nclass Scope(object):\n def __init__(self,name,indent,docstr=\'\'):\n self.subscopes = []\n self.docstr = docstr\n self.locals = []\n self.parent = None\n self.name = name\n self.indent = indent\n\n def add(self,sub):\n #print \'push scope: [%s@%s]\' % (sub.name,sub.indent)\n sub.parent = self\n self.subscopes.append(sub)\n return sub\n\n def doc(self,str):\n """ Clean up a docstring """\n d = str.replace(\'\\n\',\' \')\n d = d.replace(\'\\t\',\' \')\n while d.find(\' \') > -1: d = d.replace(\' \',\' \')\n while d[0] in \'"\\\'\\t \': d = d[1:]\n while d[-1] in \'"\\\'\\t \': d = d[:-1]\n dbg("Scope(%s)::docstr = %s" % (self,d))\n self.docstr = d\n\n def local(self,loc):\n self._checkexisting(loc)\n self.locals.append(loc)\n\n def copy_decl(self,indent=0):\n """ Copy a scope\'s declaration only, at the specified indent level - not local variables """\n return Scope(self.name,indent,self.docstr)\n\n def _checkexisting(self,test):\n "Convienance function... keep out duplicates"\n if test.find(\'=\') > -1:\n var = test.split(\'=\')[0].strip()\n for l in self.locals:\n if l.find(\'=\') > -1 and var == l.split(\'=\')[0].strip():\n self.locals.remove(l)\n\n def get_code(self):\n str = ""\n if len(self.docstr) > 0: str += \'"""\'+self.docstr+\'"""\\n\'\n for l in self.locals:\n if l.startswith(\'import\'): str += l+\'\\n\'\n str += \'class _PyCmplNoType:\\n def __getattr__(self,name):\\n return None\\n\'\n for sub in self.subscopes:\n str += sub.get_code()\n for l in self.locals:\n if not l.startswith(\'import\'): str += l+\'\\n\'\n\n return str\n\n def pop(self,indent):\n #print \'pop scope: [%s] to [%s]\' % (self.indent,indent)\n outer = self\n while outer.parent != None and outer.indent >= indent:\n outer = outer.parent\n return outer\n\n def currentindent(self):\n #print \'parse current indent: %s\' % self.indent\n return \' \'*self.indent\n\n def childindent(self):\n #print \'parse child indent: [%s]\' % (self.indent+1)\n return \' \'*(self.indent+1)\n\nclass Class(Scope):\n def __init__(self, name, supers, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.supers = supers\n def copy_decl(self,indent=0):\n c = Class(self.name,self.supers,indent, self.docstr)\n for s in self.subscopes:\n c.add(s.copy_decl(indent+1))\n return c\n def get_code(self):\n str = \'%sclass %s\' % (self.currentindent(),self.name)\n if len(self.supers) > 0: str += \'(%s)\' % \',\'.join(self.supers)\n str += \':\\n\'\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n if len(self.subscopes) > 0:\n for s in self.subscopes: str += s.get_code()\n else:\n str += \'%spass\\n\' % self.childindent()\n return str\n\n\nclass Function(Scope):\n def __init__(self, name, params, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.params = params\n def copy_decl(self,indent=0):\n return Function(self.name,self.params,indent, self.docstr)\n def get_code(self):\n str = "%sdef %s(%s):\\n" % \\\n (self.currentindent(),self.name,\',\'.join(self.params))\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n str += "%spass\\n" % self.childindent()\n return str\n\nclass PyParser:\n def __init__(self):\n self.top = Scope(\'global\',0)\n self.scope = self.top\n self.parserline = 0\n\n def _parsedotname(self,pre=None):\n #returns (dottedname, nexttoken)\n name = []\n if pre is None:\n tokentype, token, indent = self.next()\n if tokentype != NAME and token != \'*\':\n return (\'\', token)\n else: token = pre\n name.append(token)\n while True:\n tokentype, token, indent = self.next()\n if token != \'.\': break\n tokentype, token, indent = self.next()\n if tokentype != NAME: break\n name.append(token)\n return (".".join(name), token)\n\n def _parseimportlist(self):\n imports = []\n while True:\n name, token = self._parsedotname()\n if not name: break\n name2 = \'\'\n if token == \'as\': name2, token = self._parsedotname()\n imports.append((name, name2))\n while token != "," and "\\n" not in token:\n tokentype, token, indent = self.next()\n if token != ",": break\n return imports\n\n def _parenparse(self):\n name = \'\'\n names = []\n level = 1\n while True:\n tokentype, token, indent = self.next()\n if token in (\')\', \',\') and level == 1:\n if \'=\' not in name: name = name.replace(\' \', \'\')\n names.append(name.strip())\n name = \'\'\n if token == \'(\':\n level += 1\n name += "("\n elif token == \')\':\n level -= 1\n if level == 0: break\n else: name += ")"\n elif token == \',\' and level == 1:\n pass\n else:\n name += "%s " % str(token)\n return names\n\n def _parsefunction(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, fname, ind = self.next()\n if tokentype != NAME: return None\n\n tokentype, open, ind = self.next()\n if open != \'(\': return None\n params=self._parenparse()\n\n tokentype, colon, ind = self.next()\n if colon != \':\': return None\n\n return Function(fname,params,indent)\n\n def _parseclass(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, cname, ind = self.next()\n if tokentype != NAME: return None\n\n super = []\n tokentype, next, ind = self.next()\n if next == \'(\':\n super=self._parenparse()\n elif next != \':\': return None\n\n return Class(cname,super,indent)\n\n def _parseassignment(self):\n assign=\'\'\n tokentype, token, indent = self.next()\n if tokentype == tokenize.STRING or token == \'str\': \n return \'""\'\n elif token == \'(\' or token == \'tuple\':\n return \'()\'\n elif token == \'[\' or token == \'list\':\n return \'[]\'\n elif token == \'{\' or token == \'dict\':\n return \'{}\'\n elif tokentype == tokenize.NUMBER:\n return \'0\'\n elif token == \'open\' or token == \'file\':\n return \'file\'\n elif token == \'None\':\n return \'_PyCmplNoType()\'\n elif token == \'type\':\n return \'type(_PyCmplNoType)\' #only for method resolution\n else:\n assign += token\n level = 0\n while True:\n tokentype, token, indent = self.next()\n if token in (\'(\',\'{\',\'[\'):\n level += 1\n elif token in (\']\',\'}\',\')\'):\n level -= 1\n if level == 0: break\n elif level == 0:\n if token in (\';\',\'\\n\'): break\n assign += token\n return "%s" % assign\n\n def next(self):\n type, token, (lineno, indent), end, self.parserline = self.gen.next()\n if lineno == self.curline:\n #print \'line found [%s] scope=%s\' % (line.replace(\'\\n\',\'\'),self.scope.name)\n self.currentscope = self.scope\n return (type, token, indent)\n\n def _adjustvisibility(self):\n newscope = Scope(\'result\',0)\n scp = self.currentscope\n while scp != None:\n if type(scp) == Function:\n slice = 0\n #Handle \'self\' params\n if scp.parent != None and type(scp.parent) == Class:\n slice = 1\n newscope.local(\'%s = %s\' % (scp.params[0],scp.parent.name))\n for p in scp.params[slice:]:\n i = p.find(\'=\')\n if len(p) == 0: continue\n pvar = \'\'\n ptype = \'\'\n if i == -1:\n pvar = p\n ptype = \'_PyCmplNoType()\'\n else:\n pvar = p[:i]\n ptype = _sanitize(p[i+1:])\n if pvar.startswith(\'**\'):\n pvar = pvar[2:]\n ptype = \'{}\'\n elif pvar.startswith(\'*\'):\n pvar = pvar[1:]\n ptype = \'[]\'\n\n newscope.local(\'%s = %s\' % (pvar,ptype))\n\n for s in scp.subscopes:\n ns = s.copy_decl(0)\n newscope.add(ns)\n for l in scp.locals: newscope.local(l)\n scp = scp.parent\n\n self.currentscope = newscope\n return self.currentscope\n\n #p.parse(vim.current.buffer[:],vim.eval("line(\'.\')"))\n def parse(self,text,curline=0):\n self.curline = int(curline)\n buf = cStringIO.StringIO(\'\'.join(text) + \'\\n\')\n self.gen = tokenize.generate_tokens(buf.readline)\n self.currentscope = self.scope\n\n try:\n freshscope=True\n while True:\n tokentype, token, indent = self.next()\n #dbg( \'main: token=[%s] indent=[%s]\' % (token,indent))\n\n if tokentype == DEDENT or token == "pass":\n self.scope = self.scope.pop(indent)\n elif token == \'def\':\n func = self._parsefunction(indent)\n if func is None:\n print "function: syntax error..."\n continue\n dbg("new scope: function")\n freshscope = True\n self.scope = self.scope.add(func)\n elif token == \'class\':\n cls = self._parseclass(indent)\n if cls is None:\n print "class: syntax error..."\n continue\n freshscope = True\n dbg("new scope: class")\n self.scope = self.scope.add(cls)\n \n elif token == \'import\':\n imports = self._parseimportlist()\n for mod, alias in imports:\n loc = "import %s" % mod\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif token == \'from\':\n mod, token = self._parsedotname()\n if not mod or token != "import":\n print "from: syntax error..."\n continue\n names = self._parseimportlist()\n for name, alias in names:\n loc = "from %s import %s" % (mod,name)\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif tokentype == STRING:\n if freshscope: self.scope.doc(token)\n elif tokentype == NAME:\n name,token = self._parsedotname(token) \n if token == \'=\':\n stmt = self._parseassignment()\n dbg("parseassignment: %s = %s" % (name, stmt))\n if stmt != None:\n self.scope.local("%s = %s" % (name,stmt))\n freshscope = False\n except StopIteration: #thrown on EOF\n pass\n except:\n dbg("parse error: %s, %s @ %s" %\n (sys.exc_info()[0], sys.exc_info()[1], self.parserline))\n return self._adjustvisibility()\n\ndef _sanitize(str):\n val = \'\'\n level = 0\n for c in str:\n if c in (\'(\',\'{\',\'[\'):\n level += 1\n elif c in (\']\',\'}\',\')\'):\n level -= 1\n elif level == 0:\n val += c\n return val\n\nsys.path.extend([\'.\',\'..\'])\n', 4, 4]" 2017-01-18 11:10:12,212 [DEBUG @ msgpack_stream.py:send:33] 4117 - sent [0, 2, 'nvim_get_current_buf', ()] 2017-01-18 11:10:12,212 [DEBUG @ base.py:send:113] 4117 - Sending 'nvim_get_current_buf' 2017-01-18 11:10:12,212 [DEBUG @ session.py:_yielding_request:153] 4117 - yielding from greenlet to wait for response 2017-01-18 11:10:12,212 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,212 [DEBUG @ msgpack_stream.py:_on_data:59] 4117 - unpacker needs more data... 2017-01-18 11:10:12,212 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,212 [DEBUG @ msgpack_stream.py:_on_data:56] 4117 - received message: [1, 2, None, ExtType(code=0, data='\x01')] 2017-01-18 11:10:12,212 [DEBUG @ async_session.py:_on_response:95] 4117 - received response: None, ExtType(code=0, data='\x01') 2017-01-18 11:10:12,213 [DEBUG @ session.py:response_cb:149] 4117 - response is available for greenlet , switching back 2017-01-18 11:10:12,216 [DEBUG @ host.py:_on_request:93] 4117 - request handler for 'python_execute ['import sys, tokenize, cStringIO, types\nfrom token import NAME, DEDENT, NEWLINE, STRING\n\ndebugstmts=[]\ndef dbg(s): debugstmts.append(s)\ndef showdbg():\n for d in debugstmts: print "DBG: %s " % d\n\ndef vimcomplete(context,match):\n global debugstmts\n debugstmts = []\n try:\n import vim\n def complsort(x,y):\n try:\n xa = x[\'abbr\']\n ya = y[\'abbr\']\n if xa[0] == \'_\':\n if xa[1] == \'_\' and ya[0:2] == \'__\':\n return xa > ya\n elif ya[0:2] == \'__\':\n return -1\n elif y[0] == \'_\':\n return xa > ya\n else:\n return 1\n elif ya[0] == \'_\':\n return -1\n else:\n return xa > ya\n except:\n return 0\n cmpl = Completer()\n cmpl.evalsource(\'\\n\'.join(vim.current.buffer),vim.eval("line(\'.\')"))\n all = cmpl.get_completions(context,match)\n all.sort(complsort)\n dictstr = \'[\'\n # have to do this for double quoting\n for cmpl in all:\n dictstr += \'{\'\n for x in cmpl: dictstr += \'"%s":"%s",\' % (x,cmpl[x])\n dictstr += \'"icase":0},\'\n if dictstr[-1] == \',\': dictstr = dictstr[:-1]\n dictstr += \']\'\n #dbg("dict: %s" % dictstr)\n vim.command("silent let g:pythoncomplete_completions = %s" % dictstr)\n #dbg("Completion dict:\\n%s" % all)\n except vim.error:\n dbg("VIM Error: %s" % vim.error)\n\nclass Completer(object):\n def __init__(self):\n self.compldict = {}\n self.parser = PyParser()\n\n def evalsource(self,text,line=0):\n sc = self.parser.parse(text,line)\n src = sc.get_code()\n dbg("source: %s" % src)\n try: exec(src) in self.compldict\n except: dbg("parser: %s, %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n for l in sc.locals:\n try: exec(l) in self.compldict\n except: dbg("locals: %s, %s [%s]" % (sys.exc_info()[0],sys.exc_info()[1],l))\n\n def _cleanstr(self,doc):\n return doc.replace(\'"\',\' \').replace("\'",\' \')\n\n def get_arguments(self,func_obj):\n def _ctor(obj):\n try: return class_ob.__init__.im_func\n except AttributeError:\n for base in class_ob.__bases__:\n rc = _find_constructor(base)\n if rc is not None: return rc\n return None\n\n arg_offset = 1\n if type(func_obj) == types.ClassType: func_obj = _ctor(func_obj)\n elif type(func_obj) == types.MethodType: func_obj = func_obj.im_func\n else: arg_offset = 0\n \n arg_text=\'\'\n if type(func_obj) in [types.FunctionType, types.LambdaType]:\n try:\n cd = func_obj.func_code\n real_args = cd.co_varnames[arg_offset:cd.co_argcount]\n defaults = func_obj.func_defaults or \'\'\n defaults = map(lambda name: "=%s" % name, defaults)\n defaults = [""] * (len(real_args)-len(defaults)) + defaults\n items = map(lambda a,d: a+d, real_args, defaults)\n if func_obj.func_code.co_flags & 0x4:\n items.append("...")\n if func_obj.func_code.co_flags & 0x8:\n items.append("***")\n arg_text = (\',\'.join(items)) + \')\'\n\n except:\n dbg("arg completion: %s: %s" % (sys.exc_info()[0],sys.exc_info()[1]))\n pass\n if len(arg_text) == 0:\n # The doc string sometimes contains the function signature\n # this works for alot of C modules that are part of the\n # standard library\n doc = func_obj.__doc__\n if doc:\n doc = doc.lstrip()\n pos = doc.find(\'\\n\')\n if pos > 0:\n sigline = doc[:pos]\n lidx = sigline.find(\'(\')\n ridx = sigline.find(\')\')\n if lidx > 0 and ridx > 0:\n arg_text = sigline[lidx+1:ridx] + \')\'\n if len(arg_text) == 0: arg_text = \')\'\n return arg_text\n\n def get_completions(self,context,match):\n dbg("get_completions(\'%s\',\'%s\')" % (context,match))\n stmt = \'\'\n if context: stmt += str(context)\n if match: stmt += str(match)\n try:\n result = None\n all = {}\n ridx = stmt.rfind(\'.\')\n if len(stmt) > 0 and stmt[-1] == \'(\':\n result = eval(_sanitize(stmt[:-1]), self.compldict)\n doc = result.__doc__\n if doc is None: doc = \'\'\n args = self.get_arguments(result)\n return [{\'word\':self._cleanstr(args),\'info\':self._cleanstr(doc)}]\n elif ridx == -1:\n match = stmt\n all = self.compldict\n else:\n match = stmt[ridx+1:]\n stmt = _sanitize(stmt[:ridx])\n result = eval(stmt, self.compldict)\n all = dir(result)\n\n dbg("completing: stmt:%s" % stmt)\n completions = []\n\n try: maindoc = result.__doc__\n except: maindoc = \' \'\n if maindoc is None: maindoc = \' \'\n for m in all:\n if m == "_PyCmplNoType": continue #this is internal\n try:\n dbg(\'possible completion: %s\' % m)\n if m.find(match) == 0:\n if result is None: inst = all[m]\n else: inst = getattr(result,m)\n try: doc = inst.__doc__\n except: doc = maindoc\n typestr = str(inst)\n if doc is None or doc == \'\': doc = maindoc\n\n wrd = m[len(match):]\n c = {\'word\':wrd, \'abbr\':m, \'info\':self._cleanstr(doc)}\n if "function" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "method" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\' + self._cleanstr(self.get_arguments(inst))\n elif "module" in typestr:\n c[\'word\'] += \'.\'\n elif "class" in typestr:\n c[\'word\'] += \'(\'\n c[\'abbr\'] += \'(\'\n completions.append(c)\n except:\n i = sys.exc_info()\n dbg("inner completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return completions\n except:\n i = sys.exc_info()\n dbg("completion: %s,%s [stmt=\'%s\']" % (i[0],i[1],stmt))\n return []\n\nclass Scope(object):\n def __init__(self,name,indent,docstr=\'\'):\n self.subscopes = []\n self.docstr = docstr\n self.locals = []\n self.parent = None\n self.name = name\n self.indent = indent\n\n def add(self,sub):\n #print \'push scope: [%s@%s]\' % (sub.name,sub.indent)\n sub.parent = self\n self.subscopes.append(sub)\n return sub\n\n def doc(self,str):\n """ Clean up a docstring """\n d = str.replace(\'\\n\',\' \')\n d = d.replace(\'\\t\',\' \')\n while d.find(\' \') > -1: d = d.replace(\' \',\' \')\n while d[0] in \'"\\\'\\t \': d = d[1:]\n while d[-1] in \'"\\\'\\t \': d = d[:-1]\n dbg("Scope(%s)::docstr = %s" % (self,d))\n self.docstr = d\n\n def local(self,loc):\n self._checkexisting(loc)\n self.locals.append(loc)\n\n def copy_decl(self,indent=0):\n """ Copy a scope\'s declaration only, at the specified indent level - not local variables """\n return Scope(self.name,indent,self.docstr)\n\n def _checkexisting(self,test):\n "Convienance function... keep out duplicates"\n if test.find(\'=\') > -1:\n var = test.split(\'=\')[0].strip()\n for l in self.locals:\n if l.find(\'=\') > -1 and var == l.split(\'=\')[0].strip():\n self.locals.remove(l)\n\n def get_code(self):\n str = ""\n if len(self.docstr) > 0: str += \'"""\'+self.docstr+\'"""\\n\'\n for l in self.locals:\n if l.startswith(\'import\'): str += l+\'\\n\'\n str += \'class _PyCmplNoType:\\n def __getattr__(self,name):\\n return None\\n\'\n for sub in self.subscopes:\n str += sub.get_code()\n for l in self.locals:\n if not l.startswith(\'import\'): str += l+\'\\n\'\n\n return str\n\n def pop(self,indent):\n #print \'pop scope: [%s] to [%s]\' % (self.indent,indent)\n outer = self\n while outer.parent != None and outer.indent >= indent:\n outer = outer.parent\n return outer\n\n def currentindent(self):\n #print \'parse current indent: %s\' % self.indent\n return \' \'*self.indent\n\n def childindent(self):\n #print \'parse child indent: [%s]\' % (self.indent+1)\n return \' \'*(self.indent+1)\n\nclass Class(Scope):\n def __init__(self, name, supers, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.supers = supers\n def copy_decl(self,indent=0):\n c = Class(self.name,self.supers,indent, self.docstr)\n for s in self.subscopes:\n c.add(s.copy_decl(indent+1))\n return c\n def get_code(self):\n str = \'%sclass %s\' % (self.currentindent(),self.name)\n if len(self.supers) > 0: str += \'(%s)\' % \',\'.join(self.supers)\n str += \':\\n\'\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n if len(self.subscopes) > 0:\n for s in self.subscopes: str += s.get_code()\n else:\n str += \'%spass\\n\' % self.childindent()\n return str\n\n\nclass Function(Scope):\n def __init__(self, name, params, indent, docstr=\'\'):\n Scope.__init__(self,name,indent, docstr)\n self.params = params\n def copy_decl(self,indent=0):\n return Function(self.name,self.params,indent, self.docstr)\n def get_code(self):\n str = "%sdef %s(%s):\\n" % \\\n (self.currentindent(),self.name,\',\'.join(self.params))\n if len(self.docstr) > 0: str += self.childindent()+\'"""\'+self.docstr+\'"""\\n\'\n str += "%spass\\n" % self.childindent()\n return str\n\nclass PyParser:\n def __init__(self):\n self.top = Scope(\'global\',0)\n self.scope = self.top\n self.parserline = 0\n\n def _parsedotname(self,pre=None):\n #returns (dottedname, nexttoken)\n name = []\n if pre is None:\n tokentype, token, indent = self.next()\n if tokentype != NAME and token != \'*\':\n return (\'\', token)\n else: token = pre\n name.append(token)\n while True:\n tokentype, token, indent = self.next()\n if token != \'.\': break\n tokentype, token, indent = self.next()\n if tokentype != NAME: break\n name.append(token)\n return (".".join(name), token)\n\n def _parseimportlist(self):\n imports = []\n while True:\n name, token = self._parsedotname()\n if not name: break\n name2 = \'\'\n if token == \'as\': name2, token = self._parsedotname()\n imports.append((name, name2))\n while token != "," and "\\n" not in token:\n tokentype, token, indent = self.next()\n if token != ",": break\n return imports\n\n def _parenparse(self):\n name = \'\'\n names = []\n level = 1\n while True:\n tokentype, token, indent = self.next()\n if token in (\')\', \',\') and level == 1:\n if \'=\' not in name: name = name.replace(\' \', \'\')\n names.append(name.strip())\n name = \'\'\n if token == \'(\':\n level += 1\n name += "("\n elif token == \')\':\n level -= 1\n if level == 0: break\n else: name += ")"\n elif token == \',\' and level == 1:\n pass\n else:\n name += "%s " % str(token)\n return names\n\n def _parsefunction(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, fname, ind = self.next()\n if tokentype != NAME: return None\n\n tokentype, open, ind = self.next()\n if open != \'(\': return None\n params=self._parenparse()\n\n tokentype, colon, ind = self.next()\n if colon != \':\': return None\n\n return Function(fname,params,indent)\n\n def _parseclass(self,indent):\n self.scope=self.scope.pop(indent)\n tokentype, cname, ind = self.next()\n if tokentype != NAME: return None\n\n super = []\n tokentype, next, ind = self.next()\n if next == \'(\':\n super=self._parenparse()\n elif next != \':\': return None\n\n return Class(cname,super,indent)\n\n def _parseassignment(self):\n assign=\'\'\n tokentype, token, indent = self.next()\n if tokentype == tokenize.STRING or token == \'str\': \n return \'""\'\n elif token == \'(\' or token == \'tuple\':\n return \'()\'\n elif token == \'[\' or token == \'list\':\n return \'[]\'\n elif token == \'{\' or token == \'dict\':\n return \'{}\'\n elif tokentype == tokenize.NUMBER:\n return \'0\'\n elif token == \'open\' or token == \'file\':\n return \'file\'\n elif token == \'None\':\n return \'_PyCmplNoType()\'\n elif token == \'type\':\n return \'type(_PyCmplNoType)\' #only for method resolution\n else:\n assign += token\n level = 0\n while True:\n tokentype, token, indent = self.next()\n if token in (\'(\',\'{\',\'[\'):\n level += 1\n elif token in (\']\',\'}\',\')\'):\n level -= 1\n if level == 0: break\n elif level == 0:\n if token in (\';\',\'\\n\'): break\n assign += token\n return "%s" % assign\n\n def next(self):\n type, token, (lineno, indent), end, self.parserline = self.gen.next()\n if lineno == self.curline:\n #print \'line found [%s] scope=%s\' % (line.replace(\'\\n\',\'\'),self.scope.name)\n self.currentscope = self.scope\n return (type, token, indent)\n\n def _adjustvisibility(self):\n newscope = Scope(\'result\',0)\n scp = self.currentscope\n while scp != None:\n if type(scp) == Function:\n slice = 0\n #Handle \'self\' params\n if scp.parent != None and type(scp.parent) == Class:\n slice = 1\n newscope.local(\'%s = %s\' % (scp.params[0],scp.parent.name))\n for p in scp.params[slice:]:\n i = p.find(\'=\')\n if len(p) == 0: continue\n pvar = \'\'\n ptype = \'\'\n if i == -1:\n pvar = p\n ptype = \'_PyCmplNoType()\'\n else:\n pvar = p[:i]\n ptype = _sanitize(p[i+1:])\n if pvar.startswith(\'**\'):\n pvar = pvar[2:]\n ptype = \'{}\'\n elif pvar.startswith(\'*\'):\n pvar = pvar[1:]\n ptype = \'[]\'\n\n newscope.local(\'%s = %s\' % (pvar,ptype))\n\n for s in scp.subscopes:\n ns = s.copy_decl(0)\n newscope.add(ns)\n for l in scp.locals: newscope.local(l)\n scp = scp.parent\n\n self.currentscope = newscope\n return self.currentscope\n\n #p.parse(vim.current.buffer[:],vim.eval("line(\'.\')"))\n def parse(self,text,curline=0):\n self.curline = int(curline)\n buf = cStringIO.StringIO(\'\'.join(text) + \'\\n\')\n self.gen = tokenize.generate_tokens(buf.readline)\n self.currentscope = self.scope\n\n try:\n freshscope=True\n while True:\n tokentype, token, indent = self.next()\n #dbg( \'main: token=[%s] indent=[%s]\' % (token,indent))\n\n if tokentype == DEDENT or token == "pass":\n self.scope = self.scope.pop(indent)\n elif token == \'def\':\n func = self._parsefunction(indent)\n if func is None:\n print "function: syntax error..."\n continue\n dbg("new scope: function")\n freshscope = True\n self.scope = self.scope.add(func)\n elif token == \'class\':\n cls = self._parseclass(indent)\n if cls is None:\n print "class: syntax error..."\n continue\n freshscope = True\n dbg("new scope: class")\n self.scope = self.scope.add(cls)\n \n elif token == \'import\':\n imports = self._parseimportlist()\n for mod, alias in imports:\n loc = "import %s" % mod\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif token == \'from\':\n mod, token = self._parsedotname()\n if not mod or token != "import":\n print "from: syntax error..."\n continue\n names = self._parseimportlist()\n for name, alias in names:\n loc = "from %s import %s" % (mod,name)\n if len(alias) > 0: loc += " as %s" % alias\n self.scope.local(loc)\n freshscope = False\n elif tokentype == STRING:\n if freshscope: self.scope.doc(token)\n elif tokentype == NAME:\n name,token = self._parsedotname(token) \n if token == \'=\':\n stmt = self._parseassignment()\n dbg("parseassignment: %s = %s" % (name, stmt))\n if stmt != None:\n self.scope.local("%s = %s" % (name,stmt))\n freshscope = False\n except StopIteration: #thrown on EOF\n pass\n except:\n dbg("parse error: %s, %s @ %s" %\n (sys.exc_info()[0], sys.exc_info()[1], self.parserline))\n return self._adjustvisibility()\n\ndef _sanitize(str):\n val = \'\'\n level = 0\n for c in str:\n if c in (\'(\',\'{\',\'[\'):\n level += 1\n elif c in (\']\',\'}\',\')\'):\n level -= 1\n elif level == 0:\n val += c\n return val\n\nsys.path.extend([\'.\',\'..\'])\n', 4, 4]' returns: None 2017-01-18 11:10:12,216 [DEBUG @ session.py:handler:187] 4117 - greenlet finished executing, sending None as response 2017-01-18 11:10:12,216 [DEBUG @ async_session.py:send:133] 4117 - sending response to request 2: [1, 2, None, None] 2017-01-18 11:10:12,216 [DEBUG @ msgpack_stream.py:send:33] 4117 - sent [1, 2, None, None] 2017-01-18 11:10:12,216 [DEBUG @ base.py:send:113] 4117 - Sending '' 2017-01-18 11:10:12,216 [DEBUG @ session.py:handler:197] 4117 - greenlet is now dying... 2017-01-18 11:10:12,216 [DEBUG @ msgpack_stream.py:_on_data:54] 4117 - waiting for message... 2017-01-18 11:10:12,216 [DEBUG @ msgpack_stream.py:_on_data:59] 4117 - unpacker needs more data... 2017-01-18 11:10:15,045 [DEBUG @ base.py:_on_signal:153] 4117 - Received SIGTERM 2017-01-18 11:10:15,045 [DEBUG @ base.py:stop:149] 4117 - Stopped event loop 2017-01-18 11:10:15,046 [DEBUG @ base.py:run:140] 4117 - Exited event loop