2014-01-19 70 views
1

我的代碼很長的線,我需要拆分成單獨的行:插入數量的空格替換

Method(new Namespace::ClassName(LongParameterName1, LongParameterName1, LongParameterName3)); 

我想要把它分解方式如下:

Method(new Namespace::ClassName(LongParameterName1, 
           LongParameterName1, 
           LongParameterName3)); 

的正則表達式將如下所示:

s:, :,\r       : 

如何設置一些空間(如果可以的話)?

注意:我有很多這樣的行,所以這就是爲什麼我想使用正則表達式。

回答

2

你可以計算出你想要在以下幾行開始變量名,並使用替換命令與表達,喜歡的位置:

:let c = strridx(getline('.'), '(') 
:s/\v(,)/\=submatch(1) . "\r" . printf("%" . c . "s", " ")/g 

我寫了他們在兩個指令,以避免降價滾動,但你可以用管道角色加入他們。

第一條指令搜索最後一個開放圓括號(從結尾開始的第一個圓括號)的位置。第二條指令使用printf()在換行符後面插入一定數量的空格。

它產生:

Method(new Namespace::ClassName(LongParameterName1, 
           LongParameterName1, 
           LongParameterName3)); 

多次重複這個任務,你可以在一個功能包這些說明,並從:g命令給他們打電話。我希望你明白這個主意。

+0

但是,沒有本地選項的正則表達式,對不對? – Alex

+0

這取決於你的意思與**本機**。據我所知,要在替換部件中進行操作,您必須對其進行評估。這是大多數使用的正則表達式引擎中實現的功能。 – Birei

1

那我會怎樣做:

  • 設置的一個宏(qa「)的搜尋下一個」,」(<escape>\,),跳進入編輯模式,然後回車(i<enter>),退出記錄宏(q
  • 重播宏觀速度非常快,直到我用線(@a然後@@
  • 代替在第二行的光標,並開始錄製新宏(qa「)來完成:I然後按<space>直到參數被充分標籤,並移動到下一行,而更換光標在第一卡拉科特(<escape>j^),退出錄製宏(q
  • 和重放像第一個最終宏(@a然後@@

這看起來比正則表達式不太優雅,但恕我直言,當它把事情做好的時候,那麼,它的時間去完成的事情:)

1

我會先縮進使用正則表達式。例如...

s:, :,\r:g 
V?Method<cr><cr>8> 

在現實實踐中我可能會使用>.......而不是8>,因爲它可以讓你想象你多少縮進。