Як повернути замовлення обраних рядків у Vim?


94

Наприклад, якщо у мене є чотири рядки так:

перший рядок
другий рядок
третій рядок
четвертий рядок

Я хочу їх змінити

четвертий рядок
третій рядок
другий рядок
перший рядок

Як я міг це зробити у Vim?




1
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1 vi.stackexchange.com/a/2107/10254
qeatzy

Відповіді:


86

Щоб змінити всі рядки у файлі,

:g/^/m0

Пояснення див

:help 12.4

який також показує, як повернути лише діапазон ліній.


12
Чудова порада в точній розділі довідки! Підводячи підсумок: 1. встановіть маркер у останньому рядку, який ви хочете реверсувати (я називаю маркер 'a', використовуючи ma), 2. перемістіть курсор до першого рядка блоку, 3. введіть:'a,.g/^/m 'a
Brent Faust

68

Виберіть потрібні лінії, натисніть !і в отриманому підказці проведіть лінії через tacа-ля :'<,'>!tac. Дивіться man tacдокладнішу інформацію.


4
Щоб вибрати рядки, використовуйте shift+vдля входу візуальний режим лінії, а потім jдодайте рядки до вибору.
Вісбукі

Я можу підтвердити, що це працює і у Windows gvim, а також! В іншому випадку вам доведеться використовувати абсолютні номери рядків (можливо, ви можете використовувати відносні, але ви повинні бути обережними) з :g/^/m0(що теж дуже важко запам’ятати) ... Отже, по суті, tac повинен бути з vim незалежно від платформи ти продовжуєш, АЛЕ це не 100% вимскрипт, АЛЕ кого це хвилює: P
dylnmc

tac не є повністю рідною обробкою vim, але команда 'm'ove приймає номер рядка, і це не завжди розумно. Я часто використовую марку як частину діапазону, тому :.,'a!tacпрацює з мінімальними зусиллями.
студія

Після використання shift+vви можете }досягти наступного абзацу або порожнього вертикального пробілу. Також man tac: concatenate and print files in reverse.
nilon

33

У Mac OS X tacне існує, але ви можете використовувати tail -rтой же ефект:

:%!tail -r

Це також добре працює у візуальному режимі:

:'<,'>!tail -r

Витяг із сторінки користувача tail(1):

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


3
Відмінно! Отже, щоб забезпечити "tac" в ОС X:alias tac='tail -r'
Brent Faust

4
Можна також brew install coreutilsі використовувати gtac.
Ендрю Маршалл

1
Геніальність. Ніколи не думав використовувати! команди для цього виду маніпуляції візуальними рядками.
Charlie Dalsass

3

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

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

Ця команда працює, переміщуючи виділення по одному рядку в номер рядка, який ви йому надаєте. Коли другий елемент підштовхується до заданого номера рядка, він підштовхує перший вниз до номера рядка + 1. Потім третій натискає на перший і другий вниз і так далі, поки весь список не буде висунутий в єдиний номер рядка, в результаті чого зворотний упорядкований список.


4
Ви можете використовувати '<замість того, щоб вводити номер рядка вручну. Просто запустіть виділення на один рядок раніше і виконайте :'<,'>g/^/m'<.
Palec

3

Команда :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, але не Вибір, як :help mapmode-xрадить для відображення друкованих символів.)

(За матеріалами: http://tech.groups.yahoo.com/group/vim/message/34305 )


Це має бути прийнятою відповіддю ІМО. Найбільш корисно, і мені не потрібно пам’ятати :'<,'>g/^/m'<:)
Еліот

1
@Eliot, дякую! :) (Я додав трохи "бонусного контенту".;))
Аарон Тома

Як я можу сказати, що в цьому випадку вибір починається -1? Тому що рух починається з цього моменту.
SergioAraujo

@SergioAraujo: Щось таке, :-1,+1Revщо ти шукаєш? Знайте , що ви можете візуально вибрати діапазон , який ви хочете скасувати, наприклад: V7j:Rev. Якщо це не відповідає на ваше запитання, я його не зрозумів, тому вам потрібно буде розробити або перефразовувати це для мене.
Аарон Тома

1

Скажімо, що ви знаходитесь на лінії 3, отже, у нас діапазон від 3 до 6. Просто введіть.

:3,6g/^/m2

1
Ви можете залишити номер поточного рядка неявним: за допомогою курсору в першому рядку діапазону ви можете скоротити його до :,6g/^/m2; або коли на останній лінії полігону: :3,g/^/m2; і :3,6g/^/m2працює з будь-якої точки файлу.
Аарон Тома
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.