Как автоматически добавить увеличенное число внутри строки в новой строке с помощью SublimeText2 или SublimeText3? - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над некоторым сценарием mIR C, для которого требовалась строка с добавлением в каждой строке, за которой следовал бы номер строки, увеличенный по сравнению с номером, содержащимся в предыдущей строке, если он есть.

пример:

[ips]

[urls]
n0=1:mIRC NewsURL:http://www.mirc.com/news.html
n1=2:mIRC RegisterURL:http://www.mirc.com/register.html
n2=3:mIRC HelpURL:http://www.mirc.com/help.html

Итак, если я нахожусь на первой строке: [ips] (которая не начинается с шаблона n*=) и я нажимаю ENTER, я бы хотел, чтобы следующая строка была добавлена с n0=

Но, если я нахожусь на последней строке n2=3:mIRC HelpURL:http://www.mirc.com/help.html (которая начинается с шаблона n*=) и нажимаю ENTER, я бы хотел, чтобы к следующей строке предшествовал n3=

Есть ли способ, чтобы это произошло?

1 Ответ

1 голос
/ 08 апреля 2020

Плагин может делать такие вещи. По сути, мы хотим переопределить нормальное поведение , введите , если в начале строки содержится 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 .

Вот гиф этого в действии: -

enter image description here Предостережения: -

  1. Это не учитывает [ips] часть вашего запроса, так как я думаю, что это сделает плагин излишне сложным.
  2. Это просто смотрит на текущую строку, видит число между n & = и увеличивает его соответственно для следующей строки. Так что не стоит задумываться о том, присутствует ли такая линия или нет.

Надеюсь, это соответствует вашим требованиям.

...