Бывает иногда надо отсортировать строки текста. Конечно, при наборе текста или программного кода это бывает нужно нечасто, а вот при работе с текстовыми данными — весьма. А с данными приходится работать.
Команда для этого, конечно, есть:
:диапазон sort! ключи шаблон
Никакая часть команды, кроме sor (t не обязательна), не является необходимой. Если опущен диапазон, сортируется весь файл. Сортировка в лексикографическом порядке: по алфавиту, точнее — по порядку символов в кодировке (я говорил, что "ё" идет после "я"? А пробел — перед "а", причем цифры — между пробелом и "а"? А заглавные раньше строчных, причем "Ё" идет до "А"?).
Восклицательный знак — сортировка в обратном порядке.
Так, :sort отсортирует все строки, а :sort! — тоже, но в обратном порядке.
Можно указать диапазон, например, 1,42sort (строки с 1 по 42) или .,+5sort! (строки от текущей до пятой ниже), или -5,$sort (строки от той, что на пять выше, до последней).
Ключи позволяют настроить сортировку. Так, ключ i делает поиск регистронезависимым.
Часто бывает надо сортировать, сравнивая числа, а не символы, чтобы 100 шло позже 099. Ключ n включает сортиовку по первому целому числу в строке, а f — по первому вещественному. Минус считается, то есть отрицательные числа отрабатываются правильно. Восклицательный знак по-прежнему служит для сортировки по убыванию.
Есть ключи x, o и b для сортировки по шестнадцатеричным, восьмериным и двоичным числам. Отрицательные распознаются.
Ключ u позволяет пропустить идентичные строки (в результат заходит только одна). Это опасно: теряются строки, особенно если идентичность определяется по числу в начале. Но бывает необходимо, например, если есть пустые строки или повторы, которые нужно отфильтровать.
Теперь посмотрим на шаблон. Пока что мы его не использовали. Это регулярное выражение в слешах //. Если шаблон указан, совпадающее с ним выражение игнорируется. Например, /[^,]*,/ позволяет игнорировать первый столбец, если элементы строки в таблице разделены запятыми. А /\s*/ позволяет пропустить начальные пробелы. Если надо сортировать по второму числу строки, а числа разделены пробелами, то /\d\+\.\d*\s\+/ позволит пропустить первое число.
Вот еще пример из документации. :sort /.\{-}\ze\d/ Это сортировка по первому числу, с пропуском всего, что до. Обратите внимание на ленивый квантификатор \{-}, забирающий от 0 и более символов, но как можно меньше, а также на якорь \ze, на котором кончается совпадние. Цифра \d должна быть, но в совпадение не входит и потому не игнорируется.
Если указан ключ r, то шаблон используется для сравнения, то есть сортировка идет по совпадающему тексту. А строки, которые не совпадают, идут после, без изменения порядка.
Например, можно сортировать по словам с большой буквы, по фамилиям, игнорируя всякие частицы вроде "де" или "фон":
:sort r /[a-zа-яё]*\zs[A-ZА-ЯЁ]\w*/
Как я уже указал, если шаблон не совпадает в строках, то они идут в том же порядке, что и были, до тех, в которых совпадение есть. При обратном порядке порядок будет обратным и идти они будут после совпадающих.
Сортировка устойчива: одинаковые (в указанном смысле, например, если указан ключ n, то строки '42 girls' и '42 boys' считаются одинаковыми, так как целое число одно и то же) строки сохраняют порядок при обычной сортировке и меняют его на обратный при обратной.
Поддержка локальных кодировок не гарантирована. Русский вроде работает и utf8, и в cp1251. Только помните, что "Ё" идет раньше "А", "Я" идет раньше "а", а "ё" идет после "я". При этом латиница идет раньше, сначала A-Z, потом a-z. А пробел идет еще раньше.
Удачи, коллеги.