我心爱的gedit R plugin是no longer maintained,我上次使用的强制downgrade solution突然停止工作,我上次更新了ubuntu。写作已经有一段时间了,我正在探索崇高的文本。我已经安装了REPL来将代码发送到命令行,我试图设置像他们习惯的键绑定。
特别是,我试图让CTRL + SHIFT + R向控制台发送一行代码,运行它,然后将编辑器中的光标向下移动到下一行。这样我可以多次按CTRL + SHIFT + R来逐行运行脚本。 (这类似于Rstudio&CTRL + Enter的行为)
谷歌搜索,我发现了这个(旧的)solution。它不起作用,可能是因为它是为崇高的文本2而写的。更多的谷歌搜索,我想出了如何让它几乎工作://This is a macro for evaluate and move down
[
{"command": "repl_transfer_current", "args": {"scope": "lines"}}
// {"command": "move", "args": {"mode": "lines", "amount": 1}}
]
以下是我添加到默认键盘映射的内容:
{ "keys": ["ctrl+shift+r"], "command": "run_macro_file", "args": {"file": "Packages/User/geditlike_lineeval.sublime-macro"}}
如上所述,sublime文本将我的代码行发送到终端并运行它。第二行应该向下发送光标,但它不起作用,当我取消注释时宏就失败了。
我似乎无法找到有关崇高文本命令的大量文档。 move
是'-----------------ISFSASHR------FSHAQADFAG'
中我能找到的最好的[1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 18, 18, 18]
。我的语法错了吗?我怎样才能做到这一点?
BONUS:如何让sublime文本运行该行,然后跳到下一个非空,非注释行。这似乎更难 - 我看到许多键绑定涉及正则表达式等。
修改 我的问题是我错过了JSON行之间的逗号。如果在行之间添加逗号,则在该github页面上链接的代码可以正常工作。
答案 0 :(得分:3)
您要链接到的解决方案应该在Sublime 2和3中工作(假设提供repl_transfer_current
命令的插件适用于两者),但由于宏不正确,因此无法正常工作格式化。
[编辑] Sublime本身提供的
move
命令不会接受宏正在使用的参数。据推测,如果这对你有用,那么某些包装也会提供这些东西。如果是这样,您可能需要相应调整下面的示例代码。 [/编辑]
目前的问题是,Sublime中的几乎(但不是全部)配置文件都是JSON格式(略微放宽以允许注释),上面列出的宏代码和链接的解决方案不是有效的JSON,因为它中的第一个和第二个命令没有用逗号分隔。
以下内容应该有效:
[
{"command": "repl_transfer_current", "args": {"scope": "lines"}},
{"command": "move", "args": {"mode": "lines", "amount": 1}}
]
我认为您上面链接的Sublime文档适用于Sublime 2.一个很好的资源是Unofficial Documentation,它还包含list of commands(以及许多其他好东西)。< / p>
为了做这样的事情并让它继续向下移动,直到它到达第一个非空白的非评论行,你需要一个简单的插件
具体来说,它必须向下移动光标(使用现有的move
命令),然后检查当前行以查看它是空白还是注释,如果是,则再次移动。然后,您可以使用该命令代替宏中的move
命令。
对于奖励分数,这里是一个插件的例子,它做了类似的事情。它比它需要的更冗长,以便它更有启发性,并且可能需要额外的调整(R不是我使用/知道的语言之一),但它应该让你开始。
有关其工作原理的更多信息,您可以查看API Reference以查看可在插件中使用的所有内部命令。
要使用此功能,请从菜单中选择Tools > Developer > New Plugin...
,然后用此处显示的插件代码替换显示的全部存根代码,并使用.py
扩展名保存(名称不重要) :
import sublime
import sublime_plugin
import re
# A regex that matches a line that's blank or contains a comment.
# Adjust as needed
_r_blank = re.compile("^\s*(#.*)?$")
class RAdvanceNextCommand(sublime_plugin.TextCommand):
def run(self, edit):
# Get the count of lines in the buffer so we know when to stop
last_line = self.line_at(self.view.size())
while True:
# Move to the next line
self.view.run_command("move", {"by": "lines", "forward": True})
# Get the current cursor position in the file
caret = self.view.sel()[0].begin()
# Get the new current line number
cur_line = self.line_at(caret)
# Get the contents of the current line
content = self.view.substr(self.view.line(caret))
# If the current line is the last line, or the contents of
# the current line does not match the regex, break out now.
if cur_line == last_line or not _r_blank.match(content):
break
# Jump to the start of the line
self.view.run_command("move_to", {"to": "bol"})
# Convert a 0 based offset into the file into a 0 based line in
# the file.
def line_at(self, point):
return self.view.rowcol(point)[0]
这实现了一个名为r_advance_next
的新命令,它将光标向下移动通过文件,跳过完全空白行或包含行注释的行(假设我的正则表达式符合要求)。
有了这个,你的宏看起来像这样:
[
{"command": "repl_transfer_current", "args": {"scope": "lines"}},
{"command": "r_advance_next"}
]
此外,您还可以使用以下键绑定。因为你使用 Control + Enter 提到了RStudio,这就是我在这里使用的。此绑定应用了一个上下文,以便它仅在当前文件是R文件时应用,以便在不合适时不会触发。
{ "keys": ["ctrl+enter"], "command": "run_macro_file",
"args": {"file": "Packages/User/geditlike_lineeval.sublime-macro"},
"context": [
{ "key": "selector", "operator": "equal", "operand": "source.r"}
]
}
对于 BONUS 奖励标记,您可以直接在此处显示的插件命令中运行repl_transfer_current
命令,在这种情况下,您根本不需要使用宏你可以直接将密钥绑定到插件中的命令。在这种情况下,您可能希望以不同的方式命名该类(例如RTransferAndAdvanceCommand
或某些此类),以便命令名称更有意义。