Я читаю «An Introduction to Programming in Emacs Lisp» от Robert J. Chassell. И у меня есть вопрос. В узле «fwd-para while» (объяснение while
петли forward-paragraph
), он говорит:forward-paragraph в GNU Emacs
Интересно, что счетчик цикла не уменьшается, пока мы не оставить пространство между абзацами, если мы не придем к концу буфера или перестает видеть локальное значение разделителя абзацев.
Я не могу это понять, может кто-нибудь объяснить это мне? Благодарю.
while
цикл выглядит следующим образом:
;; going forwards and not at the end of the buffer
(while (and (> arg 0) (not (eobp)))
;; between paragraphs
;; Move forward over separator lines...
(while (and (not (eobp))
(progn (move-to-left-margin) (not (eobp)))
(looking-at parsep))
(forward-line 1))
;; This decrements the loop
(unless (eobp) (setq arg (1- arg)))
;; ... and one more line.
(forward-line 1)
(if fill-prefix-regexp
;; There is a fill prefix; it overrides parstart;
;; we go forward line by line
(while (and (not (eobp))
(progn (move-to-left-margin) (not (eobp)))
(not (looking-at parsep))
(looking-at fill-prefix-regexp))
(forward-line 1))
;; There is no fill prefix;
;; we go forward character by character
(while (and (re-search-forward sp-parstart nil 1)
(progn (setq start (match-beginning 0))
(goto-char start)
(not (eobp)))
(progn (move-to-left-margin)
(not (looking-at parsep)))
(or (not (looking-at parstart))
(and use-hard-newlines
(not (get-text-property (1- start) 'hard)))))
(forward-char 1))
;; and if there is no fill prefix and if we are not at the end,
;; go to whatever was found in the regular expression search
;; for sp-parstart
(if (< (point) (point-max))
(goto-char start))))
Спасибо для редактирования и ответа. У меня есть еще три вопроса о ФОРВАРДНОМ пункте:
Что такое смысл
(progn (move-to-left-margin) (not (eobp)))
? Если верно(not (eobp))
, то не должно быть(progn (move-to-left-margin) (not (eobp)))
?Об этой линии:
;; ... and one more line. (forward-line 1)
Почему экспедиторской еще одну линию?
Об этом пункте:
Это
while
петля имеет нас поиск вперед для `SP-parstart», который является сочетание возможных пробелов с местным значением начала абзаца или разделителя абзацев.Почему
the local value of the start of a paragraph or of a paragraph separator
? Насколько мне известно, состояние разделителя абзацев уже обработано в первом циклеwhile
while
.
'(перемещение к левому краю)' может перемещать точку вперед, поэтому '(eobp)' является ложным заранее, не означает, что после этого он снова будет ложным. – phils
Вы имеете в виду, что буфер локальной переменной 'left-margin' может быть (point-max)? – user159
Ну, это может быть, но это не то, что я имею в виду. Я имею в виду, что для любой заданной строки текста текущая точка может находиться слева от столбца с левым полем (который также может быть указан через свойство text, поэтому переменная необязательно релевантна), и поэтому бессмысленно тестировать '(eobp)' как до, так и после перехода на левое поле. – phils