題 如何反向選擇行在vim中排序?


例如,如果我有四行如下:

第一行
  第二行
  第三行
  第四行

我想把它們扭轉為

第四行
  第三行
  第二行
  第一行

我怎麼能在vim中這樣做?


84
2017-09-17 23:57


起源


重複 堆棧溢出: 如何在vim中翻轉視覺選擇? - Palec
有關: 扭轉所有線路@ Vim Wikia - Palec
:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1  vi.stackexchange.com/a/2107/10254 - qeatzy


答案:


要反轉文件中的所有行,

:g/^/m0

有關解釋,請參閱

:help 12.4

這也展示瞭如何反轉一系列線條。


82
2017-09-18 00:35



關於確切幫助部分的重要提示!總結一下:1。在你想要反向的最後一行設置一個標記(我用標記'a'命名 ma),2。將光標移動到塊的第一行,3。鍵入 :'a,.g/^/m 'a - Brent Faust
是的,包括 實際答案 這裡的Stack Exchange網站是必須的;提到外部資源是不夠的。 (但引用它,道具。) - ELLIOTTCABLE


點擊,選擇所需的行 !,並在結果提示管道中通過 tac 一個人 :'<,'>!tac。看到 man tac 更多細節。


62
2017-08-16 14:01



要選擇線條,請使用 shift+v 然後進入視線模式 j 添加行到選擇。 - wisbucky
我可以確認這適用於Windows gvim,以及!否則,你必須使用絕對行號(也許你可以使用相對,但你必須要小心) :g/^/m0 (這也很難記住)......所以,基本上,無論你在什麼平台上,tac應該與vim相關,但它不是100%vimscript,但是誰在乎:P - dylnmc
這真太了不起了 !!!! - itzjustricky
tac不是完全原生的vim處理,但是,'m'ove命令採用行號並且這並不總是合理的。我經常使用標記作為範圍的一部分,所以 :.,'a!tac 只需很少的努力。 - studog


在Mac OS X上, tac 不存在,但你可以使用 tail -r 達到同樣的效果:

:%!tail -r

這對於可視模式也很有效:

:'<,'>!tail -r

摘錄自 tail(1)的手冊頁:

-r選項使輸入以相反的順序顯示   線。此外,此選項更改-b,-c和的含義   -n選項。指定-r選項時,這些選項指定要顯示的字節數,行數或512字節塊,而不是   從輸入的開頭或結尾開始的字節,行或塊   哪個開始顯示。 -r選項的默認值為   顯示所有輸入。


29
2018-06-03 17:18



優秀!所以在OS X下提供'tac': alias tac='tail -r' - Brent Faust
你也可以 brew install coreutils 並使用 gtac。 - Andrew Marshall


對於那些更舒適的視覺模式:
 1.確定要使用的選項上方的行號 :set nu
 2。 Shift-V 突出顯示要翻轉的選項(可視模式)。
 3。 :g/^/m <Line number from step 1>

請注意,在可視模式下,它將自動顯示為      :'<,'>g/^/m <Line number> 當您從3鍵入命令時。

此命令的工作原理是將選擇一行一行移動到您為其提供的行號。當第二個項目被推入給定的行號時,它將第一個項目向下推到行號+ 1.然後第三個項目將第一個和第二個項目向下推,依此類推,直到整個列表被推入單個行號,從而導致逆序清單。


3
2018-06-13 20:52



你可以使用 '< 而不是手動輸入行號。只需提前選擇一行並執行即可 :'<,'>g/^/m'<。 - Palec
@Palec啊,非常有用的提示。謝謝! - horta


一個命令 :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 )


2
2018-02-09 11:10



這應該是IMO接受的答案。最普遍有用,我不必記住 :'<,'>g/^/m'< :) - Eliot
@Eliot,謝謝! :)(我添加了一些'獎勵內容'。;)) - Aaron Thoma
在這種情況下如何說選擇開始-1?因為此舉從此開始。 - SergioAraujo
@SergioAraujo:是這樣的 :-1,+1Rev 你在找什麼?知道你可以在視覺上選擇你要反轉的範圍,例如: V7j:Rev。如果這不能回答你的問題,我還沒理解,所以你需要為我詳細說明或改寫它。 - Aaron Thoma


讓我們說你在第3行,因此我們有3到6的範圍。只需鍵入。

:3,6g/^/m2

1
2018-02-17 10:25



您可以隱藏當前行的編號:將光標放在範圍的第一行,您可以縮短到 :,6g/^/m2;或者在該範圍的最後一行: :3,g/^/m2;和 :3,6g/^/m2 適用於文件中的任何位置。 - Aaron Thoma