2017-06-26 64 views
1

我正在尋找一種方法在Vim中的選定塊中排序。該方案是我有這樣的事情在vim中的塊中排序

{:a 
:c 
:b} 

# after sort, it should be 
{:a 
:b 
:c} 

我怎麼辦,現在是我進入:a:c新線路,運行排序選定的塊,然後把括號回來。我正在尋找一種排序方式,而無需執行額外的操作。

+1

如果插件是對你有好處,你可以嘗試_vis.vim_,在這裏看到:https://vi.stackexchange.com/questions/9869/sorting-a-column-without -altering-其他柱 – mbjoe

回答

1

下面將減少你的努力略有但仍不能完全解決這個問題,基本上將整理基礎上,冒號後會發生什麼,然後取出支架,但它不會爲你再次插入:

:'<,'>sort /^.\{-}:/ |%s/{\|}//g 

希望它有幫助,快樂vimming。

1

你可以做到這一點的一種方法是將大括號的內部讀入寄存器。

"ayi{ 

這將複製內容,行,沒有大括號。

然後你就可以運行插入排序功能

sort(split(getreg('a'))) 

這就要求modifiable標誌設置,爲你改變一個不可見的緩衝區。它對緩衝區a進行排序。然後,您可以將其粘貼到大括號vi{"ap內。

顯然你應該把這件事放在一個函數/宏或命令中。

1

這是Ex命令的一種方法。使用:global:sort對範圍進行排序非常簡單。下面的命令排序行之間的那些大括號分隔:

:g/^{/+1,/^}/-1sort 

但這裏的併發症是(在你的例子),封閉括號相同的(第一,最後)行作爲數據。我們需要先將它們分離到相鄰的行,然後再撤消它。 :substitute能做到這一點:

:%s/{\zs\|\ze}/\r/g 
:g/^{/+1,/^}/-1sort 
:%s/{\zs\n\|\n\ze}//g