Получить крайний список из текущей точки
Как из текущей текущей позиции в буфере 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
чтобы получить это.