5
5
6
6
from ..compat import unicode_errors_default
7
7
8
+ __all__ = ()
9
+
10
+
11
+ class NvimError (Exception ):
12
+ pass
13
+
8
14
9
15
class Remote (object ):
10
16
@@ -26,7 +32,8 @@ def __init__(self, session, code_data):
26
32
self .handle = unpackb (code_data [1 ])
27
33
self .api = RemoteApi (self , self ._api_prefix )
28
34
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' )
30
37
self .options = RemoteMap (self , self ._api_prefix + 'get_option' ,
31
38
self ._api_prefix + 'set_option' )
32
39
@@ -65,8 +72,16 @@ def __getattr__(self, name):
65
72
return functools .partial (self ._obj .request , self ._api_prefix + name )
66
73
67
74
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
69
82
83
+
84
+ class RemoteMap (object ):
70
85
"""Represents a string->object map stored in Nvim.
71
86
72
87
This is the dict counterpart to the `RemoteSequence` class, but it is used
@@ -76,16 +91,23 @@ class RemoteMap(object):
76
91
It is used to provide a dict-like API to vim variables and options.
77
92
"""
78
93
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 ):
80
98
"""Initialize a RemoteMap with session, getter/setter."""
81
99
self ._get = functools .partial (obj .request , get_method )
82
- self ._set = None
83
100
if set_method :
84
101
self ._set = functools .partial (obj .request , set_method )
102
+ if del_method :
103
+ self ._del = functools .partial (obj .request , del_method )
85
104
86
105
def __getitem__ (self , key ):
87
106
"""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 )
89
111
90
112
def __setitem__ (self , key , value ):
91
113
"""Set a map value by key(if the setter was provided)."""
@@ -95,9 +117,12 @@ def __setitem__(self, key, value):
95
117
96
118
def __delitem__ (self , key ):
97
119
"""Delete a map value by associating None with the key."""
98
- if not self ._set :
120
+ if not self ._del :
99
121
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 )
101
126
102
127
def __contains__ (self , key ):
103
128
"""Check if key is present in the map."""
@@ -110,8 +135,8 @@ def __contains__(self, key):
110
135
def get (self , key , default = None ):
111
136
"""Return value for key if present, else a default value."""
112
137
try :
113
- return self ._get (key )
114
- except Exception :
138
+ return self .__getitem__ (key )
139
+ except KeyError :
115
140
return default
116
141
117
142
0 commit comments