73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
import sublime, sublime_plugin
|
|
|
|
def clamp(xmin, x, xmax):
|
|
if x < xmin:
|
|
return xmin
|
|
if x > xmax:
|
|
return xmax
|
|
return x;
|
|
|
|
class DeleteWordCommand(sublime_plugin.TextCommand):
|
|
|
|
def find_by_class(self, pt, classes, forward):
|
|
if forward:
|
|
delta = 1
|
|
end_position = self.view.size()
|
|
if pt > end_position:
|
|
pt = end_position
|
|
else:
|
|
delta = -1
|
|
end_position = 0
|
|
if pt < end_position:
|
|
pt = end_position
|
|
|
|
while pt != end_position:
|
|
if self.view.classify(pt) & classes != 0:
|
|
return pt
|
|
pt += delta
|
|
|
|
return pt
|
|
|
|
def expand_word(self, view, pos, classes, forward):
|
|
if forward:
|
|
delta = 1
|
|
else:
|
|
delta = -1
|
|
ws = ["\t", " "]
|
|
|
|
if forward:
|
|
if view.substr(pos) in ws and view.substr(pos + 1) in ws:
|
|
classes = sublime.CLASS_WORD_START | sublime.CLASS_PUNCTUATION_START | sublime.CLASS_LINE_END
|
|
else:
|
|
if view.substr(pos - 1) in ws and view.substr(pos - 2) in ws:
|
|
classes = sublime.CLASS_WORD_END | sublime.CLASS_PUNCTUATION_END | sublime.CLASS_LINE_START
|
|
|
|
return sublime.Region(pos, self.find_by_class(pos + delta, classes, forward))
|
|
|
|
def run(self, edit, forward = True, sub_words = False):
|
|
|
|
if forward:
|
|
classes = sublime.CLASS_WORD_END | sublime.CLASS_PUNCTUATION_END | sublime.CLASS_LINE_START
|
|
if sub_words:
|
|
classes |= sublime.CLASS_SUB_WORD_END
|
|
else:
|
|
classes = sublime.CLASS_WORD_START | sublime.CLASS_PUNCTUATION_START | sublime.CLASS_LINE_END
|
|
if sub_words:
|
|
classes |= sublime.CLASS_SUB_WORD_START
|
|
|
|
new_sels = []
|
|
for s in reversed(self.view.sel()):
|
|
if s.empty():
|
|
new_sels.append(self.expand_word(self.view, s.b, classes, forward))
|
|
|
|
sz = self.view.size()
|
|
for s in new_sels:
|
|
self.view.sel().add(sublime.Region(clamp(0, s.a, sz),
|
|
clamp(0, s.b, sz)))
|
|
|
|
self.view.run_command("add_to_kill_ring", {"forward": forward})
|
|
|
|
if forward:
|
|
self.view.run_command('right_delete')
|
|
else:
|
|
self.view.run_command('left_delete')
|