FuzzyFilePath
FuzzyFilePath copied to clipboard
Python from completion not being erased and filled with spaces
"""
# from sub
"""
Console with debug:
FFP search s F:/SublimeText/Data ['py'] False
FFP 2 completions found
FFP CurrentState Abort -- view already updated
FFP SelectedTrigger {'auto': True, 'extensions': ['py'], 'replace_on_insert': [['^\\/', ''], ['\\/', '.'], ['^(.*)\\.py$', 'FuzzyFilePath.\\1']], 'prefix': ['from'], 'scope': '\\.python', 'relative': False}
FFP search sub F:/SublimeText/Data ['py'] False
FFP 2 completions found
FFP post cleanup path:' sub
"" ' ~~> ' sub
"" '
FFP CurrentState Abort -- view already updated
FFP CurrentState Abort -- view already updated
FFP CurrentState Abort -- view already updated
This only happens when the commit_completion
is triggered by an indirection like this:
class OverwriteCommitCompletionCommand(sublime_plugin.TextCommand):
def run(self, edit):
window = self.view.window()
window.run_command( "commit_completion" )
On autocompletion event, I call the command overwrite_commit_completion
which just calls the commit_completion
. This should be the same cause of the problem: https://github.com/sagold/FuzzyFilePath/issues/49 (FFP post cleanup path:' merge set ' ~~> ' merge set ')
Comment out this line on this package, fixes the problem:
https://github.com/sagold/FuzzyFilePath/blob/07387b6f8622d58f036428b28d34b35ce205c4d0/QueryCompletionListener.py#L86-L86
When the commit_completion
command is not redirected, this is the console output from my debugging:
start tracking: ``
start tracking: ``
finish tracking
expression: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5117), 'style': None, 'prefix': 'from', 'needle': 'sublime', 'word': 'sublime'}`
expression['needle']: `sublime`
diff['start']: ``
result 1: `sublime`
result 2: `sublime`
base_directory: `False`
replace_on_insert: `[['^\\/', ''], ['\\/', '.'], ['^(.*)\\.py$', 'FuzzyFilePath.\\1']]`
post_remove: ``, arguments: `{'b': 5117, 'string': 'sublime', 'a': 5110, 'move_cursor': True}`
end
When there is the mentioned redirection, this is the console output:
start tracking: ``
start tracking: ``
finish tracking
expression: `{'error': <_sre.SRE_Match object at 0x04E15480>, 'tagName': None, 'valid_needle': False, 'is_valid': False, 'region': (5110, 5117), 'style': None, 'prefix': 'from', 'needle': 'sub\n\n\n"', 'word': 'sub\n\n\n"'}`
expression['needle']: `sub
"`
diff['start']: ``
result 1: `sub
"`
result 2: `sub
"`
base_directory: `False`
replace_on_insert: `[['^\\/', ''], ['\\/', '.'], ['^(.*)\\.py$', 'FuzzyFilePath.\\1']]`
post_remove: ``, arguments: `{'b': 5117, 'string': 'sub\n\n\n"', 'a': 5110, 'move_cursor': True}`
end
Now I added more debugging power:
This is without the indirection:
position: `5113`
word_region: `(5110, 5113)`
line_region: `(5103, 5113)`
pre_region: `(5103, 5110)`
post_region: `(5113, 5113)`
line: `# from sub`
word: `sub`
pre: `# from `
post: ``
error: `None`
needle_region: `(5110, 5113)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x03A9A650>`
needle: `sub`
separator: ` `
pre_match: ``
needle_region: `(5110, 5113)`
pre_quotes 3: `<_sre.SRE_Match object at 0x03A9A650>`
post_quotes: `<_sre.SRE_Match object at 0x08B92DA0>`
needle: `sub`
needle_region: `(5110, 5113)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x053BB760>`
prefix 2: `<_sre.SRE_Match object at 0x053BB760>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `True`
valid_needle: `True`
results: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5113), 'style': None, 'prefix': 'from', 'needle': 'sub', 'word': 'sub'}`
start tracking: ``
position: `5113`
word_region: `(5110, 5113)`
line_region: `(5103, 5113)`
pre_region: `(5103, 5110)`
post_region: `(5113, 5113)`
line: `# from sub`
word: `sub`
pre: `# from `
post: ``
error: `None`
needle_region: `(5110, 5113)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x03A9A458>`
needle: `sub`
separator: ` `
pre_match: ``
needle_region: `(5110, 5113)`
pre_quotes 3: `<_sre.SRE_Match object at 0x03A9A458>`
post_quotes: `<_sre.SRE_Match object at 0x053BB760>`
needle: `sub`
needle_region: `(5110, 5113)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x053BB720>`
prefix 2: `<_sre.SRE_Match object at 0x053BB720>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `True`
valid_needle: `True`
results: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5113), 'style': None, 'prefix': 'from', 'needle': 'sub', 'word': 'sub'}`
position: `5113`
word_region: `(5110, 5113)`
line_region: `(5103, 5113)`
pre_region: `(5103, 5110)`
post_region: `(5113, 5113)`
line: `# from sub`
word: `sub`
pre: `# from `
post: ``
error: `None`
needle_region: `(5110, 5113)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x03940F98>`
needle: `sub`
separator: ` `
pre_match: ``
needle_region: `(5110, 5113)`
pre_quotes 3: `<_sre.SRE_Match object at 0x03940F98>`
post_quotes: `<_sre.SRE_Match object at 0x08B92DA0>`
needle: `sub`
needle_region: `(5110, 5113)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x053BB760>`
prefix 2: `<_sre.SRE_Match object at 0x053BB760>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `True`
valid_needle: `True`
results: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5113), 'style': None, 'prefix': 'from', 'needle': 'sub', 'word': 'sub'}`
start tracking: ``
finish tracking
position: `5117`
word_region: `(5110, 5117)`
line_region: `(5103, 5117)`
pre_region: `(5103, 5110)`
post_region: `(5117, 5117)`
line: `# from sublime`
word: `sublime`
pre: `# from `
post: ``
error: `None`
needle_region: `(5110, 5117)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x03A9A458>`
needle: `sublime`
separator: ` `
pre_match: ``
needle_region: `(5110, 5117)`
pre_quotes 3: `<_sre.SRE_Match object at 0x03A9A458>`
post_quotes: `<_sre.SRE_Match object at 0x08B92DA0>`
needle: `sublime`
needle_region: `(5110, 5117)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x053BB760>`
prefix 2: `<_sre.SRE_Match object at 0x053BB760>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `True`
valid_needle: `True`
results: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5117), 'style': None, 'prefix': 'from', 'needle': 'sublime', 'word': 'sublime'}`
end
This is with the indirection:
position: `5113`
word_region: `(5110, 5113)`
line_region: `(5103, 5113)`
pre_region: `(5103, 5110)`
post_region: `(5113, 5113)`
line: `# from sub`
word: `sub`
pre: `# from `
post: ``
error: `None`
needle_region: `(5110, 5113)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x062F64A0>`
needle: `sub`
separator: ` `
pre_match: ``
needle_region: `(5110, 5113)`
pre_quotes 3: `<_sre.SRE_Match object at 0x062F64A0>`
post_quotes: `<_sre.SRE_Match object at 0x052A7460>`
needle: `sub`
needle_region: `(5110, 5113)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x08B92CE0>`
prefix 2: `<_sre.SRE_Match object at 0x08B92CE0>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `True`
valid_needle: `True`
results: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5113), 'style': None, 'prefix': 'from', 'needle': 'sub', 'word': 'sub'}`
start tracking: ``
position: `5113`
word_region: `(5110, 5113)`
line_region: `(5103, 5113)`
pre_region: `(5103, 5110)`
post_region: `(5113, 5113)`
line: `# from sub`
word: `sub`
pre: `# from `
post: ``
error: `None`
needle_region: `(5110, 5113)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x04E18A40>`
needle: `sub`
separator: ` `
pre_match: ``
needle_region: `(5110, 5113)`
pre_quotes 3: `<_sre.SRE_Match object at 0x04E18A40>`
post_quotes: `<_sre.SRE_Match object at 0x08B92CE0>`
needle: `sub`
needle_region: `(5110, 5113)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x08B926A0>`
prefix 2: `<_sre.SRE_Match object at 0x08B926A0>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `True`
valid_needle: `True`
results: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5113), 'style': None, 'prefix': 'from', 'needle': 'sub', 'word': 'sub'}`
position: `5113`
word_region: `(5110, 5113)`
line_region: `(5103, 5113)`
pre_region: `(5103, 5110)`
post_region: `(5113, 5113)`
line: `# from sub`
word: `sub`
pre: `# from `
post: ``
error: `None`
needle_region: `(5110, 5113)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x06555F98>`
needle: `sub`
separator: ` `
pre_match: ``
needle_region: `(5110, 5113)`
pre_quotes 3: `<_sre.SRE_Match object at 0x06555F98>`
post_quotes: `<_sre.SRE_Match object at 0x052A7460>`
needle: `sub`
needle_region: `(5110, 5113)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x08B92CE0>`
prefix 2: `<_sre.SRE_Match object at 0x08B92CE0>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `True`
valid_needle: `True`
results: `{'error': None, 'tagName': None, 'valid_needle': True, 'is_valid': True, 'region': (5110, 5113), 'style': None, 'prefix': 'from', 'needle': 'sub', 'word': 'sub'}`
start tracking: ``
finish tracking
position: `5117`
word_region: `(5110, 5117)`
line_region: `(5103, 5117)`
pre_region: `(5103, 5110)`
post_region: `(5117, 5117)`
line: `# from sub
"`
word: `sub
"`
pre: `# from `
post: ``
error: `<_sre.SRE_Match object at 0x05D276B0>`
needle_region: `(5110, 5117)`
pre_quotes 1: `None`
pre_quotes 2: `<_sre.SRE_Match object at 0x04E18A40>`
needle: `sub
"`
separator: ` `
pre_match: ``
needle_region: `(5110, 5117)`
pre_quotes 3: `<_sre.SRE_Match object at 0x04E18A40>`
post_quotes: `<_sre.SRE_Match object at 0x052A7460>`
needle: `sub
"`
needle_region: `(5110, 5117)`
valid: `True`
prefix_line: `# from`
prefix_region: `(5103, 5109)`
prefix 1: `<_sre.SRE_Match object at 0x08B92CE0>`
prefix 2: `<_sre.SRE_Match object at 0x08B92CE0>`
prefix 3: `from`
tag 1: `None`
tag 2: `None`
propertyName 1: `None`
propertyName 2: `None`
valid: `False`
valid_needle: `False`
results: `{'error': <_sre.SRE_Match object at 0x05D276B0>, 'tagName': None, 'valid_needle': False, 'is_valid': False, 'region': (5110, 5117), 'style': None, 'prefix': 'from', 'needle': 'sub\n\n\n"', 'word': 'sub\n\n\n"'}`
end
Patched function:
File: Data/Packages/FuzzyFilePath/expression.py
16: def get_context(view):
17: error = False
18: valid = True
19: valid_needle = True
20: position = Selection.get_position(view)
21:
22: print("position: `%s`" % position)
23:
24: # regions
25: word_region = view.word(position)
26: line_region = view.line(position)
27: pre_region = sublime.Region(line_region.a, word_region.a)
28: post_region = sublime.Region(word_region.b, line_region.b)
29:
30: print("word_region: `%s`" % word_region)
31: print("line_region: `%s`" % line_region)
32: print("pre_region: `%s`" % pre_region)
33: print("post_region: `%s`" % post_region)
34:
35: # text
36: line = view.substr(line_region)
37: word = view.substr(word_region)
38: pre = view.substr(pre_region)
39: post = view.substr(post_region)
40:
41: print("line: `%s`" % line)
42: print("word: `%s`" % word)
43: print("pre: `%s`" % pre)
44: print("post: `%s`" % post)
45:
46: error = re.search("[" + NEEDLE_INVALID_CHARACTERS + "]", word)
47: needle_region = view.word(position)
48:
49: print("error: `%s`" % error)
50: print("needle_region: `%s`" % needle_region)
51:
52: # grab everything in 'separators'
53: needle = ""
54: separator = False
55: pre_match = ""
56: # search for a separator before current word, i.e. <">path/to/<position>
57: pre_quotes = re.search("(["+NEEDLE_SEPARATOR_BEFORE+"])([^"+NEEDLE_SEPARATOR+"]*)$", pre)
58:
59: print("pre_quotes 1: `%s`" % pre_quotes)
60:
61: if pre_quotes:
62: needle += pre_quotes.group(2) + word
63: separator = pre_quotes.group(1)
64: pre_match = pre_quotes.group(2)
65: needle_region.a -= len(pre_quotes.group(2))
66: else:
67: # use whitespace as separator
68: pre_quotes = re.search("(\s)([^"+NEEDLE_SEPARATOR+"\s]*)$", pre)
69: print("pre_quotes 2: `%s`" % pre_quotes)
70:
71: if pre_quotes:
72: needle = pre_quotes.group(2) + word
73: separator = pre_quotes.group(1)
74: pre_match = pre_quotes.group(2)
75: needle_region.a -= len(pre_quotes.group(2))
76:
77: print("needle: `%s`" % needle)
78: print("separator: `%s`" % separator)
79: print("pre_match: `%s`" % pre_match)
80: print("needle_region: `%s`" % needle_region)
81:
82: if pre_quotes:
83: post_quotes = re.search("^(["+NEEDLE_SEPARATOR_AFTER+"]*)", post)
84: if post_quotes:
85: needle += post_quotes.group(1)
86: needle_region.b += len(post_quotes.group(1))
87: else:
88: logger.verbose(ID, "no post quotes found => invalid")
89: valid = False
90: elif not re.search("["+NEEDLE_INVALID_CHARACTERS+"]", needle):
91: needle = pre + word
92: needle_region.a = pre_region.a
93: else:
94: needle = word
95:
96: print("pre_quotes 3: `%s`" % pre_quotes)
97: print("post_quotes: `%s`" % post_quotes)
98: print("needle: `%s`" % needle)
99: print("needle_region: `%s`" % needle_region)
100: print("valid: `%s`" % valid)
101:
102: # grab prefix
103: prefix_region = sublime.Region(line_region.a, pre_region.b - len(pre_match) - 1)
104: prefix_line = view.substr(prefix_region)
105: # # print("prefix line", prefix_line)
106:
107: print("prefix_line: `%s`" % prefix_line)
108: print("prefix_region: `%s`" % prefix_region)
109:
110: #define? (["...", "..."]) -> before?
111: # before: ABC =:([
112: prefix = re.search("\s*(["+NEEDLE_CHARACTERS+"]+)["+DELIMITER+"]*$", prefix_line)
113:
114: print("prefix 1: `%s`" % prefix)
115:
116: if prefix is None:
117: # validate array, like define(["...", ".CURSOR."])
118: prefix = re.search("^\s*(["+NEEDLE_CHARACTERS+"]+)["+DELIMITER+"]+", prefix_line)
119:
120: print("prefix 2: `%s`" % prefix)
121:
122: if prefix:
123: # print("prefix:", prefix.group(1))
124: prefix = prefix.group(1)
125:
126: print("prefix 3: `%s`" % prefix)
127:
128: tag = re.search("<\s*(["+NEEDLE_CHARACTERS+"]*)\s*[^>]*$", prefix_line)
129: print("tag 1: `%s`" % tag)
130:
131: if tag:
132: tag = tag.group(1)
133: # print("tag:", tag)
134:
135: propertyName = re.search("[\s\"\'']*(["+NEEDLE_CHARACTERS+"]*)[\s\"\']*\:[^\:]*$", prefix_line)
136:
137: print("tag 2: `%s`" % tag)
138: print("propertyName 1: `%s`" % propertyName)
139:
140: if propertyName:
141: propertyName = propertyName.group(1)
142: # print("style:", style)
143:
144: print("propertyName 2: `%s`" % propertyName)
145:
146: if separator is False:
147: logger.verbose(ID, "separator undefined => invalid", needle)
148: valid_needle = False
149: valid = False
150: elif re.search("["+NEEDLE_INVALID_CHARACTERS+"]", needle):
151: logger.verbose(ID, "invalid characters in needle => invalid", needle)
152: valid_needle = False
153: valid = False
154: elif prefix is None and separator.strip() == "":
155: logger.verbose(ID, "prefix undefined => invalid", needle)
156: valid = False
157:
158: print("valid: `%s`" % valid)
159: print("valid_needle: `%s`" % valid_needle)
160:
161: results = {
162: "is_valid": valid,
163: "valid_needle": valid_needle,
164: "needle": needle,
165: "prefix": prefix,
166: "tagName": tag,
167: "style": propertyName,
168: "region": needle_region,
169: "word": word,
170: # really do not use any of this
171: "error": error
172: }
173:
174: print("results: `%s`" % results)
175: return results
Comparing both full debugging outputs we see that the only difference is the line contents. The start and end points are correct on both cases, but while using the completion indirection by a window command, the view.substr
does not return the inserted text, but the old contents on the position before the completion take place.