From 09915f4bd2d13652c089b9a96408b39116d82eb0 Mon Sep 17 00:00:00 2001 From: shaoran Date: Wed, 29 Sep 2021 02:31:29 +0200 Subject: [PATCH] Allow to pass the FileMode options in the vim plugin (#1319) --- CHANGES.md | 4 +++ autoload/black.vim | 49 +++++++++++++++++++++++++++++++++--- docs/integrations/editors.md | 2 ++ plugin/black.vim | 14 ++++++++++- 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1ff2cea..61d3178 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,10 @@ - Remove dependency on aiohttp-cors (#2500) - Bump required aiohttp version to 3.7.4 (#2509) +### Integrations + +- Allow to pass `target_version` in the vim plugin (#1319) + ## 21.9b0 ### Packaging diff --git a/autoload/black.vim b/autoload/black.vim index 29d8f2b..9ff5c23 100644 --- a/autoload/black.vim +++ b/autoload/black.vim @@ -98,13 +98,47 @@ if _initialize_black_env(): import black import time -def Black(): +def get_target_version(tv): + if isinstance(tv, black.TargetVersion): + return tv + ret = None + try: + ret = black.TargetVersion[tv.upper()] + except KeyError: + print(f"WARNING: Target version {tv!r} not recognized by Black, using default target") + return ret + +def Black(**kwargs): + """ + kwargs allows you to override ``target_versions`` argument of + ``black.FileMode``. + + ``target_version`` needs to be cleaned because ``black.FileMode`` + expects the ``target_versions`` argument to be a set of TargetVersion enums. + + Allow kwargs["target_version"] to be a string to allow + to type it more quickly. + + Using also target_version instead of target_versions to remain + consistent to Black's documentation of the structure of pyproject.toml. + """ start = time.time() configs = get_configs() + + black_kwargs = {} + if "target_version" in kwargs: + target_version = kwargs["target_version"] + + if not isinstance(target_version, (list, set)): + target_version = [target_version] + target_version = set(filter(lambda x: x, map(lambda tv: get_target_version(tv), target_version))) + black_kwargs["target_versions"] = target_version + mode = black.FileMode( line_length=configs["line_length"], string_normalization=not configs["skip_string_normalization"], is_pyi=vim.current.buffer.name.endswith('.pyi'), + **black_kwargs, ) quiet = configs["quiet"] @@ -160,8 +194,17 @@ def BlackVersion(): EndPython3 -function black#Black() - :py3 Black() +function black#Black(...) + let kwargs = {} + for arg in a:000 + let arg_list = split(arg, '=') + let kwargs[arg_list[0]] = arg_list[1] + endfor +python3 << EOF +import vim +kwargs = vim.eval("kwargs") +EOF + :py3 Black(**kwargs) endfunction function black#BlackUpgrade() diff --git a/docs/integrations/editors.md b/docs/integrations/editors.md index 6098631..d3be7c0 100644 --- a/docs/integrations/editors.md +++ b/docs/integrations/editors.md @@ -116,6 +116,8 @@ Wing supports black via the OS Commands tool, as explained in the Wing documenta Commands and shortcuts: - `:Black` to format the entire file (ranges not supported); + - you can optionally pass `target_version=` with the same values as in the + command line. - `:BlackUpgrade` to upgrade _Black_ inside the virtualenv; - `:BlackVersion` to get the current version of _Black_ inside the virtualenv. diff --git a/plugin/black.vim b/plugin/black.vim index 3bdca62..90d2047 100644 --- a/plugin/black.vim +++ b/plugin/black.vim @@ -53,8 +53,20 @@ endif if !exists("g:black_quiet") let g:black_quiet = 0 endif +if !exists("g:black_target_version") + let g:black_target_version = "" +endif +function BlackComplete(ArgLead, CmdLine, CursorPos) + return [ +\ 'target_version=py27', +\ 'target_version=py36', +\ 'target_version=py37', +\ 'target_version=py38', +\ 'target_version=py39', +\ ] +endfunction -command! Black :call black#Black() +command! -nargs=* -complete=customlist,BlackComplete Black :call black#Black() command! BlackUpgrade :call black#BlackUpgrade() command! BlackVersion :call black#BlackVersion() -- 2.39.5