2010-03-30 172 views
1

我必須在vim中處理一些相對龐大的代碼文件。如何限制某些行的操作?

如何限制find-next normal-n等操作到某個函數/塊?

我如何直觀地知道我是否在該區塊內或區域外?

尋找和行號似乎很尷尬,特別是我需要使用的行號通常是5位數字!

+0

@關閉器:因爲這涉及使用vim來操作源代碼,所以SO可能比SU更合適。請參閱http://meta.stackexchange.com/questions/43198/emacs-questions-superuser-or-stackoverflow。 – 2010-03-30 07:42:32

回答

3

可以使用m在開始和你的塊結束設置標記(如mamb)和然後在ex命令的範圍內將它們引用爲:'a,'b

bignose said你可以使用一個可視塊的命令,利用它可以傳遞到前命令創建一個隱含的區域:'<,'>

您還可以使用正則表達式來分隔塊(例如對於所有的行start:/start/,/end/

之間。例如end使用,使一個替代的範圍內的行:

:'<,'>s/foo/bar/g 
:'a,'bs/baz/quux/g 
:/harpo/,/chico/s/zeppo/groucho/g 

最後目視選擇的範圍被記住,所以你可以重新使用它而不用重新選擇它。

更多關於範圍,見:help range

您可以通過使用g//的範圍內,進一步限制自己。例如,如果你想只更換上含有在選定的範圍巴茲線與杆FOO:

:'<,'>g/baz/s/foo/bar/g 

當定義一個新的ex命令,可以傳遞給使用如<line1>,<line2>的前命令的範圍內。有關定義ex命令的更多信息,請參閱:help user-commands

在vimscript函數中,您可以使用a:firstlinea:lastline來訪問隱式傳遞的範圍。您可以使用line('.')檢測您當前的衣服編號,並使用普通布爾邏輯(a:firstline <= line('.') && line('.') <= a:lastline)檢測您是否在該塊內。有關vimscript功能的更多信息,請參見:help functions


另一種方法,是使用vim的內部i和單a選擇。例如,要刪除整個雙引號字符串,請在正常模式下使用da"。要留下引號,請使用di"。有關更多信息,請參見:help object-select

0

Vim使用Shift-v通過行選擇。選擇了一系列行後,許多命令將被限制在選擇範圍內。

我不認爲搜索命令(/,n等)是受限於這種方式。

+0

請勿添加[屬於-XXX]標籤。 http://meta.stackexchange.com/questions/10216/can-we-disallow-the-use-of-belongs-on-xxxxxxx-and-not-programming-related-tag – 2010-03-30 07:33:26

+0

但是,我必須在視覺上選擇模式。不方便。 – Ayman 2010-03-30 08:37:52

0

對於像搜索命令和替換,你可以很容易地限制自己幾行:

:.,+3s/foo/bar/cg 

替換當前行「富」的每一個發生,下面3條線與「酒吧」。不過,我認爲你無法爲搜索做到這一點。

+0

問題是,我的「塊」操作超過1000行,從總數超過20k。而且我可以添加/刪除行,這樣就行不通了。 – Ayman 2010-03-30 08:36:22

+3

好吧,如果你做了幾十個或更多的操作,打開一個新窗口,剪切和粘貼選定的行並沒有太多的麻煩,當你完成後,粘貼更新的文本。 – 2010-03-30 09:00:55

相關問題