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))
Другие вопросы по тегам