Получить крайний список из текущей точки

Как из текущей текущей позиции в буфере Emacs я могу получить самое внешнее список /s-выражение, которое содержит эту точку?
Ниже приведены несколько примеров, чтобы проиллюстрировать, чего я хочу достичь:

Пример 1:

(defun xpto(arg)
  (+ 2 4)[point])

Выход 1:

(defun xpto(arg)
      (+ 2 4))

Пример 2:

(defun [point]xpto(arg)
  (+ 2 4))

Выход 2:

(defun xpto(arg)
      (+ 2 4))

Пример 3:

(defun xpto(arg)
  (+ 2 4))[point]

Выход 3:

NIL

Есть ли какая-либо готовая функция, предоставляемая Emacs, которая выполняет вышеупомянутое поведение?
Если нет, можете ли вы привести меня к более легкому подходу для его достижения?

ОБНОВЛЕНИЕ № 1

Как и предполагалось, я попробовал следующий подход:

;; Gets the outermost brackets based on point position
(defun get-outermost-brackets()
  (interactive)
  (car (last (nth 9 (syntax-ppss)))))


;; Assigns that function to a key
(global-set-key [(control p)] 'get-outermost-brackets)

Тем не менее, после нажатия CTRL+P I не выводится независимо от того, где находится точка.
Что я делаю неправильно?

2 ответа

Решение

То, что вы ищете, это функция parse-partial-sexp который возвращает состояние анализатора (список из 10 элементов!), который вы можете использовать, чтобы выяснить начальную и конечную позиции вашего sexp.

Другая полезная функция будет scan-sexps,

UPDATE#1:

Ваша функция get-outermost-brackets возвращает позицию самого открытого открытого парена, не являющейся полезной частью вашего буфера, и это значение в любом случае не будет отображаться в области эха.

UPDATE # 2:

Это отправит включающий sexp в область эха и *Messages* буфер:

(defun get-enclosing-sexp (&optional pos)
  (interactive)
  (message "%s" (save-excursion
                  (goto-char (car (last (nth 9 (syntax-ppss)))))
                  (read (current-buffer)))))

Капля message если вы хотите вернуть sexp из функции, а не просто показать ее.

Где мой миллион?

(car (last (nth 9 (syntax-ppss)))) даст вам положение крайнего открытого парена (или ноль, если вы не в скобках). Если вы хотите получить соответствующее выражение в виде s-exp, вы можете перейти в эту позицию и затем использовать read чтобы получить это.

Другие вопросы по тегам