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)))

person abo-abo    schedule 20.09.2013    source источник


Ответы (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 возвращает список, третий элемент которого существует, если вы находитесь внутри строки, а 8-й элемент является началом строки (если вы находитесь в одном, иначе ноль).

person Tyler    schedule 20.09.2013
comment
Спасибо, @Tyler, но ваш код кажется мне таким же наивным, как и мой: анализировать, перемещать один символ, анализировать, перемещать один символ ... . Я ищу что-то, что анализируется только один раз. - person abo-abo; 20.09.2013
comment
Я не думаю, что это возможно. Я не могу найти ни одной функции, которая делает то, что вы хотите, не проходя через цитату. См., например, код на github.com/ magnars/expand-region.el/blob/master/ строка 116 и далее (;; Кавычки) - person Tyler; 20.09.2013
comment
Если (nth 3 (syntax-ppss) верно, существует начальная позиция в (nth 8 (syntax-ppss)). Нет необходимости, переходим напрямую. Кстати, это своего рода долго лелеемые ошибки, см. также debbugs.gnu.org/cgi/bugreport.cgi?bug=3416 - person Andreas Röhler; 20.09.2013
comment
@AndreasRöhler, спасибо, я исправлен! Давно заветное - четыре года, чтобы такой основной вопрос оставался в силе. - person Tyler; 20.09.2013
comment
Для протокола: forward-back-sexp тоже глючит - и легко лечится аналогичным образом. Может быть, еще несколько человек отправят отчеты об ошибках, чтобы это было сделано. Ваше здоровье - person Andreas Röhler; 20.09.2013
comment
Когда нет дальнейшего списка впереди. BTW опубликует вариант, который отправляет ноль, так как пользователь должен получить некоторую информацию в конце. Черновик также имеет дело с комментариями - (nth 8 ...) все, что нужно, наконец. - person Andreas Röhler; 21.09.2013
comment
Можно ли предоставить симметричное down-list решение, если оно тривиально? - person modeller; 17.08.2014

В дополнение к полученным ответам: работайте также с комментариями, отправьте «ноль», если дальнейший список не найден. При интерактивном вызове результат сообщения.

(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))
person Andreas Röhler    schedule 21.09.2013