Например, если у меня есть четыре строки следующим образом:
первая строка
вторая строка
третья строка
четвертая строка
Я хочу обратить их
четвертая строка
третья строка
вторая строка
первая строка
Как я мог сделать это в VIM?
Например, если у меня есть четыре строки следующим образом:
первая строка
вторая строка
третья строка
четвертая строка
Я хочу обратить их
четвертая строка
третья строка
вторая строка
первая строка
Как я мог сделать это в VIM?
Чтобы перевернуть все строки в файле,
:g/^/m0
Для объяснения см.
:help 12.4
который также показывает, как обратить вспять только диапазон линий.
Выберите нужные строки, нажмите !
и в появившейся подсказке передайте строки через tac
a la :'<,'>!tac
. Смотрите man tac
для более подробной информации.
В Mac OS X tac
не существует, но вы можете использовать tail -r
для того же эффекта:
:%!tail -r
Это также хорошо работает для визуального режима:
:'<,'>!tail -r
Выдержка из справочной страницы tail(1)
:
Опция -r заставляет ввод отображаться в обратном порядке, построчно. Кроме того, этот параметр изменяет значение параметров -b, -c и -n. Когда указана опция -r, эти опции указывают количество байтов, строк или 512-байтовых блоков для отображения вместо байтов, строк или блоков от начала или конца входных данных, с которых начинается отображение. По умолчанию опция -r отображает все входные данные.
Для тех, кто более удобен в визуальном режиме:
1. Определите номер строки над выделенным фрагментом, используя :set nu
.
2. Shift-V
чтобы выделить выбор, который вы хотите перевернуть (визуальный режим).
3 :g/^/m <Line number from step 1>
.
Обратите внимание, что в визуальном режиме он будет автоматически отображаться как :'<,'>g/^/m <Line number>
когда вы вводите команду из 3.
Эта команда работает, перемещая выделение по одной строке за раз в номер строки, который вы ей даете. Когда второй элемент помещается в заданный номер строки, он выталкивает первый вниз до номера строки + 1. Затем третий толкает первый и второй вниз и так далее, пока весь список не будет помещен в один номер строки, что приводит к обратному упорядоченному списку.
Команда :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 )
Допустим, вы на линии 3, поэтому у нас диапазон от 3 до 6. Просто введите.
:3,6g/^/m2