86

Например, если у меня есть четыре строки следующим образом:

первая строка
вторая строка
третья строка
четвертая строка

Я хочу обратить их

четвертая строка
третья строка
вторая строка
первая строка

Как я мог сделать это в VIM?

6 ответов6

84

Чтобы перевернуть все строки в файле,

:g/^/m0

Для объяснения см.

:help 12.4

который также показывает, как обратить вспять только диапазон линий.

62

Выберите нужные строки, нажмите ! и в появившейся подсказке передайте строки через tac a la :'<,'>!tac . Смотрите man tac для более подробной информации.

29

В Mac OS X tac не существует, но вы можете использовать tail -r для того же эффекта:

:%!tail -r

Это также хорошо работает для визуального режима:

:'<,'>!tail -r

Выдержка из справочной страницы tail(1) :

Опция -r заставляет ввод отображаться в обратном порядке, построчно. Кроме того, этот параметр изменяет значение параметров -b, -c и -n. Когда указана опция -r, эти опции указывают количество байтов, строк или 512-байтовых блоков для отображения вместо байтов, строк или блоков от начала или конца входных данных, с которых начинается отображение. По умолчанию опция -r отображает все входные данные.

3

Для тех, кто более удобен в визуальном режиме:
1. Определите номер строки над выделенным фрагментом, используя :set nu .
2. Shift-V чтобы выделить выбор, который вы хотите перевернуть (визуальный режим).
3 :g/^/m <Line number from step 1> .

Обратите внимание, что в визуальном режиме он будет автоматически отображаться как :'<,'>g/^/m <Line number> когда вы вводите команду из 3.

Эта команда работает, перемещая выделение по одной строке за раз в номер строки, который вы ей даете. Когда второй элемент помещается в заданный номер строки, он выталкивает первый вниз до номера строки + 1. Затем третий толкает первый и второй вниз и так далее, пока весь список не будет помещен в один номер строки, что приводит к обратному упорядоченному списку.

2

Команда :Rev[erse] и дополнительные сопоставления для вашего vimrc , так что вам не нужно запоминать и выполнять неочевидные шаги этого рецепта:

" Reverse the lines of the whole file or a visually highlighted block.
    " :Rev is a shorter prefix you can use.
    " Adapted from http://tech.groups.yahoo.com/group/vim/message/34305
command! -nargs=0 -bar -range=% Reverse
    \       let save_mark_t = getpos("'t")
    \<bar>      <line2>kt
    \<bar>      exe "<line1>,<line2>g/^/m't"
    \<bar>  call setpos("'t", save_mark_t)

nmap <Leader>r :Reverse<CR>
xmap <Leader>r :Reverse<CR>

(:xmap карты для Visual, но не в режиме Select, так как :help mapmode-x рекомендует для отображения печатных символов.)

(Основано на: http://tech.groups.yahoo.com/group/vim/message/34305 )

1

Допустим, вы на линии 3, поэтому у нас диапазон от 3 до 6. Просто введите.

:3,6g/^/m2

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .