На каком языке (julia) есть блоки, определяемые ключевыми словами, такими как for..end
, begin..end
а также круглые скобки, как можно пропустить такой блок? Кроме того, end
это не только ключевое слово блока, но и действительный идентификатор, используемый в других местах.
Один из способов - найти регулярное выражение для начала / закрытия блока и пропустить все строки, комментарии, и end
т. Д., Но это несколько неэффективно и немного уродливо.
Есть ли способ заставить собственный синтаксический анализ в emacs распознавать такие ключевые слова блока, чтобы forward/backward-sexp
он работал автоматически и чтобы можно было быстро отличить начало текущего блока от вывода, например syntax-ppss
,?
[Примечание: я не против разбора файла сам, но в этом случае я все еще хотел бы знать, как мой синтаксический анализатор должен быть подключен к остальной части emacs.]
ruby-mode
что-то похожее на ruby. Другой вариант - подключиться к smartparens , он имеет специальную конфигурацию для режима ruby, которую вы можете использовать в качестве отправной точкиОтветы:
Вы можете взглянуть на встроенную библиотеку SMIE (расшифровывается как Simple-Minded Indentation Engine). Несмотря на название, отступ является лишь одной из функций, которые он предоставляет. Этот метод используется во многих режимах (в том числе
ruby-mode
, упомянутых в комментарии), чтобы обеспечить перемещение и отступ в сексе.Развертывание SMIE для языка - это примерно два этапа:
Для вашей цели понадобится только первый шаг!
В целом, синтаксический анализатор определил таким образом, что подключается к Emacs. Например,
show-parens
выделит паренеподобные выражения, определенные в грамматике SMIE (по крайней мере, в последних версиях emacs).Обратите внимание, что вы по-прежнему не сможете использовать
syntax-ppss
для получения информации об окружающей среде, поскольку она даст вам только результат синтаксического анализатора таблицы. Но функции движения sexp (например,up-list
сопровождаемыеbackward-sexp
) могут быть заменой.источник
Я сделал библиотеку для этого
После определения становится доступной куча команд: перемещение вперед, назад, копирование и т. Д.
Определение - в псевдокоде:
Когда это сделано, оно должно быть доступно, т.е. скопировано и возвращено так
источник