如何在Vim中格式化Ruby参数/哈希?


0

我希望能够轻松地在Vim中格式化Ruby代码。

如果我有一个带有哈希参数方法

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

我怎么能把它变成

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

或者,如果我有一个正常的哈希

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

进入这个

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

我怎样才能用Vim实现这个目标?我需要某种插件吗?

Answers:


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

@qfoobar(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>

我认为你的第一个代码块有一个小错误:<CR><CR>k应该是<CR><CR><Up>,因为那时我们仍处于插入模式。最后一个代码块中的映射已纠正错误。
格雷森赖特2016年

@graysonwright,谢谢。因为我<Up>在映射版本中使用了正确的,所以我不知道如何让这一个通过。好吧......
罗曼

别担心!感谢您的解决方案,我自己也在使用它!
格雷森赖特2016年

1

@romainl的答案非常完整。

但是如果你是vim的新手,我建议只在线上你想要重新格式化(到处都是),然后在正常模式下:

:s/,/,\r/g

一开始应该足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.