Skip to content

Commit 28190e8

Browse files
committed
Fix Double Quote on selections #9
1 parent a6ad21b commit 28190e8

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

paredit.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,31 @@ def close_bracket(view, edit, close_bracket):
7171

7272
def double_quote(view, edit):
7373
for region, sel in iterate(view):
74-
begin = region.begin()
75-
end = region.end()
76-
77-
if view.substr(end) == '"':
78-
sel.append(sublime.Region(end + 1, end + 1))
79-
elif sexp.inside_string(view, begin):
80-
view.insert(edit, begin, '\\"')
81-
elif sexp.inside_comment(view, begin):
82-
view.insert(edit, begin, '"')
74+
if region.empty():
75+
begin = region.begin()
76+
end = region.end()
77+
78+
if view.substr(end) == '"':
79+
sel.append(sublime.Region(end + 1, end + 1))
80+
elif sexp.inside_string(view, begin):
81+
view.insert(edit, begin, '\\"')
82+
elif sexp.inside_comment(view, begin):
83+
view.insert(edit, begin, '"')
84+
else:
85+
view.insert(edit, begin, '""')
86+
sel.append(sublime.Region(end + 1, end + 1))
8387
else:
84-
view.insert(edit, begin, '""')
85-
sel.append(sublime.Region(end + 1, end + 1))
88+
this = sexp.innermost(view, region.begin(), edge=False)
89+
that = sexp.innermost(view, region.end(), edge=False)
90+
91+
if this == that:
92+
view.insert(edit, region.end(), '"')
93+
view.insert(edit, region.begin(), '"')
94+
else:
95+
# If the two ends of the region are inside different sexps, abort and insert double
96+
# quotes at the beginning of the region.
97+
view.insert(edit, region.begin(), '""')
98+
sel.append(region.begin() + 1)
8699

87100

88101
def has_null_character(view, point):

sexp.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def absorb_macro_characters(self, region):
3232

3333
return Region(begin, region.end())
3434

35+
def __eq__(self, other):
36+
return other and self.extent() == other.extent()
37+
3538

3639
def inside_string(view, point):
3740
return view.match_selector(

tests/test_paredit.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,20 @@ def test_double_quote_simple(self):
170170
self.assertEquals('""', self.view_content())
171171
self.assertEquals(self.selections(), [(1, 1)])
172172

173+
def test_double_quote_selection(self):
174+
self.set_view_content('(foo)')
175+
self.set_selections((1, 4))
176+
self.view.run_command('tutkain_paredit_double_quote')
177+
self.assertEquals('("foo")', self.view_content())
178+
self.assertEquals(self.selections(), [(2, 5)])
179+
180+
def test_double_quote_selection_across_sexps(self):
181+
self.set_view_content('(foo) (bar)')
182+
self.set_selections((4, 9))
183+
self.view.run_command('tutkain_paredit_double_quote')
184+
self.assertEquals('(foo"") (bar)', self.view_content())
185+
self.assertEquals(self.selections(), [(5, 5)])
186+
173187
def test_double_quote_inside_string(self):
174188
self.set_view_content('" "')
175189
self.set_selections((1, 1))

0 commit comments

Comments
 (0)