Создание макроса возвышенного текста 3 для оценки строки и последующего перемещения курсора на следующую строку

Мой любимый плагин Gedit R больше не поддерживается и принудительно решение для понижения версии, которое я использовал, внезапно перестало работать при последнем обновлении убунту. Надпись была на стене некоторое время, и я исследую возвышенный текст. Я установил REPL для отправки кода в командную строку и пытаюсь настроить привязки клавиш так, как привык.

В частности, я пытаюсь сделать так, чтобы CTRL+SHIFT+R отправлял строку кода в консоль, запускал ее, а затем перемещал курсор в редакторе вниз на следующую строку. Таким образом, я мог несколько раз нажать CTRL+SHIFT+R, чтобы запустить скрипт построчно. (Это похоже на поведение Rstudio с CTRL+Enter)

Погуглив, я нашел это (старое) решение. Это не работает, вероятно, потому что это было написано для возвышенного текста 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"}}

Как показано выше, возвышенный текст отправляет мою строку кода на терминал и запускает ее. Вторая строка должна отправить курсор вниз, но это не работает, и макрос не работает, когда я раскомментирую его.

Кажется, я не могу найти много документации для команд возвышенного текста. Здесь лучшее, что я могу найти для move. Мой синтаксис неверен? Как я могу заставить это работать?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Как заставить возвышенный текст запускать строку, а затем переходить к следующей непустой, без комментариев строке. Это кажется сложнее - я вижу, что многие сочетания клавиш включают регулярные выражения и тому подобное.

EDIT Моя проблема заключалась в том, что мне не хватало запятой между строками JSON. И код, связанный на этой странице github, РАБОТАЕТ, если вы добавите запятую между строками.


person generic_user    schedule 15.06.2017    source источник


Ответы (1)


Решение, на которое вы ссылаетесь, должно работать как в 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
comment
Да, это была запятая. Впервые использую JSON. Учитывая, что JSON в основном не имеет функциональности как язык (из того, что я собрал), как мне написать небольшую программу, которая включает while и regex - казалось бы, инструменты, которые мне понадобятся для реализации того, что вы предлагаете? - person generic_user; 16.06.2017
comment
Плагины в Sublime написаны на Python (просто конфигурация — это JSON, за исключением некоторых файлов в формате XML для совместимости с TextMate). Я могу немного привести простой пример (в настоящее время не на компьютере). - person OdatNurd; 16.06.2017
comment
Пример плагина и использования были добавлены в мой ответ. - person OdatNurd; 16.06.2017
comment
Спасибо большое. Я собирался изучить некоторые основы Python, поэтому настройка вашего кода, чтобы это работало, будет хорошим упражнением. - person generic_user; 16.06.2017