Skip to content

Commit d0017b6

Browse files
committed
get this right
1 parent 9625fcc commit d0017b6

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

Lib/idlelib/editor.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,20 +1339,22 @@ def set_indentation_params(self, is_py_src, guess=True):
13391339
self.set_tk_tabwidth(self.tabwidth)
13401340

13411341
def delete_trail_whitespace(self, want, chars, tabwidth):
1342-
ncharsdeleted = 0
1343-
have = len(chars.expandtabs(tabwidth))
1344-
for i in range(len(chars) - 1, -1, -1):
1345-
# ``Delete'' chars[i], and subtract count
1346-
# (since redoing expandtabs is O(n))
1347-
ncharsdeleted += 1
1348-
if chars[i] == '\t':
1349-
have -= tabwidth
1342+
current_pos = 0
1343+
ncharsretained = 0
1344+
for char in chars:
1345+
if char == '\t':
1346+
current_pos = (current_pos // tabwidth + 1) * tabwidth
13501347
else:
1351-
have -= 1
1352-
if have <= want or chars[i-1] not in " \t":
1348+
current_pos += 1
1349+
ncharsretained += 1
1350+
if current_pos > want:
1351+
ncharsretained -= 1
13531352
break
1354-
chars = chars[:len(chars) - ncharsdeleted]
1355-
return ncharsdeleted, chars
1353+
for i in range(ncharsretained, len(chars)):
1354+
if chars[i] not in " \t":
1355+
ncharsretained = i + 1
1356+
chars = chars[:ncharsretained]
1357+
return len(chars) - ncharsretained, chars
13561358

13571359
def smart_backspace_event(self, event):
13581360
text = self.text

Lib/idlelib/idle_test/test_editor.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,11 @@ def test_delete_trail_whitespace(self):
244244
ew = Editor()
245245
test_str = "abcde" + 10000 * "\t" + 10000 * " "
246246
res_str = ew.delete_trail_whitespace(30000, test_str, 4)[1]
247-
self.assertEqual(res_str, "abcde" + 7498 * "\t")
247+
self.assertEqual(res_str, "abcde" + 7499 * "\t")
248248
res_str = ew.delete_trail_whitespace(41005, test_str, 4)[1]
249-
self.assertEqual(res_str, "abcde" + 10000 * "\t" + 1000 * " ")
250-
res_str = ew.delete_trail_whitespace(4, test_str, 4)[1]
251-
self.assertEqual(res_str, "abcd")
249+
self.assertEqual(res_str, "abcde" + 10000 * "\t" + 1001 * " ")
250+
res_str = ew.delete_trail_whitespace(3, test_str, 4)[1]
251+
self.assertEqual(res_str, "abcde")
252252

253253
if __name__ == '__main__':
254254
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)