Emacs: пуленепробиваемый список?
Я собираюсь up-list: Scan error: "Unbalanced parentheses"
с этой позиции:
(foo "bar|")
Фрагмент из up-list
документ:
Эта команда предполагает, что точка не находится в строке или комментарии.
Так что это ожидаемое поведение. Но мне все равно. Я просто хочу пойти вверх из списка. Может ли кто-то предложить up-list
клон, который делает правильную вещь?
Я ищу что-то лучше, чем этот наивный код:
(defun up-list-naive ()
(interactive)
(while (not (ignore-errors (up-list) t))
(forward-char)))
2 ответа
РЕДАКТИРОВАТЬ: включены предложение Андреаса Рохлера:
Это работает для меня в вашем тестовом случае:
(defun my-up-list ()
(interactive)
(let ((s (syntax-ppss)))
(when (nth 3 s)
(goto-char (nth 8 s))))
(ignore-errors (up-list)))
syntax-ppss
возвращает список, третий элемент которого существует, если вы находитесь внутри строки, а восьмой элемент является началом строки (если вы в ней, в противном случае ноль).
В продолжение предоставленных ответов: разберитесь также с комментариями, отправьте "ноль", если дальнейший список не найден. При интерактивном вызове результат сообщения.
(defun ar-up-list (arg)
"Move forward out of one level of parentheses.
With ARG, do this that many times.
A negative argument means move backward but still to a less deep spot."
(interactive "p")
(let ((orig (point))
(pps (syntax-ppss))
erg)
(and (nth 8 pps) (goto-char (nth 8 pps)))
(ignore-errors (up-list arg))
(and (< orig (point)) (setq erg (point)))
(when (interactive-p) (message "%s" erg))
erg))
И это дополнение:
(defun ar-down-list (arg)
"Move forward down one level of parentheses.
With ARG, do this that many times.
A negative argument means move backward but still go down a level. "
(interactive "p")
(let ((orig (point))
(pps (syntax-ppss))
erg)
(and (nth 8 pps) (goto-char (nth 8 pps)))
(ignore-errors (down-list arg))
(and (< orig (point)) (setq erg (point)))
(when (interactive-p) (message "%s" erg))
erg))