Плагин может делать такие вещи. По сути, мы хотим переопределить нормальное поведение , введите , если в начале строки содержится n*=
, где *
- число. Для этого нам требуется пользовательский EventListener
, который реализует метод on_query_context
, и пользовательская команда, которая выполняется при выполнении контекста.
import re
import sublime
import sublime_plugin
class MrcScriptEventListener(sublime_plugin.EventListener):
""" A custom event listener that implements an on_query_context method which checks to see if
the start of the line if of the form n*= where * = number.
"""
def on_query_context(self, view, key, operator, operand, match_all):
current_pt = view.sel()[0].begin()
desired = view.substr(view.line(view.sel()[0].begin()))
if key != "mrc_script":
return None
if operator != sublime.OP_REGEX_MATCH:
return None
if operator == sublime.OP_REGEX_MATCH:
return re.search(operand, desired)
return None
class MrcScriptCommand(sublime_plugin.TextCommand):
""" A custom command that is executed when the context set by the MrcScript event listener
is fulfilled.
"""
def run(self, edit):
current_line = self.view.substr(self.view.line(self.view.sel()[0].begin()))
match_pattern = r"^(n\d+=)"
if re.search(match_pattern, current_line):
num = int(re.match(match_pattern, current_line).groups()[0][1:-1]) + 1
self.view.run_command("insert", {
"characters": "\nn{}=".format(num)
})
else:
return
Привязка ключей выглядит следующим образом: -
{
"keys": ["enter"],
"command": "mrc_script",
"context": [
{
"key": "mrc_script",
"operator": "regex_match",
"operand": "^(n\\d+=)"
}
],
}
Я не буду go подробно рассказывать, как работает этот плагин. Все, что требуется для этой работы, - это следовать инструкциям, приведенным в этом gist .
Вот гиф этого в действии: -
Предостережения: -
- Это не учитывает
[ips]
часть вашего запроса, так как я думаю, что это сделает плагин излишне сложным. - Это просто смотрит на текущую строку, видит число между
n
& =
и увеличивает его соответственно для следующей строки. Так что не стоит задумываться о том, присутствует ли такая линия или нет.
Надеюсь, это соответствует вашим требованиям.