Решение, на которое вы ссылаетесь, должно работать как в Sublime 2, так и в 3 (при условии, что плагин, предоставляющий команду repl_transfer_current
, работает для обоих), но не работает, потому что макрос неправильно отформатирован.
[Изменить] Команда move
, изначально предоставленная Sublime, не принимает аргументы, которые использует ваш макрос. Предположительно, это то, что также предоставляется каким-то пакетом, если это работает для вас. Если это так, вам может потребоваться соответствующим образом изменить приведенный ниже пример кода. [/Редактировать]
В нынешнем виде проблема заключается в том, что почти (но не все) файлы конфигурации в Sublime имеют формат JSON (слегка ослабленный, чтобы разрешить комментарии), а код макроса, как указано выше, и связанное решение не является допустимым JSON, потому что первый и вторая команда в нем не разделены запятой.
Что-то вроде следующего должно работать:
[
{"command": "repl_transfer_current", "args": {"scope": "lines"}},
{"command": "move", "args": {"mode": "lines", "amount": 1}}
]
Я думаю, что документация по Sublime, на которую вы ссылались выше, предназначена для Sublime 2. Хорошим ресурсом является Неофициальная документация., который также содержит список команд (плюс много других хороших вещей).
Чтобы сделать что-то подобное и заставить его двигаться вниз, пока не дойдет до первой непустой строки без комментариев, вам понадобится простой плагин.
В частности, ему придется переместить курсор вниз (используя существующую команду move
), а затем проверить текущую строку, чтобы увидеть, является ли она пустой или комментарием, и, если да, переместиться снова. Затем вы можете использовать эту команду вместо команды move
в своем макросе.
Для бонусных баллов вот пример плагина, который делает что-то подобное. Он более подробный, чем должен быть, поэтому он более поучителен и может потребовать дополнительной настройки (R не является одним из языков, которые я использую/знаю), но он должен помочь вам начать работу.
Для получения дополнительной информации о том, как это работает, вы можете ознакомиться с справочником по API. увидеть все внутренние команды, которые вы можете использовать в плагине.
Чтобы использовать это, выберите 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"}
]
Кроме того, вы можете использовать привязку клавиш, например следующую. Поскольку вы упомянули RStudio с помощью Control+Enter, я использовал его здесь. К этой привязке применяется контекст, поэтому она применяется только в том случае, если текущий файл является файлом 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
или что-то в этом роде), чтобы имя команды имело больше смысла.
person
OdatNurd
schedule
15.06.2017