66from ..compat import unicode_errors_default
77
88
9+ class NvimError (Exception ):
10+ pass
11+
12+
913class Remote (object ):
1014
1115 """Base class for Nvim objects(buffer/window/tabpage).
@@ -26,7 +30,8 @@ def __init__(self, session, code_data):
2630 self .handle = unpackb (code_data [1 ])
2731 self .api = RemoteApi (self , self ._api_prefix )
2832 self .vars = RemoteMap (self , self ._api_prefix + 'get_var' ,
29- self ._api_prefix + 'set_var' )
33+ self ._api_prefix + 'set_var' ,
34+ self ._api_prefix + 'del_var' )
3035 self .options = RemoteMap (self , self ._api_prefix + 'get_option' ,
3136 self ._api_prefix + 'set_option' )
3237
@@ -65,8 +70,16 @@ def __getattr__(self, name):
6570 return functools .partial (self ._obj .request , self ._api_prefix + name )
6671
6772
68- class RemoteMap (object ):
73+ def transform_keyerror (exc ):
74+ if isinstance (exc , NvimError ):
75+ if exc .args [0 ].startswith ('Key not found:' ):
76+ return KeyError (exc .args [0 ])
77+ if exc .args [0 ].startswith ('Invalid option name:' ):
78+ return KeyError (exc .args [0 ])
79+ return exc
6980
81+
82+ class RemoteMap (object ):
7083 """Represents a string->object map stored in Nvim.
7184
7285 This is the dict counterpart to the `RemoteSequence` class, but it is used
@@ -75,17 +88,23 @@ class RemoteMap(object):
7588
7689 It is used to provide a dict-like API to vim variables and options.
7790 """
91+ _set = None
92+ _del = None
7893
79- def __init__ (self , obj , get_method , set_method = None ):
94+ def __init__ (self , obj , get_method , set_method = None , del_method = None ):
8095 """Initialize a RemoteMap with session, getter/setter."""
8196 self ._get = functools .partial (obj .request , get_method )
82- self ._set = None
8397 if set_method :
8498 self ._set = functools .partial (obj .request , set_method )
99+ if del_method :
100+ self ._del = functools .partial (obj .request , del_method )
85101
86102 def __getitem__ (self , key ):
87103 """Return a map value by key."""
88- return self ._get (key )
104+ try :
105+ return self ._get (key )
106+ except NvimError as exc :
107+ raise transform_keyerror (exc )
89108
90109 def __setitem__ (self , key , value ):
91110 """Set a map value by key(if the setter was provided)."""
@@ -95,9 +114,12 @@ def __setitem__(self, key, value):
95114
96115 def __delitem__ (self , key ):
97116 """Delete a map value by associating None with the key."""
98- if not self ._set :
117+ if not self ._del :
99118 raise TypeError ('This dict is read-only' )
100- return self ._set (key , None )
119+ try :
120+ return self ._del (key )
121+ except NvimError as exc :
122+ raise transform_keyerror (exc )
101123
102124 def __contains__ (self , key ):
103125 """Check if key is present in the map."""
@@ -110,8 +132,8 @@ def __contains__(self, key):
110132 def get (self , key , default = None ):
111133 """Return value for key if present, else a default value."""
112134 try :
113- return self ._get (key )
114- except Exception :
135+ return self .__getitem__ (key )
136+ except KeyError :
115137 return default
116138
117139
0 commit comments