Сделайте так, чтобы forward-sexp распознавал блоки, определенные по ключевым словам, а не только в скобках

10

На каком языке (julia) есть блоки, определяемые ключевыми словами, такими как for..end, begin..endа также круглые скобки, как можно пропустить такой блок? Кроме того, endэто не только ключевое слово блока, но и действительный идентификатор, используемый в других местах.

Один из способов - найти регулярное выражение для начала / закрытия блока и пропустить все строки, комментарии, и endт. Д., Но это несколько неэффективно и немного уродливо.

Есть ли способ заставить собственный синтаксический анализ в emacs распознавать такие ключевые слова блока, чтобы forward/backward-sexpон работал автоматически и чтобы можно было быстро отличить начало текущего блока от вывода, например syntax-ppss,?

[Примечание: я не против разбора файла сам, но в этом случае я все еще хотел бы знать, как мой синтаксический анализатор должен быть подключен к остальной части emacs.]

Кирилл
источник
1
Вы можете взглянуть на ruby-modeчто-то похожее на ruby. Другой вариант - подключиться к smartparens , он имеет специальную конфигурацию для режима ruby, которую вы можете использовать в качестве отправной точки
Iqbal Ansari

Ответы:

9

Вы можете взглянуть на встроенную библиотеку SMIE (расшифровывается как Simple-Minded Indentation Engine). Несмотря на название, отступ является лишь одной из функций, которые он предоставляет. Этот метод используется во многих режимах (в том числе ruby-mode, упомянутых в комментарии), чтобы обеспечить перемещение и отступ в сексе.

Развертывание SMIE для языка - это примерно два этапа:

  • определите грамматику для вашего языка вместе с лексером, идентифицирующим токены;
  • определить правила отступа.

Для вашей цели понадобится только первый шаг!

В целом, синтаксический анализатор определил таким образом, что подключается к Emacs. Например, show-parensвыделит паренеподобные выражения, определенные в грамматике SMIE (по крайней мере, в последних версиях emacs).

Обратите внимание, что вы по-прежнему не сможете использовать syntax-ppssдля получения информации об окружающей среде, поскольку она даст вам только результат синтаксического анализатора таблицы. Но функции движения sexp (например, up-listсопровождаемые backward-sexp) могут быть заменой.

Т. Веррон
источник
2

Я сделал библиотеку для этого

После определения становится доступной куча команд: перемещение вперед, назад, копирование и т. Д.

Определение - в псевдокоде:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

Когда это сделано, оно должно быть доступно, т.е. скопировано и возвращено так

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Андреас Рёлер
источник