2013-09-20 4 views
3

Я получаю up-list: Scan error: "Unbalanced parentheses" от этой позиции:Emacs: bulletproof up-list?

(foo "bar|") 

Отрывок из up-list документ:

Эта команда предполагает, что точка не находится в строке или комментарий.

Так что это ожидаемое поведение. Но мне все равно. Я просто хочу подняться из списка. Может ли кто-нибудь предложить клон up-list, который делает правильную вещь?

Я ищу что-то лучше, чем этот наивный код:

(defun up-list-naive() 
    (interactive) 
    (while (not (ignore-errors (up-list) t)) 
    (forward-char))) 

ответ

3

EDIT: включено предложение Andreas Rohler в:

Это работает для меня в вашем тесте:

(defun my-up-list() 
    (interactive) 
    (let ((s (syntax-ppss))) 
    (when (nth 3 s) 
     (goto-char (nth 8 s)))) 
    (ignore-errors (up-list))) 

syntax-ppss возвращает список, третий элемент которого существует, если вы находитесь внутри строки, а восьмой элемент это начало строки (если вы в одном, в противном случае - ноль).

+0

Спасибо, @Tyler, но ваш код выглядит для меня наивным, как моя: синтаксического анализа, переместите один символ, разобрать, переместить один символ .... Я ищу что-то, что анализирует только один раз. –

+0

Я не думаю, что это возможно. Я не могу найти ни одной функции, которая делает то, что вы хотите, не пройдя через цитату. См. Например, код в https://github.com/magnars/expand-region.el/blob/master/er-basic-expansions.el строке 116 и далее (;; Цитаты) – Tyler

+1

Если (nth 3 (синтаксис-ppss)) является истинным, существует начальная позиция в (nth 8 (синтаксис-pps). Нет необходимости «в то время», прыгать напрямую. Кстати, это своего рода долгожданные ошибки, см. также http://debbugs.gnu.org/cgi/ bugreport.cgi? bug = 3416 –

1

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

(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)) 
Смежные вопросы