2013-03-16 3 views
6

Кто-нибудь есть плагин или макрос, чтобы заменить соответствующие { скобки } с do и end в Vim? Предпочтительно превращение заявления однострочного так:Замена соответсвующей {фигурные скобки} с Do/конца в Vim (Рубин)

foo.each { |f| f.whatever } 

в:

foo.each do |f| 
    f.whatever 
end 

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

foo.each { |f| 
    f.bars.each { |b| b.whatever } 
    hash = { a: 123, b: 456 } 
} 

в:

foo.each do |f| 
    f.bars.each { |b| b.whatever } 
    hash = { a: 123, b: 456 } 
end 

Я просмотрел vim-surround и rails.vim, и не нашел способа с ними.

+0

не знаю много о рубине. но почему ваш многострочный пример (вывод) был заменен только наружным '{,}', внутренним 'f.bars.each {...' not? – Kent

+0

Было бы неплохо поддержать оба варианта, но обычно мне не хотелось бы ничего, кроме одного уровня, развернутого за раз. В моем сценарии я предпочитаю встроенные блоки для отдельных операторов, но часто хочу, чтобы я хотел добавить другой оператор или два, и я хотел бы расширить блок для этого. Да, я знаю, что я должен полностью реорганизовать метод. –

ответ

7

Существует Vim плагин под названием Vim Blockle, который выполняет эту функцию.

После установки плагина вы поместите курсор на {}do или end и нажмите <Leader>b поменять стили блоков.

+0

Спасибо! Немного причудливый, но это в значительной степени то, что я искал. –

+1

Итак, я посмотрел на установку Blockle и наткнулся на рекомендацию автора Blockle для установки 'splitjoin' вместо: https://github.com/jgdavey/vim-blockle/issues/5 –

0

Я предполагаю, что в вашем примере нескольких строк, то выход будет:

foo.each do |f| 
    f.bars.each do |b| b.whatever end 
    hash = { a: 123, b: 456 } 
end 

то есть f.bars.each{...} следует заменить слишком.

если это цель, попробуйте следующее:

gg/each\s*{<enter>qqf{%send<esc><c-o>sdo<esc>[email protected] 

краткое объяснение:

gg    " move cursor to top 
/each\s*{<enter> " search pattern we want 
qq    " start recording macro to register q 
f{    " move to { 
%send<esc>  " move to closing {, and change it to "end", back to normal 
<c-o>sdo   " back to beginning { and change it into "do" 
<esc>nq   " back to normal, and go to next match, stop recording 

, то вы могли бы сделать, например [email protected] и проверить результат.

+0

Это не совсем то, что мне нужно. См. Мой комментарий к вопросу. Я хочу сделать это только для области текущей строки. Я проверю это и посмотрю, смогу ли я с ним работать. –

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