2010-03-30 90 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

相关问题