2016-01-21 86 views
1

我正在嘗試編寫一個名爲Remove的自定義vim命令,它只接受一個參數,並刪除文件中所有與該參數完全相同的行。例如,如果該文件是在Vim中自動縮進文件後的命令

int main() { 
    int x = 3; 
    int y = 4; 
    cout << x << endl; 
} 

,我用命令

:Remove int y = 4; 

輸出將

int main() { 
    int x = 3; 
    cout << x << endl; 
} 

我可以通過定義

:command -nargs=1 Remove :%s/<args>\n//g 
八九不離十

但是用這個命令該文件不是替換後正確縮進,這要求我在之後運行gg = G.

有沒有辦法讓gg = G作爲命令的一部分自動運行?

+0

使用:normal命令。將它與以下內容結合使用:如果需要多個命令,請執行。 – Ben

回答

2

當然。您可以連接多個命令與|。如果時間太長,可以將代碼分解爲:function。因爲=正常模式命令,而不是Ex命令:substitute,您需要通過:normal調用它; !避免映射干擾。

:command -nargs=1 Remove %s/<args>\n//g | normal! gg=G 
+0

謝謝!這對於學習如何|非常有用和正常!在vim工作。我實際上使用了yolenoyer的解決方案,因爲它似乎更優雅一些,但這種迴應似乎是我的問題的真正答案。 –

1

縮進是錯誤的,因爲你的Remove命令不會刪除找到的線前導空格/製表符。

而是重新縮進的所有文件,你可以修改你的命令把空格去掉以及:

:command -nargs=1 Remove %s/^\s*\V<args>\n//g 
  • ^行的開頭匹配;
  • \s*與可選空格或製表符匹配;你甚至可以在\n之前再次放置\s*,以考慮最後有隱藏空間的線;
  • 我加了\V,它可以避免你的命令參數中的特殊正則表達式字符被解釋。如果你不把它下面的命令:

    :Remove char *my_str = 0; 
    

    會因爲*的誤解。

+0

太棒了!我最終使用了這個解決方案,因爲它看起來更優雅一些,儘管Karkat的解決方案在技術上是對我寫的問題的更直接的回答。 –