black icon indicating copy to clipboard operation
black copied to clipboard

vim plugin: provide black-compatible `indentexpr`

Open kalekundert opened this issue 2 years ago • 3 comments

The way that vim automatically indents python code[^1] differs from the black format. I'm aware of two differences: (i) lines within parentheses/braces are indented twice rather than once and (ii) closing parentheses/braces are not dedented. These differences can be seen clearly by looking at a function argument list that spans multiple lines. Here is such a list as it is automatically formatted by vim (i.e. typed without hitting tab or backspace):

# $ vim -u /etc/vimrc +'filetype indent on' +'set ft=python'
def foo(
        a,
        b,
        c,
        ):
    pass

Here is the same argument list as it would be formatted by black (ignoring that it would be condensed onto a single line):

def foo(
    a,
    b,
    c,
):
    pass

Multiline list/dict/set comprehensions have the same behavior.

I personally find it annoying that the code I type does not immediately conform to the black style. As such, I think it'd be nice if the vim plugin provided by this repository included an indentexpr that implemented the black indentation rules.

Is there any interest in having something like this? I have some experience writing vim plugins, so I might be able to contribute something, but probably not in the near future.

Alternatively, is there an easy way to get vim to do what I want without having to write a bunch of vimscript code? A brief search didn't turn up any existing plugins or relevant vimrc settings, but this feels like it should be a common desire and I'm half-convinced that I'm missing something simple.

[^1]: As specified by /usr/share/vim/vim82/indent/python.vim.

kalekundert avatar Jul 01 '22 16:07 kalekundert

I would love to see such a configuration sample in the docs. I don't think anyone in the core team can actually write vimscript or anything similar though so we would be dependent on external contributions.

ichard26 avatar Jul 01 '22 16:07 ichard26

Alright, I'm glad there's some interest. I might make a PR if I ever get some time, but if anyone else is interested in working on this, don't let me stop you.

kalekundert avatar Jul 01 '22 19:07 kalekundert

vim-python-pep8-indent is a single file plugin that gets the job done. Should it be recommended to Vim users in the docs or should it just be added to the Black plugin itself?

aus-hawk avatar Sep 18 '22 07:09 aus-hawk