2015-02-26 4 views
0

У меня есть массив состояний, которые никто не собирается изменять часто, поэтому я хочу удалить пустое пространство.vim macro до тех пор, пока шаблон не будет соответствовать

Я попытался следующие комбинации клавиш, поскольку есть некоторые символы пробела между запятыми в массиве и лицевым линиям:

qa/,ENTERFORWARDv/\nENTERd

К сожалению, кто бы ни отформатированных это заброшенные на месте любые пробелы после «Монтаны», поэтому, когда я запускаю макрос [email protected], он прерывается после 27 итераций.

Как я могу создать макрос, только если шаблон \s соответствует или еще лучше, как запустить макрос до тех пор, пока он не распознает ); (конец массива).

EDIT: Вот пример. Обратите внимание на два пробела после всех записей, кроме ключей 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" 
); 

To:

$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"); 

EDIT:

Просто гугле ВИМ макро до шаблон не найден, и наткнулся на мой собственный вопрос. У меня есть лучший пример в настоящее время:

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{} 
    } 

Это не может быть решен с помощью ранее принятым ответом.

+0

Это похоже на то, что было бы проще с чем-то еще. Можете ли вы привести пример ввода и вывода? – FDinoff

+0

Улыбка, вероятно, не может быть и речи, так как это то, что использует vim. –

+0

Я честно не знаю, что вы ожидаете от нового примера? Каким будет макрос? Что вы на самом деле пытаетесь изменить в этом примере? – FDinoff

ответ

3

Честно говоря, самым простым ответом было бы присоединиться к линиям.

Если вы визуализируете весь регион и просто нажмите J (или подайте диапазон до :join), все линии будут на одной линии. (Там могут быть избыточные промежуточные элементы, но легче их исправить, чем пытаться написать макрос).

Если вы затем хотите, чтобы удалить лишний пробел можно запустить

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

на присоединяемой линии.

Посмотрите на :h J и :h :join

+0

или сначала удалить все завершающие пробелы с ':% s/\ v \ s + $' и присоединяемся после этого. –

+0

':, /)/j', чтобы соединить все строки. См. ': H range' и': h: j' для более –

0

Прежде всего, вы можете легко удалить все конечные пробелы с помощью одной команды:

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

Это будет работать на каждой строке файла. Если вы хотите сделать это только на этом фрагменте кода, вы можете указать другой диапазон (вместо%, который является целым файлом).Например, вы можете передать номер строки (от 1 до 51):

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

или первый визуально выбрать, а затем выполнить команду удаления пробелов (вы должны быть на первой линии, начиная этой последовательности):

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

Если вы действительно хотите использовать макрос, вы можете немного настроить (и упростить) макрос:

qa0f,lDq 

, а затем запустить его на каждой строке сразу в первую очередь визуально выбрать все из них (опять же,начать на линии, которую вы хотите, я не буду ставить gg здесь, потому что это может быть только часть файла):

V/)<CR>:normal @q 

Это будет играть макрос над каждой выбранной линии, до линии с ).

Надеюсь, это поможет :)

Смежные вопросы