-
Notifications
You must be signed in to change notification settings - Fork 0
/
listener.py
72 lines (59 loc) · 2.58 KB
/
listener.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import sys
import sublime
import sublime_plugin
if sys.version_info[0] >= 3:
from .wrap_fixer import WrapFixer
else:
from wrap_fixer import WrapFixer
class WrapAsYouTypeListener(sublime_plugin.EventListener):
"""An EventListener for the WrapAsYouType plugin.
WrapAsYouTypeListener listens for changes to views and runs the
wrap_as_you_type command as appropriate.
"""
# Private attributes:
# bool _is_running: Whether on_modified is currently being called.
def __init__(self):
super(WrapAsYouTypeListener, self).__init__()
self._is_running = False
def on_modified(self, view):
wrap_fixer = WrapFixer.instance(view)
wrap_fixer.on_modified()
if self._is_running:
# Avoid recursively running a second wrap_as_you_type command
# inside of an initial wrap_as_you_type command
return
self._is_running = True
try:
if (not view.settings().get('wrap_as_you_type_disabled') and
# Don't run the wrap_as_you_type command in response to an
# undo command (or a redo command other than redoing
# everything)
not view.command_history(1)[0]):
last_command = view.command_history(0)[0]
if (last_command not in ('swap_line_up', 'swap_line_down') and
# It is important to refrain from running the
# wrap_as_you_type command if there is no word wrap
# fixup to perform. Otherwise, Sublime creates an undo
# entry for every single keystroke.
wrap_fixer.has_edit()):
view.run_command('wrap_as_you_type')
wrap_fixer.on_post_modification()
finally:
self._is_running = False
def on_selection_modified(self, view):
WrapFixer.instance(view).on_selection_modified()
def on_close(self, view):
WrapFixer.clear_instance(view)
def on_query_context(self, view, key, operator, operand, match_all):
if key != 'wrap_as_you_type_extend_section':
return None
else:
result = WrapFixer.instance(view).should_extend_section()
if operator == sublime.OP_EQUAL:
return result == operand
elif operator == sublime.OP_NOT_EQUAL:
return result != operand
else:
return (
operator == sublime.OP_NOT_REGEX_MATCH or
operator == sublime.OP_NOT_REGEX_CONTAINS)