我有一個看起來像的代碼塊: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中自動化?在宏
我有一個看起來像的代碼塊: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中自動化?在宏
速成班:
然後,您可以鍵入@q來執行q宏並重新格式化一個片段。如果它按預期工作,則輸入20 @ q執行20次。
我該如何結束宏錄製? – codecompleting
好的抱歉,沒有讀過,謝謝,嘗試它。 – codecompleting
這是q
:%s:^.* = \([^;]\+\);\_.[^.]\+\([^;]\+\);\n\n\+\([^(]\+\)(.*\.\(.*$\):\3((\1\2).\4
將用完全一樣的格式做(的.
S和=
等放置在原來的模式非常重要。
HTH
:3 – nXqd
宏是最簡單的,但另一種方法做它與全局命令 - :g/
正則表達式/
Ex命令。例如(不是您的示例 - 我們將在稍後討論),您可以使用:g/^\s*ICar/delete
將刪除所有以ICar
開頭的行(^
用於開始行,\s*
用於跳過用於縮進的製表符和空格)。
該方法優於宏的優點是可以在一個範圍內使用它:進入可視化模式,標記要重構的部分並使用全局命令。只有標記塊中的匹配纔會受到影響。如果使用宏,則需要反覆按@@
,直到清除該塊,計算您希望宏運行的確切次數,或者設置一個高數字,並使不匹配錯誤停止該宏。雖然第三個選項很容易執行,但它也相當危險 - 您需要確保在您想要重構的部分中出現只有 - 因此它不會影響代碼的無關部分 - 並且重構刪除它 - 否則宏將一遍又一遍地在相同的行上運行。
宏的優點是它們更易於記錄。在像您這樣複雜的重構中,您需要運行的全局命令可能非常長且複雜。一個宏做同樣的事情與全局命令一樣長和複雜 - 但你可以在記錄它時看到它是如何工作的 - 比設計全局命令時計算結果更容易。
幸運的是,你可以享受兩個世界!
首先你記錄你的宏,像cdleonard在他的答案中解釋的,主要區別有兩點。
第一個是,宏中的第一個按鍵應該是^
或_
- 轉到行中的第一個非空白字符(表示從qq_
開始,然後照常錄製)。這將保證宏從每次正確的位置開始。
第二個區別是,您不需要轉到宏末尾的下一個片段。全球司令部將爲您負責。
您錄製的宏後(我假設你把它記錄到q
)標誌使用可視模式下的所有片段,然後鍵入:g/^\s*ICar/norm @q
- 這將搜索標記範圍與ICar
開頭的行(可能有在它們之前縮進)並對它們執行宏。這是假設範圍內以ICar
開頭的所有內容 - 只有那些地方 - 纔是您想要重構的片段。如果你有以ICar
開頭的行,並且你不想重構,或者如果你有你想要應用宏的行,但是它們不以ICar
開頭 - 那麼你將不得不修改正則表達式。
宏是在這種情況下走的路。 – topek
任何提示?從來沒有使用它b4? – codecompleting
你應該顯示更多的片段。 – cdleonard