55
66from ..compat import unicode_errors_default
77
8+ __all__ = ()
9+
10+
11+ class NvimError (Exception ):
12+ pass
13+
814
915class Remote (object ):
1016
@@ -26,7 +32,8 @@ def __init__(self, session, code_data):
2632 self .handle = unpackb (code_data [1 ])
2733 self .api = RemoteApi (self , self ._api_prefix )
2834 self .vars = RemoteMap (self , self ._api_prefix + 'get_var' ,
29- self ._api_prefix + 'set_var' )
35+ self ._api_prefix + 'set_var' ,
36+ self ._api_prefix + 'del_var' )
3037 self .options = RemoteMap (self , self ._api_prefix + 'get_option' ,
3138 self ._api_prefix + 'set_option' )
3239
@@ -65,8 +72,16 @@ def __getattr__(self, name):
6572 return functools .partial (self ._obj .request , self ._api_prefix + name )
6673
6774
68- class RemoteMap (object ):
75+ def transform_keyerror (exc ):
76+ if isinstance (exc , NvimError ):
77+ if exc .args [0 ].startswith ('Key not found:' ):
78+ return KeyError (exc .args [0 ])
79+ if exc .args [0 ].startswith ('Invalid option name:' ):
80+ return KeyError (exc .args [0 ])
81+ return exc
6982
83+
84+ class RemoteMap (object ):
7085 """Represents a string->object map stored in Nvim.
7186
7287 This is the dict counterpart to the `RemoteSequence` class, but it is used
@@ -76,16 +91,23 @@ class RemoteMap(object):
7691 It is used to provide a dict-like API to vim variables and options.
7792 """
7893
79- def __init__ (self , obj , get_method , set_method = None ):
94+ _set = None
95+ _del = None
96+
97+ def __init__ (self , obj , get_method , set_method = None , del_method = None ):
8098 """Initialize a RemoteMap with session, getter/setter."""
8199 self ._get = functools .partial (obj .request , get_method )
82- self ._set = None
83100 if set_method :
84101 self ._set = functools .partial (obj .request , set_method )
102+ if del_method :
103+ self ._del = functools .partial (obj .request , del_method )
85104
86105 def __getitem__ (self , key ):
87106 """Return a map value by key."""
88- return self ._get (key )
107+ try :
108+ return self ._get (key )
109+ except NvimError as exc :
110+ raise transform_keyerror (exc )
89111
90112 def __setitem__ (self , key , value ):
91113 """Set a map value by key(if the setter was provided)."""
@@ -95,9 +117,12 @@ def __setitem__(self, key, value):
95117
96118 def __delitem__ (self , key ):
97119 """Delete a map value by associating None with the key."""
98- if not self ._set :
120+ if not self ._del :
99121 raise TypeError ('This dict is read-only' )
100- return self ._set (key , None )
122+ try :
123+ return self ._del (key )
124+ except NvimError as exc :
125+ raise transform_keyerror (exc )
101126
102127 def __contains__ (self , key ):
103128 """Check if key is present in the map."""
@@ -110,8 +135,8 @@ def __contains__(self, key):
110135 def get (self , key , default = None ):
111136 """Return value for key if present, else a default value."""
112137 try :
113- return self ._get (key )
114- except Exception :
138+ return self .__getitem__ (key )
139+ except KeyError :
115140 return default
116141
117142
0 commit comments