vim宏直到模式匹配

时间:2015-02-26 21:09:44

标签: vim macros

我有一系列状态,没有人经常需要修改,所以我想删除空格。

我尝试了以下击键,因为数组中的逗号和结束符之间有一些空白字符:

q a /, ENTER FORWARD v /\n ENTER d

不幸的是,任何格式化的人都忽略了在蒙大拿州之后放置任何空格,所以当我运行宏51@a时,它会在27次迭代后中断。

如果\s匹配,我怎么能只让宏运行模式,或者更好的是,如何运行宏直到它识别出);(数组结束)。

编辑:这是一个例子。请注意除了MTNENVNH以外的所有条目后的两个空格字符。

$state_list = array('AL'=>"Alabama",  
        'AK'=>"Alaska",  
        'AZ'=>"Arizona",  
        'AR'=>"Arkansas",  
        'CA'=>"California",  
        'CO'=>"Colorado",  
        'CT'=>"Connecticut",  
        'DE'=>"Delaware",  
        'DC'=>"District Of Columbia",  
        'FL'=>"Florida",  
        'GA'=>"Georgia",  
        'HI'=>"Hawaii",  
        'ID'=>"Idaho",  
        'IL'=>"Illinois",  
        'IN'=>"Indiana",  
        'IA'=>"Iowa",  
        'KS'=>"Kansas",  
        'KY'=>"Kentucky",  
        'LA'=>"Louisiana",  
        'ME'=>"Maine",  
        'MD'=>"Maryland",  
        'MA'=>"Massachusetts",  
        'MI'=>"Michigan",  
        'MN'=>"Minnesota",  
        'MS'=>"Mississippi",  
        'MO'=>"Missouri",  
        'MT'=>"Montana",
        'NE'=>"Nebraska",
        'NV'=>"Nevada",
        'NH'=>"New Hampshire",
        'NJ'=>"New Jersey",
        'NM'=>"New Mexico",
        'NY'=>"New York",
        'NC'=>"North Carolina",
        'ND'=>"North Dakota",
        'OH'=>"Ohio",  
        'OK'=>"Oklahoma",  
        'OR'=>"Oregon",  
        'PA'=>"Pennsylvania",  
        'RI'=>"Rhode Island",  
        'SC'=>"South Carolina",  
        'SD'=>"South Dakota",
        'TN'=>"Tennessee",  
        'TX'=>"Texas",  
        'UT'=>"Utah",  
        'VT'=>"Vermont",  
        'VA'=>"Virginia",  
        'WA'=>"Washington",  
        'WV'=>"West Virginia",  
        'WI'=>"Wisconsin",  
        'WY'=>"Wyoming"
);

要:

$state_list=array('AL'=>"Alabama",'AK'=>"Alaska",'AZ'=>"Arizona",'AR'=>"Arkansas",'CA'=>"California",'CO'=>"Colorado",'CT'=>"Connecticut",'DE'=>"Delaware",'DC'=>"District Of Columbia",'FL'=>"Florida",'GA'=>"Georgia",'HI'=>"Hawaii",'ID'=>"Idaho",'IL'=>"Illinois",'IN'=>"Indiana",'IA'=>"Iowa",'KS'=>"Kansas",'KY'=>"Kentucky",'LA'=>"Louisiana",'ME'=>"Maine",'MD'=>"Maryland",'MA'=>"Massachusetts",'MI'=>"Michigan",'MN'=>"Minnesota",'MS'=>"Mississippi",'MO'=>"Missouri",'MT'=>"Montana",'NE'=>"Nebraska",'NV'=>"Nevada",'NH'=>"New Hampshire",'NJ'=>"New Jersey",'NM'=>"New Mexico",'NY'=>"New York",'NC'=>"North Carolina",'ND'=>"North Dakota",'OH'=>"Ohio",'OK'=>"Oklahoma",'OR'=>"Oregon",'PA'=>"Pennsylvania",'RI'=>"Rhode Island",'SC'=>"South Carolina",'SD'=>"South Dakota",'TN'=>"Tennessee",'TX'=>"Texas",'UT'=>"Utah",'VT'=>"Vermont",'VA'=>"Virginia",'WA'=>"Washington",'WV'=>"West Virginia",'WI'=>"Wisconsin",'WY'=>"Wyoming");

编辑:

用谷歌搜索vim宏直到模式匹配,并遇到了我自己的问题。我现在有一个更好的例子:

    namespace A{
            class a{}
            class a{}
    }
    namespace B{
            class b{}
            class b{}
            class b{}
    }

需要成为:

    namespace A{
            class Aa{}
            class Aa{}
    }
    namespace B{
            class Bb{}
            class Bb{}
            class Bb{}
    }

以前接受的答案无法解决这个问题。

2 个答案:

答案 0 :(得分:3)

老实说,最简单的答案就是加入这些行。

如果您直观地选择整个区域,只需按J(或将范围提供到:join),所有行都会以一行结束。 (在元素之间可能存在多余的空格,但是在尝试编写宏时更容易修复。)

如果您想删除多余的空格,可以运行

:s/,\s\+/,/g

在联合线上。

查看:h J:h :join

答案 1 :(得分:0)

首先,您可以使用一个命令轻松删除所有尾随空格:

:%s/\s\+$//e

这将适用于文件的每一行。如果只想在此代码片段上执行此操作,则可以指定不同的范围(而不是%,即整个文件)。例如,您可以传递行号(1到51):

:1,51s/\s\+$//e

或首先在视觉上选择,然后运行命令删除空格(您必须在第一行开始此序列):

V/)<CR>:s/\s\+$//e

如果你真的想使用宏,你可以稍微调整(并简化)你的宏:

qa0f,lDq

然后首先在每一行上运行它,首先在视觉上选择所有这些(再次,在线开始你想要的,我不会把gg放在这里,因为它可能只是文件的一部分):

V/)<CR>:normal @q

这将在每个选定的行上播放宏,直到)的行。

我希望它有所帮助:)