57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
import json
|
|
import socket
|
|
import sys
|
|
import os
|
|
import threading
|
|
import vim
|
|
import logging
|
|
import msgpack
|
|
import neovim_rpc_server_api_info
|
|
import neovim_rpc_methods
|
|
import threading
|
|
import socket
|
|
import time
|
|
from neovim.api.common import decode_if_bytes
|
|
|
|
BUFFER_TYPE = type(vim.current.buffer)
|
|
BUFFER_TYPE_ID = neovim_rpc_server_api_info.API_INFO['types']['Buffer']['id']
|
|
WINDOW_TYPE = type(vim.current.window)
|
|
WINDOW_TYPE_ID = neovim_rpc_server_api_info.API_INFO['types']['Window']['id']
|
|
|
|
def walk(fn, obj):
|
|
if type(obj) in [list, tuple, vim.List]:
|
|
return list(walk(fn, o) for o in obj)
|
|
if type(obj) in [dict, vim.Dictionary]:
|
|
return dict((walk(fn, k), walk(fn, v)) for k, v in
|
|
obj.items())
|
|
return fn(obj)
|
|
|
|
def from_client(msg):
|
|
|
|
def handler(obj):
|
|
if type(obj) is msgpack.ExtType:
|
|
if obj.code == BUFFER_TYPE_ID:
|
|
return vim.buffers[msgpack.unpackb(obj.data)]
|
|
if obj.code == WINDOW_TYPE_ID:
|
|
return vim.windows[msgpack.unpackb(obj.data) - 1]
|
|
elif obj is None:
|
|
return ''
|
|
if sys.version_info.major!=2:
|
|
# python3 needs decode
|
|
obj = decode_if_bytes(obj)
|
|
return obj
|
|
|
|
return walk(handler,msg)
|
|
|
|
def to_client(msg):
|
|
def handler( obj):
|
|
if type(obj) == BUFFER_TYPE:
|
|
return msgpack.ExtType(BUFFER_TYPE_ID, msgpack.packb(obj.number))
|
|
if type(obj) == WINDOW_TYPE:
|
|
return msgpack.ExtType(WINDOW_TYPE_ID, msgpack.packb(obj.number))
|
|
if type(obj) == vim.Function:
|
|
return obj.name
|
|
return obj
|
|
return walk(handler, msg)
|
|
|