Как я могу изменить порядок строк так, чтобы первая строка появлялась в конце, а последняя была первой? (Это могут быть все строки в буфере, диапазон адресов или выбор визуального режима.)
Я хотел бы преобразовать
rat
ox
tiger
⋮
dog
pig
в
pig
dog
⋮
tiger
ox
rat
не прибегая к внешней команде, такой как tac
.
rearrangement
200_success
источник
источник
Ответы:
Сила глобальных будет работать здесь:
Или проще (спасибо @tommcdo)
Первая будет соответствовать каждой строке и каждой строке, удалить ее и вставить в верхнюю часть файла. Когда он перемещается по файлу, он переворачивает текст.
Вторая аналогично соответствует каждой строке и перемещает ее в начало файла.
Примечание: оба из них работают на весь файл и не будут корректно применяться для изменения подмножества строк. Посмотрите ответ Инго Карката для решения, которое работает в пределах диапазона.
Описание:
g
глобальная команда/^/
соответствует любой строке , которая имеет начало (т.е. все строки)exe
выполнить следующую строку"normal
выполнить нормальный режим командыdd
удаление строкиgg
перейти к верхней части файлаP
пасты выше текущей позицииmove 0
перемещает текущую строку ниже строки 0 (которая помещает ее в позицию 1 или в первую строку файла)источник
:normal
команды мы можем использовать команду Ex:move 0
, которая перемещает строку в начало буфера.:execute
необходимо, только когда команда должна быть построена динамически, например:execute 'normal' g:user_command
.:execute
потому что я часто заканчиваю тем, что добавляю другие команды Ex после уже существующей, и мне удобнее уже иметь их:exe
там, чем возвращаться и вставлять их позже. К сожалению, эта привычка просочилась в этот ответ, где он не применяется так часто.:execute
: поскольку оно принимает строку, оно дает четкое определение того, где заканчиваются команды в нормальном режиме, даже если я не создаю строку, мне легче найти сбалансированные кавычки, чем искать<esc>
или что угодно, чтобы прекратить режим. Опять же, это личное предпочтение и привычка. :-):9,11g/^/move 8
... Последнее число должно быть началом диапазона минус 1 (адаптировано из ответа Инго).Этот однострочный (для вашего
~/.vimrc
) определяет:Reverse
команду; Вы также можете использовать эту:global
часть напрямую, но синтаксис:move
(который итеративно сдвигает строки до начала диапазона, тем самым обращая его) не легко запомнить:источник
<line1>
&<line2>
должны сделать эту работу в диапазоне, то есть::7,9Reverse
(они являются особенностямиcommand
, а неglobal
илиmove
). Более простой:command! -bar -range=% Reverse :global/^/m 0
также будет работать, но только для всего буфера ...Чистый Вим:
Объяснение:
Источник: Переверните все линии и Power of g на vim wikia.
Несколько примеров с использованием внешних команд:
tac
(часть GNU coreutils -cat
обратная):tail
в BSD / OSX (не POSIX-совместимых):Для большего количества идей, см .:
источник
:g/^/m0
то же самое:g/^/move 0
, что ответ Джона?tac
). Но я подозреваю, что отрицательный голос произошел из-за повторения ответа.tac
было упомянуто OP, но все другие подобные вопросы в любом случае дублируют это, так что хорошо бы упомянуть это снова. Джон взял этот cmd из комментария @tommcdo, я изначально взял его из DerMike , но я думаю, что он взял его просто из викия, поэтому я дал кредит vim wikia, поэтому он не полностью повторяется, поскольку объяснение совершенно другое.В духе функциональности VimL:
getline(1, line('$'))
возвращает список всех строк в буфере.'$'
это специальный аргумент, дляline()
которого указывается последняя строка в буфере.reverse(...)
переворачивает список ввода, на месте. Можно использовать,reverse(copy(...))
если список ввода не должен быть изменен.setline(1, ...)
заменяет указанную строку вторым аргументом. Когда второй аргумент является списком, то количество строк, равное длине списка, заменяется содержимым списка.Если вы хотите, вы также можете определить команду, которая принимает диапазон (по умолчанию
%
весь буфер)источник
hlsearch
включены), такие как:g/
команда из других ответов ... Возможно, производительность еще хуже? Так как онgetline(1, line('$'))
получает весь буфер в памяти.reverse()
кажется, на месте, так что это должно занять очень мало памяти как таковой ...Согласно документации Vim usr_12.txt - Умные хитрости
источник
Используя относительные числа. Абзац начинается со строки 13 и спамит еще 4 строки
источник