X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/d33337b4d5dd61f88099d9755c172c7df943c5b2..92c611cfdf1124d0d2830ba9a503a7e7a57d2dee:/plugin/black.vim?ds=sidebyside

diff --git a/plugin/black.vim b/plugin/black.vim
index b174e59..f3e4409 100644
--- a/plugin/black.vim
+++ b/plugin/black.vim
@@ -14,7 +14,12 @@
 "    - restore cursor/window position after formatting
 
 if v:version < 700 || !has('python3')
-    echo "The black.vim plugin requires vim7.0+ with Python 3.6 support."
+    func! __BLACK_MISSING()
+        echo "The black.vim plugin requires vim7.0+ with Python 3.6 support."
+    endfunc
+    command! Black :call __BLACK_MISSING()
+    command! BlackUpgrade :call __BLACK_MISSING()
+    command! BlackVersion :call __BLACK_MISSING()
     finish
 endif
 
@@ -40,11 +45,35 @@ if !exists("g:black_skip_string_normalization")
   let g:black_skip_string_normalization = 0
 endif
 
-python3 << endpython3
+python3 << EndPython3
+import collections
 import os
 import sys
 import vim
 
+
+class Flag(collections.namedtuple("FlagBase", "name, cast")):
+  @property
+  def var_name(self):
+    return self.name.replace("-", "_")
+
+  @property
+  def vim_rc_name(self):
+    name = self.var_name
+    if name == "line_length":
+      name = name.replace("_", "")
+    if name == "string_normalization":
+      name = "skip_" + name
+    return "g:black_" + name
+
+
+FLAGS = [
+  Flag(name="line_length", cast=int),
+  Flag(name="fast", cast=bool),
+  Flag(name="string_normalization", cast=bool),
+]
+
+
 def _get_python_binary(exec_prefix):
   try:
     default = vim.eval("g:pymode_python").strip()
@@ -81,13 +110,23 @@ def _initialize_black_env(upgrade=False):
   if not virtualenv_path.is_dir():
     print('Please wait, one time setup for Black.')
     _executable = sys.executable
+    _base_executable = getattr(sys, "_base_executable", _executable)
     try:
-      sys.executable = str(_get_python_binary(Path(sys.exec_prefix)))
+      executable = str(_get_python_binary(Path(sys.exec_prefix)))
+      sys.executable = executable
+      sys._base_executable = executable
       print(f'Creating a virtualenv in {virtualenv_path}...')
       print('(this path can be customized in .vimrc by setting g:black_virtualenv)')
       venv.create(virtualenv_path, with_pip=True)
+    except Exception:
+      print('Encountered exception while creating virtualenv (see traceback below).')
+      print(f'Removing {virtualenv_path}...')
+      import shutil
+      shutil.rmtree(virtualenv_path)
+      raise
     finally:
       sys.executable = _executable
+      sys._base_executable = _base_executable
     first_install = True
   if first_install:
     print('Installing Black with pip...')
@@ -108,15 +147,20 @@ if _initialize_black_env():
 
 def Black():
   start = time.time()
-  fast = bool(int(vim.eval("g:black_fast")))
+  configs = get_configs()
   mode = black.FileMode(
-    line_length=int(vim.eval("g:black_linelength")),
-    string_normalization=not bool(int(vim.eval("g:black_skip_string_normalization"))),
+    line_length=configs["line_length"],
+    string_normalization=configs["string_normalization"],
     is_pyi=vim.current.buffer.name.endswith('.pyi'),
   )
+
   buffer_str = '\n'.join(vim.current.buffer) + '\n'
   try:
-    new_buffer_str = black.format_file_contents(buffer_str, fast=fast, mode=mode)
+    new_buffer_str = black.format_file_contents(
+      buffer_str,
+      fast=configs["fast"],
+      mode=mode,
+    )
   except black.NothingChanged:
     print(f'Already well formatted, good job. (took {time.time() - start:.4f}s)')
   except Exception as exc:
@@ -138,13 +182,26 @@ def Black():
         window.cursor = (len(window.buffer), 0)
     print(f'Reformatted in {time.time() - start:.4f}s.')
 
+def get_configs():
+  path_pyproject_toml = black.find_pyproject_toml(vim.eval("fnamemodify(getcwd(), ':t')"))
+  if path_pyproject_toml:
+    toml_config = black.parse_pyproject_toml(path_pyproject_toml)
+  else:
+    toml_config = {}
+
+  return {
+    flag.var_name: toml_config.get(flag.name, flag.cast(vim.eval(flag.vim_rc_name)))
+    for flag in FLAGS
+  }
+
+
 def BlackUpgrade():
   _initialize_black_env(upgrade=True)
 
 def BlackVersion():
   print(f'Black, version {black.__version__} on Python {sys.version}.')
 
-endpython3
+EndPython3
 
 command! Black :py3 Black()
 command! BlackUpgrade :py3 BlackUpgrade()