2011-10-26 58 views
1

我有一個看起來像的代碼塊:Vim能否自動重構這段代碼?那是什麼宏?

ICar car = new Car<int>(10); 
var result = car.Start(100); 

Assert.IsTrue(result.IsValid); 

,我想轉換成這樣:

Assert.IsTrue((new Car<int>(10).Start(100)).IsValid); 

我對這些類型的片段與完全一樣的格式的20,會這樣在vim中自動化?在宏

+2

宏是在這種情況下走的路。 – topek

+0

任何提示?從來沒有使用它b4? – codecompleting

+0

你應該顯示更多的片段。 – cdleonard

回答

4

速成班:

  • 轉到ICAR在正常模式。
  • 按qq啓動宏。
  • 修改代碼。嘗試使用基於單詞的動作而不是左/右箭頭。
  • 轉到下一個片段,就像使用/ ICar一樣。
  • 在正常模式下再次按q可停止錄製。

然後,您可以鍵入@q來執行q宏並重新格式化一個片段。如果它按預期工作,則輸入20 @ q執行20次。

+0

我該如何結束宏錄製? – codecompleting

+0

好的抱歉,沒有讀過,謝謝,嘗試它。 – codecompleting

+0

這是q 開始和q停止錄製,然後@重播。我通常使用q寄存器宏。使用正則表達式像老闆一樣使用 – cdleonard

3
:%s:^.* = \([^;]\+\);\_.[^.]\+\([^;]\+\);\n\n\+\([^(]\+\)(.*\.\(.*$\):\3((\1\2).\4 

將用完全一樣的格式做(的. S和=等放置在原來的模式非常重要。

HTH

+0

:3 – nXqd

3

宏是最簡單的,但另一種方法做它與全局命令 - :g/正則表達式/Ex命令。例如(不是您的示例 - 我們將在稍後討論),您可以使用:g/^\s*ICar/delete將刪除所有以ICar開頭的行(^用於開始行,\s*用於跳過用於縮進的製表符和空格)。

該方法優於宏的優點是可以在一個範圍內使用它:進入可視化模式,標記要重構的部分並使用全局命令。只有標記塊中的匹配纔會受到影響。如果使用宏,則需要反覆按@@,直到清除該塊,計算您希望宏運行的確切次數,或者設置一個高數字,並使不匹配錯誤停止該宏。雖然第三個選項很容易執行,但它也相當危險 - 您需要確保在您想要重構的部分中出現只有 - 因此它不會影響代碼的無關部分 - 並且重構刪除它 - 否則宏將一遍又一遍地在相同的行上運行。

宏的優點是它們更易於記錄。在像您這樣複雜的重構中,您需要運行的全局命令可能非常長且複雜。一個宏做同樣的事情與全局命令一樣長和複雜 - 但你可以在記錄它時看到它是如何工作的 - 比設計全局命令時計算結果更容易。

幸運的是,你可以享受兩個世界!
首先你記錄你的宏,像cdleonard在他的答案中解釋的,主要區別有兩點。
第一個是,宏中的第一個按鍵應該是^_ - 轉到行中的第一個非空白字符(表示從qq_開始,然後照常錄製)。這將保證宏從每次正確的位置開始。
第二個區別是,您不需要轉到宏末尾的下一個片段。全球司令部將爲您負責。

您錄製的宏後(我假設你把它記錄到q)標誌使用可視模式下的所有片段,然後鍵入:g/^\s*ICar/norm @q - 這將搜索標記範圍與ICar開頭的行(可能有在它們之前縮進)並對它們執行宏。這是假設範圍內以ICar開頭的所有內容 - 只有那些地方 - 纔是您想要重構的片段。如果你有以ICar開頭的行,並且你不想重構,或者如果你有你想要應用宏的行,但是它們不以ICar開頭 - 那麼你將不得不修改正則表達式。