[英]vim macro until pattern is matched
我有一系列狀態,沒有人需要經常修改,因此我想刪除空白。
我嘗試了以下擊鍵,因為數組和結尾行之間的逗號之間有一些空格字符:
q
a
/,
ENTER
FORWARD
v
/\\n
ENTER
d
不幸的是,任何格式化此格式的人都忽略了將任何空格放在'Montana'之后,因此當我運行宏51@a
,它在27次迭代后就中斷了。
我如何才能讓宏僅在\\s
匹配的情況下運行模式,或者更好的是,如何運行宏直到它識別出);
(數組末尾)。
編輯:這是一個例子。 請注意除MT
, NE
, NV
和NH
鍵之外的所有條目之后的兩個空格字符。
$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{}
}
這不能用先前接受的答案解決。
坦率地說,最簡單的答案就是加入隊伍。
如果視覺上選擇整個區域,然后按J
(或將范圍輸入到:join
),則所有行將以一行結尾。 (元素之間可能會有多余的空格,但這更容易解決,然后嘗試編寫宏)。
如果您想刪除多余的空格,可以運行
:s/,\s\+/,/g
在連接線上。
看看:h J
和:h :join
首先,您可以使用一個命令輕松刪除所有結尾的空格:
:%s/\s\+$//e
這將適用於文件的每一行。 如果只想在這段代碼上執行此操作,則可以指定不同的范圍(而不是%,它是整個文件)。 例如,您可以傳遞行號(1到51):
:1,51s/\s\+$//e
或首先在視覺上進行選擇,然后運行命令刪除空格(您必須在開始此序列的第一行中):
V/)<CR>:s/\s\+$//e
如果您確實想使用宏,則可以稍微調整(並簡化)宏:
qa0f,lDq
然后首先在視覺上選擇所有它們,然后一次在每一行上運行它(再次,從所需的行開始,我不會在這里放gg
,因為它可能只是文件的一部分):
V/)<CR>:normal @q
這將播放宏在每個選定的線,最多與線)
。
希望對您有所幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.