33.11 Заполнение

Заполнение означает регулировку длины строк (путём перемещения разрывов строк) так, чтобы они были близки (но не превышали) заданную максимальную ширину. Кроме того, строки могут быть выровнены по ширине, что означает вставку пробелов для точного совпадения левого и/или правого полей. Ширина управляется переменной fill-column. Для удобства чтения строки должны быть не длиннее 70 или около того столбцов.

Вы можете использовать режим автоматического заполнения (см. Автоматическое заполнение), чтобы заполнять текст автоматически по мере его вставки, но изменения в существующем тексте могут оставить его неправильно заполненным. Тогда вам нужно заполнить текст явно.

Большинство команд в этом разделе возвращают значения, которые не имеют смысла. Все функции, выполняющие заполнение, учитывают текущее левое поле, текущее правое поле и текущий стиль выравнивания (см. Поля для заполнения). Если текущий стиль выравнивания — none, функции заполнения фактически ничего не делают.

Некоторые функции заполнения имеют аргумент justify. Если он не равен nil, это запрашивает некоторый вид выравнивания. Это может быть left, right, full или center для запроса конкретного стиля выравнивания. Если он равен t, это означает использование текущего стиля выравнивания для этой части текста (см. current-justification ниже). Любое другое значение рассматривается как full.

Когда вы вызываете функции заполнения интерактивно, использование префиксного аргумента подразумевает значение full для justify.

Команда: fill-paragraph &optional justify region

Эта команда заполняет абзац в точке или после неё. Если justify не равен nil, каждая строка также выравнивается. Она использует обычные команды перемещения по абзацам для поиска границ абзацев. См. Абзацы в Руководстве по GNU Emacs.

Когда region не равен nil, то если включён режим Transient Mark и метка активна, эта команда вызывает fill-region для заполнения всех абзацев в области, вместо заполнения только текущего абзаца. При интерактивном вызове этой команды region равен t.

Команда: fill-region start end &optional justify nosqueeze to-eop

Эта команда заполняет каждый абзац в области от start до end. Она также выполняет выравнивание, если justify не равен nil.

Если nosqueeze не равен nil, это означает, что пробельные символы, кроме разрывов строк, остаются нетронутыми. Если to-eop не равен nil, это означает продолжение заполнения до конца абзаца — или до следующего жёсткого перевода строки, если включён use-hard-newlines (см. ниже).

Переменная paragraph-separate управляет тем, как различать абзацы. См. Стандартные регулярные выражения, используемые при редактировании.

Функция: pixel-fill-region start end pixel-width

Большинство буферов Emacs используют моноширинный текст, поэтому все функции заполнения (например, fill-region) работают на основе количества символов и char-width. Однако Emacs может отображать другие типы объектов, например текст, содержащий изображения и использующий пропорциональные шрифты, и для этого существует pixel-fill-region. Она заполняет область текста между start и end с точностью до пикселя, поэтому текст с использованием шрифтов переменной ширины или нескольких разных шрифтов выглядит заполненным независимо от разных размеров символов. Аргумент pixel-width задаёт максимальную ширину строки в пикселях, допустимую после заполнения; это эквивалент fill-column в fill-region с разрешением в пикселях. Например, этот фрагмент Lisp вставляет текст с использованием пропорционального шрифта, а затем заполняет его так, чтобы ширина не превышала 300 пикселей:

(insert (propertize
	 "Это предложение, которое заканчивается здесь."
	 'face 'variable-pitch))
(pixel-fill-region (point) (point-max) 300)

Если start не находится в начале строки, горизонтальная позиция start, переведённая в пиксели, будет использоваться как префикс отступа для последующих строк.

Вспомогательная функция pixel-fill-width может использоваться для вычисления ширины в пикселях. Если вызвать её без аргументов, она вернёт значение, немного меньшее ширины текущего окна. Первый необязательный аргумент, columns, задаёт количество столбцов с использованием стандартных моноширинных шрифтов, например fill-column. Второй необязательный аргумент — окно для использования. Обычно её используют так:

(pixel-fill-region
  start end (pixel-fill-width fill-column))
Команда: fill-individual-paragraphs start end &optional justify citation-regexp

Эта команда заполняет каждый абзац в области в соответствии с его индивидуальным префиксом заполнения. Таким образом, если строки абзаца были сдвинуты пробелами, заполненный абзац останется сдвинутым таким же образом.

Первые два аргумента, start и end, — это начало и конец области для заполнения. Третий и четвёртый аргументы, justify и citation-regexp, являются необязательными. Если justify не равен nil, абзацы также выравниваются. Если citation-regexp не равен nil, это означает, что функция работает с почтовым сообщением и поэтому не должна заполнять строки заголовков. Если citation-regexp является строкой, она используется как регулярное выражение; если оно совпадает с началом строки, эта строка рассматривается как маркер цитирования.

Обычно fill-individual-paragraphs считает каждое изменение отступа началом нового абзаца. Если fill-individual-varying-indent не равен nil, то только строки-разделители разделяют абзацы. Этот режим может обрабатывать абзацы с отступом, имеющие дополнительный отступ на первой строке.

Пользовательская опция: fill-individual-varying-indent

Эта переменная изменяет действие fill-individual-paragraphs так, как описано выше.

Команда: fill-region-as-paragraph start end &optional justify nosqueeze squeeze-after

Эта команда рассматривает область текста как один абзац и заполняет его. Если область состояла из многих абзацев, пустые строки между абзацами удаляются. Эта функция выполняет выравнивание, а также заполнение, когда justify не равен nil.

Если nosqueeze не равен nil, это означает, что пробельные символы, кроме разрывов строк, остаются нетронутыми. Если squeeze-after не равен nil, он задаёт позицию в области и означает, что пробельные символы, кроме разрывов строк, должны оставаться нетронутыми перед этой позицией.

В режиме адаптивного заполнения эта команда вызывает fill-context-prefix для выбора префикса заполнения по умолчанию. См. Режим адаптивного заполнения.

Команда: justify-current-line &optional how eop nosqueeze

Эта команда вставляет пробелы между словами текущей строки так, чтобы строка заканчивалась точно на fill-column. Она возвращает nil.

Аргумент how, если он не равен nil, явно задаёт стиль выравнивания. Это может быть left, right, full, center или none. Если он равен t, это означает следование заданному стилю выравнивания (см. current-justification ниже). nil означает полное выравнивание.

Если eop не равен nil, это означает выполнение только выравнивания по левому краю, если current-justification задаёт полное выравнивание. Это используется для последней строки абзаца; даже если абзац в целом полностью выровнен, последняя строка не должна быть такой.

Если nosqueeze не равен nil, это означает, что внутренние пробелы не изменяются.

Пользовательская опция: default-justification

Значение этой переменной задаёт стиль выравнивания для текста, который не задаёт стиль с помощью текстового свойства. Возможные значения: left, right, full, center или none. Значение по умолчанию — left.

Функция: current-justification

Эта функция возвращает подходящий стиль выравнивания для заполнения текста вокруг точки.

Она возвращает значение текстового свойства justification в точке или значение переменной default-justification, если такого текстового свойства нет. Однако она возвращает nil, а не none, для обозначения «не выравнивать».

Пользовательская опция: sentence-end-double-space

Если эта переменная не равна nil, точка, после которой следует только один пробел, не считается концом предложения, и функции заполнения избегают разрыва строки в таком месте.

Пользовательская опция: sentence-end-without-period

Если эта переменная не равна nil, предложение может заканчиваться без точки. Это используется для таких языков, как тайский, где предложения заканчиваются двойным пробелом, но без точки.

Пользовательская опция: sentence-end-without-space

Если эта переменная не равна nil, она должна быть строкой символов, которые могут заканчивать предложение без следующих за ними пробелов.

Пользовательская опция: fill-separate-heterogeneous-words-with-space

Если эта переменная не равна nil, два слова разных типов (например, английское и CJK) будут разделяться пробелом при объединении одного, которое находится в конце строки, и другого, которое находится в начале следующей строки, при заполнении.

Переменная: fill-paragraph-function

Эта переменная предоставляет способ переопределения заполнения абзацев. Если её значение не равно nil, fill-paragraph вызывает эту функцию для выполнения работы. Если функция возвращает значение, не равное nil, fill-paragraph считает, что работа выполнена, и немедленно возвращает это значение.

Обычное использование этой возможности — заполнение комментариев в режимах языков программирования. Если функции необходимо заполнить абзац обычным способом, она может сделать это следующим образом:

(let ((fill-paragraph-function nil))
  (fill-paragraph arg))
Переменная: fill-forward-paragraph-function

Эта переменная предоставляет способ переопределения того, как функции заполнения, такие как fill-region и fill-paragraph, перемещаются вперёд к следующему абзацу. Её значение должно быть функцией, которая вызывается с одним аргументом n — количеством абзацев для перемещения, и должна возвращать разницу между n и фактически перемещённым количеством абзацев. Значение по умолчанию этой переменной — forward-paragraph. См. Абзацы в Руководстве по GNU Emacs.

Переменная: use-hard-newlines

Если эта переменная не равна nil, функции заполнения не удаляют переводы строк, имеющие текстовое свойство hard. Эти жёсткие переводы строк действуют как разделители абзацев. См. Жёсткие и мягкие переводы строк в Руководстве по GNU Emacs.