Как выполнить поиск / замену в VIM при сохранении содержимого шаблона? - PullRequest
1 голос
/ 15 февраля 2012

Вот что я имею в виду -

Скажем, у меня их есть в моем файле

ActiveRecord::Base.connection.execute("select * from table1").each_hash do ..
ActiveRecord::Base.connection.execute("select * from table2").each_hash do ..
ActiveRecord::Base.connection.execute("select * from table3").each_hash do ..

client.query("select * from table1").each_hash do ..
client.query("select * from table2").each_hash do ..
client.query("select * from table3").each_hash do ..

Я хочу заменить только each_hash вызовов ActiveRecord на each(:as => :hash), поэтому я получу:

ActiveRecord::Base.connection.execute("select * from table1").each(:as => :hash) do ..
ActiveRecord::Base.connection.execute("select * from table2").each(:as => :hash) do ..
ActiveRecord::Base.connection.execute("select * from table3").each(:as => :hash) do ..

И оставлю строки client.query без изменений.

Я знаю, что могу использовать макросы, но как мне это сделать с помощью поиска / замены vim?Я думал об использовании этого:

%s/\.execute(.*).each_hash/ ...something... /g

Вопрос в том, как сохранить фактический запрос посредством поиска и замены (что происходит, где ... что-то ... есть)?

Ответы [ 2 ]

8 голосов
/ 15 февраля 2012

Идеальный вариант использования атома \zs в регулярном выражении vim.Это говорит vim игнорировать что-либо до (включая) \zs при выполнении замены.

:%s/\.execute(.\{-})\.each\zs_hash/(:as => :hash)/

Лучшее объяснение \zs можно найти по адресу :help /\zs.

4 голосов
/ 15 февраля 2012

Вы можете использовать команду global для фильтрации.

:g/^ActiveRecord/s/each_hash/each(:as => :hash)/g

Введите :help :g, чтобы получить справку:

:[range]g[lobal]/{pattern}/[cmd]
            Execute the Ex command [cmd] (default ":p") on the
            lines within [range] where {pattern} matches.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...