web-dev-qa-db-ja.com

Vimで選択した行の順序を逆にするにはどうすればよいですか?

たとえば、次の4行があるとします。

最初の行
2行目
3行目
4行目

それらを反転させたい

4行目
3行目
2行目
最初の行

Vimでこれを行うにはどうすればよいですか?

100
Jichao

ファイルのすべての行を反転するには、

:g/^/m0

説明については、

:help 12.4

また、ある範囲の行だけを反転する方法も示しています。

91
garyjohn

目的の行を選択し、!、および結果のプロンプトでtac a la :'<,'>!tac。見る man tac 詳細については。

76
Rhys Ulerich

Mac OS Xではtacは存在しませんが、_tail -r_を使用して同じ効果を得ることができます。

_:%!tail -r
_

これはビジュアルモードでもうまく機能します。

_:'<,'>!tail -r
_

tail(1)のマンページからの抜粋:

-rオプションを使用すると、入力が行ごとに逆の順序で表示されます。さらに、このオプションは、-b、-c、および-nオプションの意味を変更します。 -rオプションが指定されている場合、これらのオプションは、表示を開始する入力の最初または最後のバイト、行、またはブロックの代わりに、表示するバイト、行、または512バイトブロックの数を指定します。 -rオプションのデフォルトでは、すべての入力が表示されます。

36
Thomas Perl

コマンド_: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_ _:help mapmode-x_は印刷可能な文字のマッピングを推奨しているため、選択モードではなくビジュアルモードにマップします。)

(ベース: http://tech.groups.yahoo.com/group/vim/message/34305

4
Aaron Thoma

ビジュアルモードに慣れている方のために:
1。 :set nuを使用して、反転する選択範囲の上の行番号を特定します。
2。 Shift-Vは、反転する選択を強調表示します(ビジュアルモード)。
3。 :g/^/m <Line number from step 1>

ビジュアルモードでは、3からコマンドを入力すると、自動的に:'<,'>g/^/m <Line number>と表示されます。

このコマンドは、選択範囲を一度に1行ずつ、指定した行番号に移動することで機能します。 2番目のアイテムが指定された行番号にプッシュされると、最初のアイテムが行番号+ 1にプッシュされます。次に、3番目のアイテムが1番目と2番目をプッシュして、リスト全体が単一の行番号にプッシュされるまで続きます。逆順リスト。

3
horta

行3にいるとします。したがって、範囲は3〜6です。入力するだけです。

:3,6g/^/m2
1
SergioAraujo