我必須在vim中處理一些相對龐大的代碼文件。如何限制某些行的操作?
如何限制find-next normal-n
等操作到某個函數/塊?
我如何直觀地知道我是否在該區塊內或區域外?
尋找和行號似乎很尷尬,特別是我需要使用的行號通常是5位數字!
我必須在vim中處理一些相對龐大的代碼文件。如何限制某些行的操作?
如何限制find-next normal-n
等操作到某個函數/塊?
我如何直觀地知道我是否在該區塊內或區域外?
尋找和行號似乎很尷尬,特別是我需要使用的行號通常是5位數字!
可以使用m
在開始和你的塊結束設置標記(如ma
,mb
)和然後在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:firstline
和a:lastline
來訪問隱式傳遞的範圍。您可以使用line('.')
檢測您當前的衣服編號,並使用普通布爾邏輯(a:firstline <= line('.') && line('.') <= a:lastline
)檢測您是否在該塊內。有關vimscript功能的更多信息,請參見:help functions
。
另一種方法,是使用vim的內部i
和單a
選擇。例如,要刪除整個雙引號字符串,請在正常模式下使用da"
。要留下引號,請使用di"
。有關更多信息,請參見:help object-select
。
Vim使用Shift-v
通過行選擇。選擇了一系列行後,許多命令將被限制在選擇範圍內。
我不認爲搜索命令(/
,n
等)是受限於這種方式。
請勿添加[屬於-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
但是,我必須在視覺上選擇模式。不方便。 – Ayman 2010-03-30 08:37:52
對於像搜索命令和替換,你可以很容易地限制自己幾行:
:.,+3s/foo/bar/cg
替換當前行「富」的每一個發生,下面3條線與「酒吧」。不過,我認爲你無法爲搜索做到這一點。
問題是,我的「塊」操作超過1000行,從總數超過20k。而且我可以添加/刪除行,這樣就行不通了。 – Ayman 2010-03-30 08:36:22
好吧,如果你做了幾十個或更多的操作,打開一個新窗口,剪切和粘貼選定的行並沒有太多的麻煩,當你完成後,粘貼更新的文本。 – 2010-03-30 09:00:55
@關閉器:因爲這涉及使用vim來操作源代碼,所以SO可能比SU更合適。請參閱http://meta.stackexchange.com/questions/43198/emacs-questions-superuser-or-stackoverflow。 – 2010-03-30 07:42:32