Я хотел бы иметь возможность легко форматировать код Ruby из Vim.

Если у меня есть метод с аргументом хэш

foobar(foo: "FOO", bar: "BAR")

Как я могу превратить это в

foobar(
    foo: "FOO",
    bar: "BAR"
)

Или, если у меня есть нормальный хэш

foobar = { foo: "FOO", bar: "BAR" }

В это

foobar = {
    foo: "FOO",
    bar: "BAR"
}

Как я могу добиться этого с Vim? Нужен ли мне какой-нибудь плагин?

2 ответа2

6

Следующий макрос работает в обоих случаях:

qq             " start recording in register q
$              " jump to the last character on the line, a ) or a }
v%             " select from here to the opening ( or {, inclusive
loh            " shrink the selection
c              " remove selection and enter insert mode
<CR><CR><Up>   " open the (){} and put the cursor in between
<C-r>"         " insert the content of default register
<Esc>          " go back to normal mode
:s/,/,\r/g<CR> " replace every , with itself followed by a newline
:'[,']norm ==  " format the whole thing
q              " stop recording

Нажмите @q над foobar(foo: "FOO", bar: "BAR") чтобы получить:

foobar(
    foo: "FOO",
    bar: "BAR"
)

и более foobar = { foo: "FOO", bar: "BAR" } чтобы получить:

foobar = {
    foo: "FOO",
    bar: "BAR"
}

РЕДАКТИРОВАТЬ

Хотя этот макрос, скорее всего, будет сохраняться между сеансами, его очень легко перезаписать. К счастью, его очень легко преобразовать в отображение и сохранить в вашем ~/.vimrc:

nnoremap <F6> $v%lohc<CR><CR><Up><C-r>"<Esc>:s/,/,\r/g<CR>:'[,']norm ==<CR>
1

Ответ от @romainl очень полный.

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

:s/,/,\r/g

Этого должно быть достаточно в начале.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .