| ;; Copyright 2017 The Go Authors. All rights reserved. |
| ;; Use of this source code is governed by a BSD-style |
| ;; license that can be found in the LICENSE file. |
| |
| ;; This makes fill-paragraph (M-q) add line breaks at sentence |
| ;; boundaries in addition to normal wrapping. This is the style for Go |
| ;; proposals. |
| ;; |
| ;; Loading this script automatically enables this for markdown-mode |
| ;; buffers in the go-design/proposal directory. It can also be |
| ;; manually enabled with M-x enable-fill-split-sentences. |
| ;; |
| ;; This is sensitive to the setting of `sentence-end-double-space`, |
| ;; which defaults to t. If `sentence-end-double-space` is t, but a |
| ;; paragraph only a single space between sentences, this will not |
| ;; insert line breaks where expected. |
| |
| (defun fill-split-sentences (&optional justify) |
| "Fill paragraph at point, breaking lines at sentence boundaries." |
| (interactive) |
| (save-excursion |
| ;; Do a trial fill and get the fill prefix for this paragraph. |
| (let ((prefix (or (fill-paragraph) "")) |
| (end (progn (fill-forward-paragraph 1) (point))) |
| (beg (progn (fill-forward-paragraph -1) (point)))) |
| (save-restriction |
| (narrow-to-region (line-beginning-position) end) |
| ;; Unfill the paragraph. |
| (let ((fill-column (point-max))) |
| (fill-region beg end)) |
| ;; Fill each sentence. |
| (goto-char (point-min)) |
| (while (not (eobp)) |
| (if (bobp) |
| ;; Skip over initial prefix. |
| (goto-char beg) |
| ;; Clean up space between sentences. |
| (skip-chars-forward " \t") |
| (delete-horizontal-space 'backward-only) |
| (insert "\n" prefix)) |
| (let ((sbeg (point)) |
| (fill-prefix prefix)) |
| (forward-sentence) |
| (fill-region-as-paragraph sbeg (point))))) |
| prefix))) |
| |
| (defun enable-fill-split-sentences () |
| "Make fill break lines at sentence boundaries in this buffer." |
| (interactive) |
| (setq-local fill-paragraph-function #'fill-split-sentences)) |
| |
| (defun proposal-enable-fill-split () |
| (when (string-match "go-proposal/design/" (buffer-file-name)) |
| (enable-fill-split-sentences))) |
| |
| ;; Enable sentence splitting in new proposal buffers. |
| (add-hook 'markdown-mode-hook #'proposal-enable-fill-split) |
| |
| ;; Enable sentence splitting in this buffer, in case the user loaded |
| ;; fill.el when already in a buffer. |
| (when (eq major-mode 'markdown-mode) |
| (proposal-enable-fill-split)) |