Вот другой подход, который использует только 2 команды (: вызов и : удаление ).Процесс описан ниже.
command! -range -nargs=0 Sort
\ call append(<line2>,join(sort(split(join(getline(<line1>,<line2>)))), ' ')) |
\ <line1>,<line2>d _
Обратите внимание, что я использовал 3 строки с соответствующими символами продолжения для удобства чтения, но вы могли бы использовать только одну.
Сама команда
Команда определена как «Сортировка» и имеет две специальные характеристики:
-range
, очевидно, позволяет получать диапазон.Кроме того, он устанавливает диапазон по умолчанию для текущей строки (см. Справку для : диапазон команд ). -nargs=0
может быть опущен, поскольку он гарантирует только вас или будущих пользователейвашей команды не будет передавать ей никаких аргументов.
Перед обработкой команды текст, помеченный как <line1>
, будет заменен номером строки начала диапазона.Аналогично, <line2>
будет заменен номером строки конца диапазона.Проверьте справку по и последующие строки, чтобы узнать больше о замене текста в командах.
Что она делает
Команда выполнит свою задачу в два раза.Первый - это цепочка функций, которые можно прочитать изнутри.Давайте рассмотрим, что команда была вызвана с диапазоном визуального выбора ('<
, '>
), который переводится как (1,3).Функции будут выполняться следующим образом:
append(3, join(sort(split(join(getline(1,3)))), ' '))
С другой точки зрения:
#1 getline(1,3) " the result is a list with text from lines 1 to 3
#2 join(#1) " joins that list into a string
#3 split(#2) " splits the string on whitespace, resulting in a list
#4 sort(#3) " sorts that list
#5 join(#4, ' ') " joins the elements into a string separated by single space
#6 append(3, #5) " insert that string after line 3
Если вы начали с этого текста:
f e
d c
b a
Теперь выдолжно иметь следующее:
f e
d c
b a
a b c d e f
Это просто вопрос удаления этих строк.Это именно то, что делает следующая часть команды:
1,3d _
d
является сокращением для команды ex : delete , а _
является регистром для помещенияудаленный текст. В данном случае это регистр черная дыра .