Сортировка текста
Функции сортировки, описанные в этом разделе, все переупорядочивают текст в буфере. Это в отличие от функции sort, которая переупорядочивает порядок элементов списка (см. Переупорядочивание). Возвращаемые этими функциями значения не имеют смысла.
- Функция: sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun predicate
-
Эта функция — общая процедура сортировки текста, которая разбивает буфер на записи и затем сортирует их. Большинство команд в этом разделе используют эту функцию.
Чтобы понять, как работает
sort-subr, представьте, что весь доступный участок буфера разделен на отдельные части, называемые записями сортировки. Записи могут быть или не быть смежными, но они не должны перекрываться. Часть каждой записи сортировки (возможно, вся она) обозначена как ключ сортировки. Сортировка переупорядочивает записи в порядке их ключей сортировки.Обычно записи переупорядочиваются по возрастанию ключа сортировки. Если первый аргумент функции
sort-subr, reverse, неnil, то записи сортировки переупорядочиваются по убыванию ключа сортировки.Следующие четыре аргумента для
sort-subr— функции, которые вызываются для перемещения точки по записи сортировки. Они вызываются многократно изнутриsort-subr.- nextrecfun вызывается, когда точка находится в конце записи. Эта функция перемещает точку в начало следующей записи. Предполагается, что первая запись начинается в позиции точки, когда вызывается
sort-subr. Поэтому, обычно, перед вызовомsort-subrследует переместить точку в начало буфера.Эта функция может указать, что больше нет записей сортировки, оставив точку в конце буфера.
- endrecfun вызывается, когда точка находится внутри записи. Она перемещает точку в конец записи.
- startkeyfun вызывается для перемещения точки из начала записи в начало ключа сортировки. Этот аргумент необязателен; если он опущен, вся запись является ключом сортировки. Если он указан, функция должна либо вернуть ненулевое значение, используемое в качестве ключа сортировки, либо вернуть
nilдля указания, что ключ сортировки находится в буфере, начиная с точки. В последнем случае вызывается endkeyfun для нахождения конца ключа сортировки. - endkeyfun вызывается для перемещения точки из начала ключа сортировки в конец ключа сортировки. Этот аргумент необязателен. Если startkeyfun возвращает
nilи этот аргумент опущен (илиnil), то ключ сортировки распространяется до конца записи. endkeyfun не нужен, если startkeyfun возвращает ненулевое значение.
Аргумент predicate — функция для сравнения ключей. Она вызывается с двумя аргументами — ключами для сравнения — и должна возвращать ненулевое значение, если первый ключ должен предшествовать второму в порядке сортировки. То, что представляют собой аргументы ключей, зависит от того, что возвращают startkeyfun и endkeyfun. Если predicate опущена или
nil, она по умолчанию равна<если ключи являются числами,compare-buffer-substringsесли ключи — списки (чьиcarиcdr— начальные и конечные позиции буфера ключа), иstring<в противном случае (с предположением, что ключи — строки).В качестве примера
sort-subr, вот полное определение функцииsort-lines:;; Note that the first two lines of doc string ;; are effectively one line when viewed by a user. (defun sort-lines (reverse beg end) "Sort lines in region alphabetically;\ argument means descending order. Called from a program, there are three arguments:
REVERSE (non-nil means reverse order),\ BEG and END (region to sort). The variable `sort-fold-case' determines\ whether alphabetic case affects the sort order."
(interactive "P\nr") (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (let ((inhibit-field-text-motion t)) (sort-subr reverse 'forward-line 'end-of-line)))))Здесь
forward-lineперемещает точку в начало следующей записи, аend-of-line— в конец записи. Мы не передаём аргументы startkeyfun и endkeyfun, потому что вся запись используется в качестве ключа сортировки.Функция
sort-paragraphsочень похожа, за исключением того, что еёsort-subrвызов выглядит так:(sort-subr reverse (lambda () (while (and (not (eobp)) (looking-at paragraph-separate)) (forward-line 1))) 'forward-paragraph)Маркеры, указывающие на любые записи сортировки, остаются без полезной позиции после того, как
sort-subrвернётся. - nextrecfun вызывается, когда точка находится в конце записи. Эта функция перемещает точку в начало следующей записи. Предполагается, что первая запись начинается в позиции точки, когда вызывается
- Пользовательский параметр: sort-fold-case
Если эта переменная ненулевая,
sort-subrи другие функции сортировки буфера игнорируют регистр при сравнении строк.
- Команда: sort-regexp-fields reverse record-regexp key-regexp start end
-
Эта команда сортирует область между start и end в алфавитном порядке, как указано record-regexp и key-regexp. Если reverse — отрицательное число, сортировка выполняется в обратном порядке.
Алфавитная сортировка означает, что два ключа сортировки сравниваются путём сравнения первых символов каждого, вторых символов каждого и так далее. Если несовпадение найдено, это означает, что ключи сортировки не равны; ключ сортировки, чья буква меньше в точке первого несовпадения, является меньшим ключом сортировки. Отдельные символы сравниваются в соответствии с их числовыми кодами символов в наборе символов Emacs.
Значение аргумента record-regexp определяет, как разделить буфер на записи сортировки. В конце каждой записи выполняется поиск этого регулярного выражения, и текст, который ему соответствует, берётся как следующая запись. Например, регулярное выражение '^.+$', которое соответствует строкам с хотя бы одним символом помимо перевода строки, сделало бы каждую такую строку записью сортировки. См. Регулярные выражения для описания синтаксиса и смысла регулярных выражений.
Значение аргумента key-regexp определяет, какая часть каждой записи является ключом сортировки. key-regexp может соответствовать всей записи или только её части. В последнем случае остальная часть записи не влияет на отсортированный порядок записей, но она переносится вместе с записью в новое положение.
Аргумент key-regexp может ссылаться на текст, соответствующий подвыражению record-regexp, или он может быть регулярным выражением сам по себе.
- ‘\digit’
-
тогда текст, соответствующий digit-ой группировке скобок «\(...\)» в record-regexp, является ключом сортировки.
- ‘\&’
-
тогда вся запись является ключом сортировки.
- регулярное выражение
тогда
sort-regexp-fieldsищет соответствие регулярному выражению в пределах записи. Если такое соответствие найдено, оно является ключом сортировки. Если для key-regexp нет соответствия в пределах записи, эта запись игнорируется, что означает, что её позиция в буфере не изменяется (другие записи могут перемещаться вокруг неё).
Например, если вы хотите отсортировать все строки в области по первому слову в каждой строке, начинающемуся с буквы 'f', вы должны установить record-regexp на '^.*$' и установить key-regexp на '\<f\w*\>'. Полученное выражение выглядит так:
(sort-regexp-fields nil "^.*$" "\\<f\\w*\\>" (region-beginning) (region-end))Если вы вызовете
sort-regexp-fieldsинтерактивно, он запросит record-regexp и key-regexp в минибуфере.
- Команда: sort-lines reverse start end
Эта команда сортирует строки в области между start и end в алфавитном порядке. Если reverse не нулевое, сортировка выполняется в обратном порядке.
- Команда: sort-paragraphs reverse start end
Эта команда сортирует абзацы в области между start и end в алфавитном порядке. Если reverse не нулевое, сортировка выполняется в обратном порядке.
- Команда: sort-pages reverse start end
Эта команда сортирует страницы в области между start и end в алфавитном порядке. Если reverse не нулевое, сортировка выполняется в обратном порядке.
- Команда: sort-fields field start end
Эта команда сортирует строки в области между start и end, сравнивая их в алфавитном порядке по field-ому полю каждой строки. Поля разделяются пробелами и нумеруются, начиная с 1. Если field отрицательно, сортировка выполняется по -field-ому полю с конца строки. Эта команда полезна для сортировки таблиц.
- Команда: sort-numeric-fields field start end
-
Эта команда сортирует строки в области между start и end, сравнивая их в числовом порядке по field-ому полю каждой строки. Поля разделяются пробелами и нумеруются, начиная с 1. Указанное поле должно содержать число в каждой строке области. Числа, начинающиеся с 0, обрабатываются как восьмеричные, а числа, начинающиеся с '0x', — как шестнадцатеричные.
Если field отрицательно, сортировка выполняется по -field-ому полю с конца строки. Эта команда полезна для сортировки таблиц.
- Пользовательский параметр: sort-numeric-base
Эта переменная определяет базу по умолчанию для
sort-numeric-fieldsпри разборе чисел.
- Команда: sort-columns reverse &optional beg end
-
Эта команда сортирует строки в области между beg и end, сравнивая их в алфавитном порядке по определенному диапазону столбцов. Позиции столбцов beg и end ограничивают диапазон столбцов для сортировки.
Если reverse не нулевое, сортировка выполняется в обратном порядке.
Необычным аспектом этой команды является то, что вся строка, содержащая позицию beg, и вся строка, содержащая позицию end, включаются в сортируемую область.
Обратите внимание, что
sort-columnsотклоняет текст, содержащий табуляции, потому что табуляции могут быть разделены по заданным столбцам. Используйте M-x untabify для преобразования табуляций в пробелы перед сортировкой.Когда это возможно, эта команда фактически вызывает утилиту
sort.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Sorting.html