Spec-Zone.ru › Elisp

Сортировка текста

Функции сортировки, описанные в этом разделе, все переупорядочивают текст в буфере. Это в отличие от функции sort, которая переупорядочивает порядок элементов списка (см. Переупорядочивание). Возвращаемые этими функциями значения не имеют смысла.

Функция: sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun predicate

Эта функция — общая процедура сортировки текста, которая разбивает буфер на записи и затем сортирует их. Большинство команд в этом разделе используют эту функцию.

Чтобы понять, как работает sort-subr, представьте, что весь доступный участок буфера разделен на отдельные части, называемые записями сортировки. Записи могут быть или не быть смежными, но они не должны перекрываться. Часть каждой записи сортировки (возможно, вся она) обозначена как ключ сортировки. Сортировка переупорядочивает записи в порядке их ключей сортировки.

Обычно записи переупорядочиваются по возрастанию ключа сортировки. Если первый аргумент функции sort-subr, reverse, не nil, то записи сортировки переупорядочиваются по убыванию ключа сортировки.

Следующие четыре аргумента для sort-subr — функции, которые вызываются для перемещения точки по записи сортировки. Они вызываются многократно изнутри sort-subr.

  1. nextrecfun вызывается, когда точка находится в конце записи. Эта функция перемещает точку в начало следующей записи. Предполагается, что первая запись начинается в позиции точки, когда вызывается sort-subr. Поэтому, обычно, перед вызовом sort-subr следует переместить точку в начало буфера.

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

  2. endrecfun вызывается, когда точка находится внутри записи. Она перемещает точку в конец записи.
  3. startkeyfun вызывается для перемещения точки из начала записи в начало ключа сортировки. Этот аргумент необязателен; если он опущен, вся запись является ключом сортировки. Если он указан, функция должна либо вернуть ненулевое значение, используемое в качестве ключа сортировки, либо вернуть nil для указания, что ключ сортировки находится в буфере, начиная с точки. В последнем случае вызывается endkeyfun для нахождения конца ключа сортировки.
  4. 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 вернётся.

Пользовательский параметр: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API