Складіть розпізнавання блоків вперед-sexp, визначених ключовими словами, а не лише дужками


10

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

Один із способів - шукати регулярно-стартовий / закриваючий регулярний вираз і пропускати всі рядки, коментарі та ends тощо, але це дещо неефективно і трохи некрасиво.

Чи є спосіб зробити власний аналіз синтаксису emacs розпізнавати такі ключові слова блоку, щоб forward/backward-sexpвони автоматично працювали, і щоб можна було швидко повідомити початок поточного блоку з виводу, наприклад syntax-ppss,?

[Примітка. Я не проти сам розібрати файл, але в цьому випадку я все-таки хотів би знати, як мій аналізатор повинен бути підключений до решти emacs.]


1
Ви можете подивитися, ruby-modeщо робить щось подібне для рубіну. Інший варіант - підключитись до smartparens , він має спеціальну конфігурацію для режиму рубіну, яку можна використовувати як вихідну точку
Ікбал Ансарі

Відповіді:


9

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

Розгортання SMIE для мови - це приблизно двоетапна робота:

  • визначте граматику для своєї мови разом із лексером, що ідентифікує лексеми;
  • визначити правила відступу.

Для вашої мети знадобиться лише перший крок!

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

Зауважте, що ви все одно не зможете скористатися syntax-ppssдля отримання інформації про оточуюче середовище, оскільки це дасть вам лише результат синтаксичного аналізатора таблиць. Але функції сексуального руху (наприклад, 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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.