|
@@ -5064,7 +5064,7 @@ The following commands are available:
|
|
|
org-display-table 4
|
|
|
(vconcat (mapcar
|
|
|
(lambda (c) (make-glyph-code c (and (not (stringp org-ellipsis))
|
|
|
- org-ellipsis)))
|
|
|
+ org-ellipsis)))
|
|
|
(if (stringp org-ellipsis) org-ellipsis "..."))))
|
|
|
(setq buffer-display-table org-display-table))
|
|
|
(org-set-regexps-and-options)
|
|
@@ -5083,18 +5083,15 @@ The following commands are available:
|
|
|
'local)
|
|
|
;; Check for running clock before killing a buffer
|
|
|
(org-add-hook 'kill-buffer-hook 'org-check-running-clock nil 'local)
|
|
|
- ;; Paragraphs and auto-filling
|
|
|
- (org-set-autofill-regexps)
|
|
|
+ ;; Indentation.
|
|
|
(org-set-local 'indent-line-function 'org-indent-line)
|
|
|
(org-set-local 'indent-region-function 'org-indent-region)
|
|
|
+ ;; Initialize radio targets.
|
|
|
(org-update-radio-target-regexp)
|
|
|
- ;; Comments
|
|
|
- (org-set-local 'comment-use-syntax nil)
|
|
|
- (org-set-local 'comment-start "# ")
|
|
|
- (org-set-local 'comment-start-skip "^\\s-*#\\(?: \\|$\\)")
|
|
|
- (org-set-local 'comment-insert-comment-function 'org-insert-comment)
|
|
|
- (org-set-local 'comment-region-function 'org-comment-or-uncomment-region)
|
|
|
- (org-set-local 'uncomment-region-function 'org-comment-or-uncomment-region)
|
|
|
+ ;; Filling and auto-filling.
|
|
|
+ (org-setup-filling)
|
|
|
+ ;; Comments.
|
|
|
+ (org-setup-comments-handling)
|
|
|
;; Beginning/end of defun
|
|
|
(org-set-local 'beginning-of-defun-function 'org-back-to-heading)
|
|
|
(org-set-local 'end-of-defun-function (lambda () (interactive) (org-end-of-subtree nil t)))
|
|
@@ -20986,14 +20983,22 @@ hierarchy of headlines by UP levels before marking the subtree."
|
|
|
|
|
|
;;; Filling
|
|
|
|
|
|
-;; We use our own fill-paragraph and auto-fill functions. These
|
|
|
-;; functions will shadow `fill-prefix' (computed internally with
|
|
|
-;; `org-fill-context-prefix') and pass through to
|
|
|
-;; `fill-region-as-paragraph' and `do-auto-fill' as appropriate.
|
|
|
+;; We use our own fill-paragraph and auto-fill functions.
|
|
|
|
|
|
-(defun org-set-autofill-regexps ()
|
|
|
+;; `org-fill-paragraph' relies on adaptive filling and context
|
|
|
+;; checking. Appropriate `fill-prefix' is computed with
|
|
|
+;; `org-adaptive-fill-function'.
|
|
|
+
|
|
|
+;; `org-auto-fill-function' takes care of auto-filling. It calls
|
|
|
+;; `do-auto-fill' only on valid areas with `fill-prefix' shadowed with
|
|
|
+;; `org-adaptive-fill-function' value. Internally,
|
|
|
+;; `org-comment-line-break-function' breaks the line.
|
|
|
+
|
|
|
+;; `org-setup-filling' installs filling and auto-filling related
|
|
|
+;; variables during `org-mode' initialization.
|
|
|
+
|
|
|
+(defun org-setup-filling ()
|
|
|
(interactive)
|
|
|
- (org-set-local 'fill-paragraph-function 'org-fill-paragraph)
|
|
|
;; Prevent auto-fill from inserting unwanted new items.
|
|
|
(when (boundp 'fill-nobreak-predicate)
|
|
|
(org-set-local
|
|
@@ -21002,6 +21007,8 @@ hierarchy of headlines by UP levels before marking the subtree."
|
|
|
(append fill-nobreak-predicate
|
|
|
'(org-fill-paragraph-separate-nobreak-p
|
|
|
org-fill-line-break-nobreak-p)))))
|
|
|
+ (org-set-local 'fill-paragraph-function 'org-fill-paragraph)
|
|
|
+ (org-set-local 'adaptive-fill-function 'org-adaptive-fill-function)
|
|
|
(org-set-local 'normal-auto-fill-function 'org-auto-fill-function)
|
|
|
(org-set-local 'comment-line-break-function 'org-comment-line-break-function)
|
|
|
(org-set-local 'align-mode-rules-list
|
|
@@ -21023,19 +21030,19 @@ hierarchy of headlines by UP levels before marking the subtree."
|
|
|
|
|
|
(declare-function message-in-body-p "message" ())
|
|
|
(defvar org-element--affiliated-re) ; From org-element.el
|
|
|
-(defun org-fill-context-prefix (p)
|
|
|
- "Compute a fill prefix for the line at point P.
|
|
|
+(defun org-adaptive-fill-function ()
|
|
|
+ "Compute a fill prefix for the current line.
|
|
|
Return fill prefix, as a string, or nil if current line isn't
|
|
|
meant to be filled."
|
|
|
(org-with-wide-buffer
|
|
|
(unless (and (derived-mode-p 'message-mode) (not (message-in-body-p)))
|
|
|
;; FIXME: This is really the job of orgstruct++-mode
|
|
|
- (goto-char p)
|
|
|
- (beginning-of-line)
|
|
|
- (let* ((element (org-element-at-point))
|
|
|
+ (let* ((p (line-beginning-position))
|
|
|
+ (element (save-excursion (beginning-of-line)
|
|
|
+ (org-element-at-point)))
|
|
|
(type (org-element-type element))
|
|
|
(post-affiliated
|
|
|
- (progn
|
|
|
+ (save-excursion
|
|
|
(goto-char (org-element-property :begin element))
|
|
|
(while (looking-at org-element--affiliated-re) (forward-line))
|
|
|
(point))))
|
|
@@ -21053,7 +21060,7 @@ meant to be filled."
|
|
|
(make-string (org-list-item-body-column
|
|
|
(org-element-property :begin parent))
|
|
|
? ))
|
|
|
- ((looking-at "\\s-+") (match-string 0))
|
|
|
+ ((looking-at "[ \t]*") (match-string 0))
|
|
|
(t ""))))
|
|
|
(comment-block
|
|
|
;; Only fill contents if P is within block boundaries.
|
|
@@ -21065,7 +21072,7 @@ meant to be filled."
|
|
|
(skip-chars-backward " \r\t\n")
|
|
|
(line-beginning-position))))
|
|
|
(when (and (>= p cbeg) (< p cend))
|
|
|
- (if (looking-at "\\s-+") (match-string 0) ""))))))))))
|
|
|
+ (if (looking-at "[ \t]*") (match-string 0) ""))))))))))
|
|
|
|
|
|
(declare-function message-goto-body "message" ())
|
|
|
(defvar message-cite-prefix-regexp) ; From message.el
|
|
@@ -21099,12 +21106,12 @@ a footnote definition, try to fill the first paragraph within."
|
|
|
(cadadr (assoc 'paragraph-separate org-fb-vars))))
|
|
|
(fill-paragraph))
|
|
|
(save-excursion
|
|
|
- ;; Move to end of line in order to get the first paragraph within
|
|
|
- ;; a plain list or a footnote definition.
|
|
|
+ ;; Move to end of line in order to get the first paragraph
|
|
|
+ ;; within a plain list or a footnote definition.
|
|
|
(end-of-line)
|
|
|
(let ((element (org-element-at-point)))
|
|
|
- ;; First check if point is in a blank line at the beginning of the
|
|
|
- ;; buffer. In that case, ignore filling.
|
|
|
+ ;; First check if point is in a blank line at the beginning of
|
|
|
+ ;; the buffer. In that case, ignore filling.
|
|
|
(if (< (point) (org-element-property :begin element)) t
|
|
|
(case (org-element-type element)
|
|
|
;; Align Org tables, leave table.el tables as-is.
|
|
@@ -21113,8 +21120,8 @@ a footnote definition, try to fill the first paragraph within."
|
|
|
(when (eq (org-element-property :type element) 'org)
|
|
|
(org-table-align))
|
|
|
t)
|
|
|
- ;; Elements that may contain `line-break' type objects.
|
|
|
(paragraph
|
|
|
+ ;; Paragraphs may contain `line-break' type objects.
|
|
|
(let ((beg (max (point-min)
|
|
|
(org-element-property :contents-begin element)))
|
|
|
(end (min (point-max)
|
|
@@ -21131,20 +21138,20 @@ a footnote definition, try to fill the first paragraph within."
|
|
|
(re-search-forward
|
|
|
(concat "^" message-cite-prefix-regexp) end t))
|
|
|
(setq end (match-beginning 0))))
|
|
|
- ;; Fill paragraph, taking line breaks into consideration.
|
|
|
- ;; For that, slice the paragraph using line breaks as
|
|
|
- ;; separators, and fill the parts in reverse order to
|
|
|
- ;; avoid messing with markers.
|
|
|
+ ;; Fill paragraph, taking line breaks into
|
|
|
+ ;; consideration. For that, slice the paragraph
|
|
|
+ ;; using line breaks as separators, and fill the
|
|
|
+ ;; parts in reverse order to avoid messing with
|
|
|
+ ;; markers.
|
|
|
(save-excursion
|
|
|
(goto-char end)
|
|
|
(mapc
|
|
|
(lambda (pos)
|
|
|
- (let ((fill-prefix (org-fill-context-prefix pos)))
|
|
|
- (fill-region-as-paragraph pos (point) justify))
|
|
|
+ (fill-region-as-paragraph pos (point) justify)
|
|
|
(goto-char pos))
|
|
|
- ;; Find the list of ending positions for line breaks
|
|
|
- ;; in the current paragraph. Add paragraph beginning
|
|
|
- ;; to include first slice.
|
|
|
+ ;; Find the list of ending positions for line
|
|
|
+ ;; breaks in the current paragraph. Add paragraph
|
|
|
+ ;; beginning to include first slice.
|
|
|
(nreverse
|
|
|
(cons
|
|
|
beg
|
|
@@ -21154,55 +21161,83 @@ a footnote definition, try to fill the first paragraph within."
|
|
|
'line-break
|
|
|
(lambda (lb) (org-element-property :end lb)))))))
|
|
|
t)))
|
|
|
- ;; Contents of `comment-block' type elements should be filled as
|
|
|
- ;; plain text.
|
|
|
+ ;; Contents of `comment-block' type elements should be
|
|
|
+ ;; filled as plain text, but only if point is within block
|
|
|
+ ;; markers.
|
|
|
(comment-block
|
|
|
- (let ((fill-prefix (org-fill-context-prefix (point))))
|
|
|
- (save-excursion
|
|
|
+ (let* ((case-fold-search t)
|
|
|
+ (beg (save-excursion
|
|
|
+ (goto-char (org-element-property :begin element))
|
|
|
+ (re-search-forward "^[ \t]*#\\+begin_comment" nil t)
|
|
|
+ (forward-line)
|
|
|
+ (point)))
|
|
|
+ (end (save-excursion
|
|
|
+ (goto-char (org-element-property :end element))
|
|
|
+ (re-search-backward "^[ \t]*#\\+end_comment" nil t)
|
|
|
+ (line-beginning-position))))
|
|
|
+ (when (and (>= (point) beg) (< (point) end))
|
|
|
(fill-region-as-paragraph
|
|
|
- (progn
|
|
|
- (goto-char (org-element-property :begin element))
|
|
|
- (while (looking-at org-element--affiliated-re)
|
|
|
- (forward-line))
|
|
|
- (forward-line)
|
|
|
- (point))
|
|
|
- (progn
|
|
|
- (goto-char (org-element-property :end element))
|
|
|
- (skip-chars-backward " \r\t\n")
|
|
|
+ (save-excursion
|
|
|
+ (end-of-line)
|
|
|
+ (re-search-backward "^[ \t]*$" beg 'move)
|
|
|
(line-beginning-position))
|
|
|
- justify))) t)
|
|
|
- ;; Fill comments, indented or not.
|
|
|
- (comment
|
|
|
- (let ((fill-prefix (org-fill-context-prefix (point))))
|
|
|
- (save-excursion
|
|
|
- (fill-region-as-paragraph
|
|
|
- (progn
|
|
|
- (goto-char (org-element-property :begin element))
|
|
|
- (while (looking-at org-element--affiliated-re)
|
|
|
- (forward-line))
|
|
|
- (point))
|
|
|
- (progn
|
|
|
- (goto-char (org-element-property :end element))
|
|
|
- (skip-chars-backward " \r\t\n")
|
|
|
- (line-end-position))))))
|
|
|
+ (save-excursion
|
|
|
+ (beginning-of-line)
|
|
|
+ (re-search-forward "^[ \t]*$" end 'move)
|
|
|
+ (line-beginning-position))
|
|
|
+ justify)))
|
|
|
+ t)
|
|
|
+ ;; Fill comments.
|
|
|
+ (comment (fill-comment-paragraph justify))
|
|
|
;; Ignore every other element.
|
|
|
(otherwise t)))))))
|
|
|
|
|
|
(defun org-auto-fill-function ()
|
|
|
"Auto-fill function."
|
|
|
- ;; Check if auto-filling is meaningful before computing fill prefix.
|
|
|
+ ;; Check if auto-filling is meaningful.
|
|
|
(let ((fc (current-fill-column)))
|
|
|
(when (and fc (> (current-column) fc))
|
|
|
- (let ((fill-prefix (org-fill-context-prefix (point))))
|
|
|
+ (let ((fill-prefix (org-adaptive-fill-function)))
|
|
|
(when fill-prefix (do-auto-fill))))))
|
|
|
|
|
|
+(defun org-comment-line-break-function (&optional soft)
|
|
|
+ "Break line at point and indent, continuing comment if within one.
|
|
|
+The inserted newline is marked hard if variable
|
|
|
+`use-hard-newlines' is true, unless optional argument SOFT is
|
|
|
+non-nil."
|
|
|
+ (if soft (insert-and-inherit ?\n) (newline 1))
|
|
|
+ (save-excursion (forward-char -1) (delete-horizontal-space))
|
|
|
+ (delete-horizontal-space)
|
|
|
+ (indent-to-left-margin)
|
|
|
+ (insert-before-markers-and-inherit fill-prefix))
|
|
|
+
|
|
|
|
|
|
;;; Comments
|
|
|
|
|
|
-;; We control comments everywhere. `org-comment-or-uncomment-region'
|
|
|
-;; and `org-insert-comment' takes care of `comment-dwim' behaviour
|
|
|
-;; while `org-comment-line-break-function' handles auto-filling in
|
|
|
-;; a comment.
|
|
|
+;; Org comments syntax is quite complex. It requires the entire line
|
|
|
+;; to be just a comment. Also, even with the right syntax at the
|
|
|
+;; beginning of line, some some elements (i.e. verse-block or
|
|
|
+;; example-block) don't accept comments. Usual Emacs comment commands
|
|
|
+;; cannot cope with those requirements. Therefore, Org replaces them.
|
|
|
+
|
|
|
+;; Org still relies on `comment-dwim', but cannot trust
|
|
|
+;; `comment-only-p'. So, `comment-region-function' and
|
|
|
+;; `uncomment-region-function' both point
|
|
|
+;; to`org-comment-or-uncomment-region'. Eventually,
|
|
|
+;; `org-insert-comment' takes care of insertion of comments at the
|
|
|
+;; beginning of line.
|
|
|
+
|
|
|
+;; `org-setup-comments-handling' install comments related variables
|
|
|
+;; during `org-mode' initialization.
|
|
|
+
|
|
|
+(defun org-setup-comments-handling ()
|
|
|
+ (interactive)
|
|
|
+ (org-set-local 'comment-use-syntax nil)
|
|
|
+ (org-set-local 'comment-start "# ")
|
|
|
+ (org-set-local 'comment-start-skip "^\\s-*#\\(?: \\|$\\)")
|
|
|
+ (org-set-local 'comment-insert-comment-function 'org-insert-comment)
|
|
|
+ (org-set-local 'comment-region-function 'org-comment-or-uncomment-region)
|
|
|
+ (org-set-local 'uncomment-region-function 'org-comment-or-uncomment-region))
|
|
|
|
|
|
(defun org-insert-comment ()
|
|
|
"Insert an empty comment above current line.
|
|
@@ -21212,46 +21247,56 @@ If the line is empty, insert comment at its beginning."
|
|
|
(org-indent-line)
|
|
|
(insert "# "))
|
|
|
|
|
|
+(defvar comment-empty-lines) ; From newcomment.el.
|
|
|
(defun org-comment-or-uncomment-region (beg end &rest ignore)
|
|
|
"Comment or uncomment each non-blank line in the region.
|
|
|
Uncomment each non-blank line between BEG and END if it only
|
|
|
contains commented lines. Otherwise, comment them."
|
|
|
- (save-excursion
|
|
|
- (goto-char beg)
|
|
|
- (skip-chars-forward " \r\t\n" end)
|
|
|
- (beginning-of-line)
|
|
|
+ (save-restriction
|
|
|
+ ;; Restrict region
|
|
|
+ (narrow-to-region (save-excursion (goto-char beg)
|
|
|
+ (skip-chars-forward " \r\t\n" end)
|
|
|
+ (line-beginning-position))
|
|
|
+ (save-excursion (goto-char end)
|
|
|
+ (skip-chars-backward " \r\t\n" beg)
|
|
|
+ (line-end-position)))
|
|
|
(let ((uncommentp
|
|
|
- ;; UNCOMMENTP is non-nil when every non blank line between
|
|
|
- ;; BEG and END is a comment.
|
|
|
- (save-excursion
|
|
|
- (while (progn (and (not (eobp))
|
|
|
- (let ((element (org-element-at-point)))
|
|
|
- (and (eq (org-element-type element) 'comment)
|
|
|
- (goto-char (org-element-property
|
|
|
- :end element)))))))
|
|
|
- (>= (point) end)))
|
|
|
- ;; Remove or adding comment markers is going to change end
|
|
|
- ;; position so make it a marker.
|
|
|
- (end (copy-marker end)))
|
|
|
- (while (< (point) end)
|
|
|
- (unless (looking-at "\\s-*$")
|
|
|
- (if (not uncommentp) (progn (back-to-indentation) (insert "# "))
|
|
|
- ;; Only comments and blank lines in region: uncomment it.
|
|
|
- (looking-at "[ \t]*\\(# ?\\)")
|
|
|
- (replace-match "" nil nil nil 1)))
|
|
|
- (forward-line))
|
|
|
- (set-marker end nil))))
|
|
|
-
|
|
|
-(defun org-comment-line-break-function (&optional soft)
|
|
|
- "Break line at point and indent, continuing comment if within one.
|
|
|
-The inserted newline is marked hard if variable
|
|
|
-`use-hard-newlines' is true, unless optional argument SOFT is
|
|
|
-non-nil."
|
|
|
- (if soft (insert-and-inherit ?\n) (newline 1))
|
|
|
- (save-excursion (forward-char -1) (delete-horizontal-space))
|
|
|
- (delete-horizontal-space)
|
|
|
- (indent-to-left-margin)
|
|
|
- (insert-before-markers-and-inherit fill-prefix))
|
|
|
+ ;; UNCOMMENTP is non-nil when every non blank line between
|
|
|
+ ;; BEG and END is a comment.
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (point-min))
|
|
|
+ (while (and (not (eobp))
|
|
|
+ (let ((element (org-element-at-point)))
|
|
|
+ (and (eq (org-element-type element) 'comment)
|
|
|
+ (goto-char (min (point-max)
|
|
|
+ (org-element-property
|
|
|
+ :end element)))))))
|
|
|
+ (eobp))))
|
|
|
+ (if uncommentp
|
|
|
+ ;; Only blank lines and comments in region: uncomment it.
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (point-min))
|
|
|
+ (while (not (eobp))
|
|
|
+ (when (looking-at "[ \t]*\\(#\\(?: \\|$\\)\\)")
|
|
|
+ (replace-match "" nil nil nil 1))
|
|
|
+ (forward-line)))
|
|
|
+ ;; Comment each line in region.
|
|
|
+ (let ((min-indent (point-max)))
|
|
|
+ ;; First find the minimum indentation across all lines.
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (point-min))
|
|
|
+ (while (and (not (eobp)) (not (zerop min-indent)))
|
|
|
+ (unless (looking-at "[ \t]*$")
|
|
|
+ (setq min-indent (min min-indent (current-indentation))))
|
|
|
+ (forward-line)))
|
|
|
+ ;; Then loop over all lines.
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (point-min))
|
|
|
+ (while (not (eobp))
|
|
|
+ (unless (and (not comment-empty-lines) (looking-at "[ \t]*$"))
|
|
|
+ (org-move-to-column min-indent t)
|
|
|
+ (insert comment-start))
|
|
|
+ (forward-line))))))))
|
|
|
|
|
|
|
|
|
;;; Other stuff.
|