如何使用 Sublime Text 2 或 Sublime Text 3 在新行中自动添加增加的数字?
How to automatically add an increased number inside of a string on a new line with SublimeText2 or SublimeText3?
我正在处理一些 mIRC 脚本,该脚本需要在每一行上添加一个前置字符串,如果有的话,后面跟着一个从上一行中包含的数字增加的行号。
示例:
[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=
有什么方法可以实现吗?
插件可以做这种事。基本上我们想要的是当行的开头包含 n*=
时覆盖 enter 的正常行为,其中 *
是一个数字。为此,我们需要一个实现 on_query_context
方法的自定义 EventListener
和一个在满足上下文时运行的自定义命令。
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+=)"
}
],
}
我不会详细介绍该插件的工作原理。完成这项工作所需要做的就是按照 gist.
中给出的说明进行操作
这是它的动图:-
注意事项是:-
- 它不尊重您请求的
[ips]
部分,因为我认为这会使插件不必要地复杂化。
- 它只查看当前行,查看
n
和 =
之间的数字并相应地为下一行递增。所以这样的行是否已经存在并不聪明。
希望这能满足您的要求。
我正在处理一些 mIRC 脚本,该脚本需要在每一行上添加一个前置字符串,如果有的话,后面跟着一个从上一行中包含的数字增加的行号。
示例:
[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=
有什么方法可以实现吗?
插件可以做这种事。基本上我们想要的是当行的开头包含 n*=
时覆盖 enter 的正常行为,其中 *
是一个数字。为此,我们需要一个实现 on_query_context
方法的自定义 EventListener
和一个在满足上下文时运行的自定义命令。
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+=)"
}
],
}
我不会详细介绍该插件的工作原理。完成这项工作所需要做的就是按照 gist.
中给出的说明进行操作这是它的动图:-
- 它不尊重您请求的
[ips]
部分,因为我认为这会使插件不必要地复杂化。 - 它只查看当前行,查看
n
和=
之间的数字并相应地为下一行递增。所以这样的行是否已经存在并不聪明。
希望这能满足您的要求。