Como posso formatar argumentos / hashes Ruby no Vim?

0

Eu gostaria de poder facilmente formatar o código Ruby dentro do Vim.

Se eu tiver um método com um argumento hash

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

Como posso transformá-lo em

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

Ou, se eu tiver um hash normal

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

Nisso

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

Como posso conseguir isso com o Vim? Preciso de um plugin de algum tipo?

jordelver
fonte

Respostas:

6

A macro a seguir funciona nos dois casos:

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

Bata @qmais foobar(foo: "FOO", bar: "BAR")para obter:

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

e mais foobar = { foo: "FOO", bar: "BAR" }para começar:

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

EDITAR

Embora seja mais provável que essa macro seja salva entre sessões, é muito fácil sobrescrevê-la. Felizmente, é muito fácil convertê-lo em um mapeamento e mantê-lo na sua ~/.vimrc:

nnoremap <F6> $v%lohc<CR><CR><Up><C-r>"<Esc>:s/,/,\r/g<CR>:'[,']norm ==<CR>
romainl
fonte
Eu acho que há um pequeno erro no seu primeiro bloco de código: <CR><CR>kdeveria ser <CR><CR><Up>, porque ainda estamos no modo de inserção nesse ponto. O mapeamento no último bloco de código tem o erro corrigido.
Graysonwright
@graysonwright, obrigado. Eu não tenho ideia de como eu deixei isso passar desde que usei o correto <Up>na versão de mapeamento. Oh bem ...
romainl
Não se preocupe! Obrigado pela sua solução, eu estou usando isso sozinho!
Graysonwright
1

A resposta do @romainl é muito completa.

Mas se você é novo no vim, eu recomendo que apenas atue on-line que você deseja reformatar (em todos os lugares) e, em seguida, no modo normal:

:s/,/,\r/g

Deve ser o suficiente no começo.

Hettomei
fonte