Loading ...
Sorry, an error occurred while loading the content.

Patch 7.3.1163

Expand Messages
  • Bram Moolenaar
    Patch 7.3.1163 Problem: Not easy to load Python modules. Solution: Search python2 , python3 and pythonx directories in runtimepath for Python
    Message 1 of 13 , Jun 10, 2013
    • 0 Attachment
      Patch 7.3.1163
      Problem: Not easy to load Python modules.
      Solution: Search "python2", "python3" and "pythonx" directories in
      'runtimepath' for Python modules. (ZyX)
      Files: runtime/doc/if_pyth.txt, src/configure.in, src/ex_cmds2.c,
      src/if_py_both.h, src/if_python.c, src/if_python3.c,
      src/testdir/test86.in, src/testdir/test87.in, src/auto/configure


      *** ../vim-7.3.1162/runtime/doc/if_pyth.txt 2013-06-02 18:20:12.000000000 +0200
      --- runtime/doc/if_pyth.txt 2013-06-10 20:51:21.000000000 +0200
      ***************
      *** 180,185 ****
      --- 180,191 ----
      Like |strwidth()|: returns number of display cells str occupies, tab
      is counted as one cell.

      + vim.foreach_rtp(callable) *python-foreach_rtp*
      + Call the given callable for each path in 'runtimepath' until either
      + callable returns something but None, the exception is raised or there
      + are no longer paths. If stopped in case callable returned non-None,
      + vim.foreach_rtp function returns the value returned by callable.
      +
      vim.chdir(*args, **kwargs) *python-chdir*
      vim.fchdir(*args, **kwargs) *python-fchdir*
      Run os.chdir or os.fchdir, then all appropriate vim stuff.
      ***************
      *** 300,305 ****
      --- 306,418 ----
      supported, and may cause the program to crash. This should probably be
      fixed.

      + *python2-directory* *python3-directory* *pythonx-directory*
      + Python 'runtimepath' handling *python-special-path*
      +
      + In python vim.VIM_SPECIAL_PATH special directory is used as a replacement for
      + the list of paths found in 'runtimepath': with this directory in sys.path and
      + vim.path_hooks in sys.path_hooks python will try to load module from
      + {rtp}/python2 (or python3) and {rtp}/pythonx (for both python versions) for
      + each {rtp} found in 'runtimepath'.
      +
      + Implementation for python 2 is the following: usual importing code with empty
      + lists in place of sys.path_hooks and sys.meta_path. Code is similar to the
      + below, but written in C: >
      +
      + # Assuming vim variable is already accessible and is set to the current
      + # module
      + import sys
      +
      + def find_module(fullname):
      + return vim
      +
      + def load_module(fullname):
      + # see vim._get_paths below
      + new_path = _get_paths()
      +
      + try: old_path = sys.path
      + except: pass
      + try: old_meta_path = sys.meta_path
      + except: pass
      + try: old_path_hooks = sys.path_hooks
      + except: pass
      +
      + sys.meta_path = []
      + sys.path_hooks = sys.meta_path
      + sys.path = new_path
      +
      + try:
      + exec ('import ' + fullname + ' as m') # No actual exec in C code
      + return m
      + finally:
      + e = None
      + try: sys.path = old_path
      + except Exception as e: pass
      + try: sys.meta_path = old_meta_path
      + except Exception as e: pass
      + try: sys.path_hooks = old_path_hooks
      + except Exception as e: pass
      + if e:
      + raise e
      +
      + def path_hook(d):
      + if d == VIM_SPECIAL_PATH:
      + return vim
      + raise ImportError
      +
      + sys.path_hooks.append(path_hook)
      +
      + Implementation for python 3 is cleaner: code is similar to the following, but,
      + again, written in C: >
      +
      + from importlib.machinery import PathFinder
      + import sys
      +
      + class Finder(PathFinder):
      + @classmethod
      + def find_module(cls, fullname):
      + # see vim._get_paths below
      + new_path = _get_paths()
      +
      + # super().find_module is also a class method
      + # super() is not used because this variant is easier to implement
      + # in C
      + return PathFinder.find_module(fullname, new_path)
      +
      + def path_hook(path):
      + if path == VIM_SPECIAL_PATH:
      + return Finder
      + raise ImportError
      +
      + sys.path_hooks.append(path_hook)
      +
      + vim.VIM_SPECIAL_PATH *python-VIM_SPECIAL_PATH*
      + String constant used in conjunction with vim path hook. If path hook
      + installed by vim is requested to handle anything but path equal to
      + vim.VIM_SPECIAL_PATH constant it raises ImportError. In the only other
      + case it uses special loader.
      +
      + Note: you must not use value of this constant directly, always use
      + vim.VIM_SPECIAL_PATH object.
      +
      + vim.load_module(name) *python-load_module*
      + vim.find_module(...) *python-find_module*
      + vim.path_hook(path) *python-path_hook*
      + Methods or objects used to implement path loading as described above.
      + You should not be using any of these directly except for vim.path_hook
      + in case you need to do something with sys.meta_path. It is not
      + guaranteed that any of the objects will exist in the future vim
      + versions. In fact, load_module and find_module methods do not exists
      + in python3.
      +
      + vim._get_paths *python-_get_paths*
      + Methods returning a list of paths which will be searched for by path
      + hook. You should not rely on this method being present in future
      + versions, but can use it for debugging.
      +
      + It returns a list of {rtp}/python2 (or {rtp}/python3) and
      + {rtp}/pythonx directories for each {rtp} in 'runtimepath'.
      +
      ==============================================================================
      3. Buffer objects *python-buffer*

      ***************
      *** 340,346 ****
      |BufFilePost| autocommands are launched.
      b.number Buffer number. Can be used as |python-buffers| key.
      Read-only.
      ! b.valid True or False. Buffer object becames invalid when
      corresponding buffer is wiped out.

      The buffer object methods are:
      --- 453,459 ----
      |BufFilePost| autocommands are launched.
      b.number Buffer number. Can be used as |python-buffers| key.
      Read-only.
      ! b.valid True or False. Buffer object becomes invalid when
      corresponding buffer is wiped out.

      The buffer object methods are:
      ***************
      *** 446,452 ****
      row, col (read-only) On-screen window position in display cells.
      First position is zero.
      tabpage (read-only) Window tab page.
      ! valid (read-write) True or False. Window object becames invalid
      when corresponding window is closed.

      The height attribute is writable only if the screen is split horizontally.
      --- 559,565 ----
      row, col (read-only) On-screen window position in display cells.
      First position is zero.
      tabpage (read-only) Window tab page.
      ! valid (read-write) True or False. Window object becomes invalid
      when corresponding window is closed.

      The height attribute is writable only if the screen is split horizontally.
      ***************
      *** 471,477 ****
      windows Like |python-windows|, but for current tab page.
      vars The tab page |t:| variables.
      window Current tabpage window.
      ! valid True or False. Tab page object becames invalid when
      corresponding tab page is closed.

      TabPage object type is available using "TabPage" attribute of vim module.
      --- 584,590 ----
      windows Like |python-windows|, but for current tab page.
      vars The tab page |t:| variables.
      window Current tabpage window.
      ! valid True or False. Tab page object becomes invalid when
      corresponding tab page is closed.

      TabPage object type is available using "TabPage" attribute of vim module.
      *** ../vim-7.3.1162/src/configure.in 2013-06-02 19:14:11.000000000 +0200
      --- src/configure.in 2013-06-10 20:51:21.000000000 +0200
      ***************
      *** 863,872 ****
      ${vi_cv_path_python} -c 'import sys; print sys.version[:3]'`
      ]])

      ! dnl -- it must be at least version 2.2
      ! AC_MSG_CHECKING(Python is 2.2 or better)
      if ${vi_cv_path_python} -c \
      ! "import sys; sys.exit(${vi_cv_var_python_version} < 2.2)"
      then
      AC_MSG_RESULT(yep)

      --- 863,872 ----
      ${vi_cv_path_python} -c 'import sys; print sys.version[:3]'`
      ]])

      ! dnl -- it must be at least version 2.3
      ! AC_MSG_CHECKING(Python is 2.3 or better)
      if ${vi_cv_path_python} -c \
      ! "import sys; sys.exit(${vi_cv_var_python_version} < 2.3)"
      then
      AC_MSG_RESULT(yep)

      *** ../vim-7.3.1162/src/ex_cmds2.c 2013-06-10 20:10:40.000000000 +0200
      --- src/ex_cmds2.c 2013-06-10 20:51:21.000000000 +0200
      ***************
      *** 2737,2742 ****
      --- 2737,2746 ----
      * When "all" is TRUE repeat for all matches, otherwise only the first one is
      * used.
      * Returns OK when at least one match found, FAIL otherwise.
      + *
      + * If "name" is NULL calls callback for each entry in runtimepath. Cookie is
      + * passed by reference in this case, setting it to NULL indicates that callback
      + * has done its job.
      */
      int
      do_in_runtimepath(name, all, callback, cookie)
      ***************
      *** 2768,2774 ****
      buf = alloc(MAXPATHL);
      if (buf != NULL && rtp_copy != NULL)
      {
      ! if (p_verbose > 1)
      {
      verbose_enter();
      smsg((char_u *)_("Searching for \"%s\" in \"%s\""),
      --- 2772,2778 ----
      buf = alloc(MAXPATHL);
      if (buf != NULL && rtp_copy != NULL)
      {
      ! if (p_verbose > 1 && name != NULL)
      {
      verbose_enter();
      smsg((char_u *)_("Searching for \"%s\" in \"%s\""),
      ***************
      *** 2782,2788 ****
      {
      /* Copy the path from 'runtimepath' to buf[]. */
      copy_option_part(&rtp, buf, MAXPATHL, ",");
      ! if (STRLEN(buf) + STRLEN(name) + 2 < MAXPATHL)
      {
      add_pathsep(buf);
      tail = buf + STRLEN(buf);
      --- 2786,2798 ----
      {
      /* Copy the path from 'runtimepath' to buf[]. */
      copy_option_part(&rtp, buf, MAXPATHL, ",");
      ! if (name == NULL)
      ! {
      ! (*callback)(buf, (void *) &cookie);
      ! if (!did_one)
      ! did_one = (cookie == NULL);
      ! }
      ! else if (STRLEN(buf) + STRLEN(name) + 2 < MAXPATHL)
      {
      add_pathsep(buf);
      tail = buf + STRLEN(buf);
      ***************
      *** 2821,2827 ****
      }
      vim_free(buf);
      vim_free(rtp_copy);
      ! if (p_verbose > 0 && !did_one)
      {
      verbose_enter();
      smsg((char_u *)_("not found in 'runtimepath': \"%s\""), name);
      --- 2831,2837 ----
      }
      vim_free(buf);
      vim_free(rtp_copy);
      ! if (p_verbose > 0 && !did_one && name != NULL)
      {
      verbose_enter();
      smsg((char_u *)_("not found in 'runtimepath': \"%s\""), name);
      *** ../vim-7.3.1162/src/if_py_both.h 2013-06-10 20:47:33.000000000 +0200
      --- src/if_py_both.h 2013-06-10 20:55:17.000000000 +0200
      ***************
      *** 24,29 ****
      --- 24,31 ----
      #endif
      #define DOPY_FUNC "_vim_pydo"

      + static const char *vim_special_path = "_vim_path_";
      +
      #define PyErr_SetVim(str) PyErr_SetString(VimError, str)

      #define RAISE_NO_EMPTY_KEYS PyErr_SetString(PyExc_ValueError, \
      ***************
      *** 55,60 ****
      --- 57,64 ----
      static PyObject *py_chdir;
      static PyObject *py_fchdir;
      static PyObject *py_getcwd;
      + static PyObject *vim_module;
      + static PyObject *vim_special_path_object;

      /*
      * obtain a lock on the Vim data structures
      ***************
      *** 779,797 ****
      return _VimChdir(py_fchdir, args, kwargs);
      }

      /*
      * Vim module - Definitions
      */

      static struct PyMethodDef VimMethods[] = {
      ! /* name, function, calling, documentation */
      ! {"command", VimCommand, METH_VARARGS, "Execute a Vim ex-mode command" },
      ! {"eval", VimEval, METH_VARARGS, "Evaluate an expression using Vim evaluator" },
      ! {"bindeval", VimEvalPy, METH_VARARGS, "Like eval(), but returns objects attached to vim ones"},
      ! {"strwidth", VimStrwidth, METH_VARARGS, "Screen string width, counts <Tab> as having width 1"},
      ! {"chdir", (PyCFunction)VimChdir, METH_VARARGS|METH_KEYWORDS, "Change directory"},
      ! {"fchdir", (PyCFunction)VimFchdir, METH_VARARGS|METH_KEYWORDS, "Change directory"},
      ! { NULL, NULL, 0, NULL }
      };

      /*
      --- 783,950 ----
      return _VimChdir(py_fchdir, args, kwargs);
      }

      + typedef struct {
      + PyObject *callable;
      + PyObject *result;
      + } map_rtp_data;
      +
      + static void
      + map_rtp_callback(char_u *path, void *_data)
      + {
      + void **data = (void **) _data;
      + PyObject *pathObject;
      + map_rtp_data *mr_data = *((map_rtp_data **) data);
      +
      + if (!(pathObject = PyString_FromString((char *) path)))
      + {
      + *data = NULL;
      + return;
      + }
      +
      + mr_data->result = PyObject_CallFunctionObjArgs(mr_data->callable,
      + pathObject, NULL);
      +
      + Py_DECREF(pathObject);
      +
      + if (!mr_data->result || mr_data->result != Py_None)
      + *data = NULL;
      + else
      + {
      + Py_DECREF(mr_data->result);
      + mr_data->result = NULL;
      + }
      + }
      +
      + static PyObject *
      + VimForeachRTP(PyObject *self UNUSED, PyObject *args)
      + {
      + map_rtp_data data;
      +
      + if (!PyArg_ParseTuple(args, "O", &data.callable))
      + return NULL;
      +
      + data.result = NULL;
      +
      + do_in_runtimepath(NULL, FALSE, &map_rtp_callback, &data);
      +
      + if (data.result == NULL)
      + {
      + if (PyErr_Occurred())
      + return NULL;
      + else
      + {
      + Py_INCREF(Py_None);
      + return Py_None;
      + }
      + }
      + return data.result;
      + }
      +
      + /*
      + * _vim_runtimepath_ special path implementation.
      + */
      +
      + static void
      + map_finder_callback(char_u *path, void *_data)
      + {
      + void **data = (void **) _data;
      + PyObject *list = *((PyObject **) data);
      + PyObject *pathObject1, *pathObject2;
      + char *pathbuf;
      + size_t pathlen;
      +
      + pathlen = STRLEN(path);
      +
      + #if PY_MAJOR_VERSION < 3
      + # define PY_MAIN_DIR_STRING "python2"
      + #else
      + # define PY_MAIN_DIR_STRING "python3"
      + #endif
      + #define PY_ALTERNATE_DIR_STRING "pythonx"
      +
      + #define PYTHONX_STRING_LENGTH 7 /* STRLEN("pythonx") */
      + if (!(pathbuf = PyMem_New(char,
      + pathlen + STRLEN(PATHSEPSTR) + PYTHONX_STRING_LENGTH + 1)))
      + {
      + PyErr_NoMemory();
      + *data = NULL;
      + return;
      + }
      +
      + mch_memmove(pathbuf, path, pathlen + 1);
      + add_pathsep((char_u *) pathbuf);
      +
      + pathlen = STRLEN(pathbuf);
      + mch_memmove(pathbuf + pathlen, PY_MAIN_DIR_STRING,
      + PYTHONX_STRING_LENGTH + 1);
      +
      + if (!(pathObject1 = PyString_FromString(pathbuf)))
      + {
      + *data = NULL;
      + PyMem_Free(pathbuf);
      + return;
      + }
      +
      + mch_memmove(pathbuf + pathlen, PY_ALTERNATE_DIR_STRING,
      + PYTHONX_STRING_LENGTH + 1);
      +
      + if (!(pathObject2 = PyString_FromString(pathbuf)))
      + {
      + Py_DECREF(pathObject1);
      + PyMem_Free(pathbuf);
      + *data = NULL;
      + return;
      + }
      +
      + PyMem_Free(pathbuf);
      +
      + if (PyList_Append(list, pathObject1)
      + || PyList_Append(list, pathObject2))
      + *data = NULL;
      +
      + Py_DECREF(pathObject1);
      + Py_DECREF(pathObject2);
      + }
      +
      + static PyObject *
      + Vim_GetPaths(PyObject *self UNUSED)
      + {
      + PyObject *r;
      +
      + if (!(r = PyList_New(0)))
      + return NULL;
      +
      + do_in_runtimepath(NULL, FALSE, &map_finder_callback, r);
      +
      + if (PyErr_Occurred())
      + {
      + Py_DECREF(r);
      + return NULL;
      + }
      +
      + return r;
      + }
      +
      /*
      * Vim module - Definitions
      */

      static struct PyMethodDef VimMethods[] = {
      ! /* name, function, calling, documentation */
      ! {"command", VimCommand, METH_VARARGS, "Execute a Vim ex-mode command" },
      ! {"eval", VimEval, METH_VARARGS, "Evaluate an expression using Vim evaluator" },
      ! {"bindeval", VimEvalPy, METH_VARARGS, "Like eval(), but returns objects attached to vim ones"},
      ! {"strwidth", VimStrwidth, METH_VARARGS, "Screen string width, counts <Tab> as having width 1"},
      ! {"chdir", (PyCFunction)VimChdir, METH_VARARGS|METH_KEYWORDS, "Change directory"},
      ! {"fchdir", (PyCFunction)VimFchdir, METH_VARARGS|METH_KEYWORDS, "Change directory"},
      ! {"foreach_rtp", VimForeachRTP, METH_VARARGS, "Call given callable for each path in &rtp"},
      ! #if PY_MAJOR_VERSION < 3
      ! {"find_module", FinderFindModule, METH_VARARGS, "Internal use only, returns loader object for any input it receives"},
      ! {"load_module", LoaderLoadModule, METH_VARARGS, "Internal use only, tries importing the given module from &rtp by temporary mocking sys.path (to an rtp-based one) and unsetting sys.meta_path and sys.path_hooks"},
      ! #endif
      ! {"path_hook", VimPathHook, METH_VARARGS, "Hook function to install in sys.path_hooks"},
      ! {"_get_paths", (PyCFunction)Vim_GetPaths, METH_NOARGS, "Get &rtp-based additions to sys.path"},
      ! { NULL, NULL, 0, NULL}
      };

      /*
      ***************
      *** 5036,5041 ****
      --- 5189,5202 ----
      } CurrentObject;
      static PyTypeObject CurrentType;

      + #if PY_MAJOR_VERSION >= 3
      + typedef struct
      + {
      + PyObject_HEAD
      + } FinderObject;
      + static PyTypeObject FinderType;
      + #endif
      +
      static void
      init_structs(void)
      {
      ***************
      *** 5281,5286 ****
      --- 5442,5522 ----
      PYTYPE_READY(FunctionType);
      PYTYPE_READY(OptionsType);
      PYTYPE_READY(OutputType);
      + #if PY_MAJOR_VERSION >= 3
      + PYTYPE_READY(FinderType);
      + #endif
      + return 0;
      + }
      +
      + static int
      + init_sys_path()
      + {
      + PyObject *path;
      + PyObject *path_hook;
      + PyObject *path_hooks;
      +
      + if (!(path_hook = PyObject_GetAttrString(vim_module, "path_hook")))
      + return -1;
      +
      + if (!(path_hooks = PySys_GetObject("path_hooks")))
      + {
      + PyErr_Clear();
      + path_hooks = PyList_New(1);
      + PyList_SET_ITEM(path_hooks, 0, path_hook);
      + if (PySys_SetObject("path_hooks", path_hooks))
      + {
      + Py_DECREF(path_hooks);
      + return -1;
      + }
      + Py_DECREF(path_hooks);
      + }
      + else if (PyList_Check(path_hooks))
      + {
      + if (PyList_Append(path_hooks, path_hook))
      + {
      + Py_DECREF(path_hook);
      + return -1;
      + }
      + Py_DECREF(path_hook);
      + }
      + else
      + {
      + VimTryStart();
      + EMSG(_("Failed to set path hook: sys.path_hooks is not a list\n"
      + "You should now do the following:\n"
      + "- append vim.path_hook to sys.path_hooks\n"
      + "- append vim.VIM_SPECIAL_PATH to sys.path\n"));
      + VimTryEnd(); /* Discard the error */
      + Py_DECREF(path_hook);
      + return 0;
      + }
      +
      + if (!(path = PySys_GetObject("path")))
      + {
      + PyErr_Clear();
      + path = PyList_New(1);
      + Py_INCREF(vim_special_path_object);
      + PyList_SET_ITEM(path, 0, vim_special_path_object);
      + if (PySys_SetObject("path", path))
      + {
      + Py_DECREF(path);
      + return -1;
      + }
      + Py_DECREF(path);
      + }
      + else if (PyList_Check(path))
      + {
      + if (PyList_Append(path, vim_special_path_object))
      + return -1;
      + }
      + else
      + {
      + VimTryStart();
      + EMSG(_("Failed to set path: sys.path is not a list\n"
      + "You should now append vim.VIM_SPECIAL_PATH to sys.path"));
      + VimTryEnd(); /* Discard the error */
      + }
      +
      return 0;
      }

      ***************
      *** 5332,5337 ****
      --- 5568,5576 ----
      {"List", (PyObject *)&ListType},
      {"Function", (PyObject *)&FunctionType},
      {"Options", (PyObject *)&OptionsType},
      + #if PY_MAJOR_VERSION >= 3
      + {"Finder", (PyObject *)&FinderType},
      + #endif
      };

      typedef int (*object_adder)(PyObject *, const char *, PyObject *);
      ***************
      *** 5417,5421 ****
      --- 5656,5672 ----
      else
      PyErr_Clear();

      + if (!(vim_special_path_object = PyString_FromString(vim_special_path)))
      + return -1;
      +
      + ADD_OBJECT(m, "VIM_SPECIAL_PATH", vim_special_path_object);
      +
      + #if PY_MAJOR_VERSION >= 3
      + ADD_OBJECT(m, "_PathFinder", path_finder);
      + ADD_CHECKED_OBJECT(m, "_find_module",
      + (py_find_module = PyObject_GetAttrString(path_finder,
      + "find_module")));
      + #endif
      +
      return 0;
      }
      *** ../vim-7.3.1162/src/if_python.c 2013-06-10 20:47:33.000000000 +0200
      --- src/if_python.c 2013-06-10 20:55:04.000000000 +0200
      ***************
      *** 24,32 ****
      /* uncomment this if used with the debug version of python.
      * Checked on 2.7.4. */
      /* #define Py_DEBUG */
      ! /* Note: most of time you can add -DPy_DEBUG to CFLAGS in place of uncommenting
      */
      ! /* uncomment this if used with the debug version of python, but without its
      * allocator */
      /* #define Py_DEBUG_NO_PYMALLOC */

      --- 24,32 ----
      /* uncomment this if used with the debug version of python.
      * Checked on 2.7.4. */
      /* #define Py_DEBUG */
      ! /* Note: most of time you can add -DPy_DEBUG to CFLAGS in place of uncommenting
      */
      ! /* uncomment this if used with the debug version of python, but without its
      * allocator */
      /* #define Py_DEBUG_NO_PYMALLOC */

      ***************
      *** 168,173 ****
      --- 168,174 ----
      # define PyErr_SetNone dll_PyErr_SetNone
      # define PyErr_SetString dll_PyErr_SetString
      # define PyErr_SetObject dll_PyErr_SetObject
      + # define PyErr_ExceptionMatches dll_PyErr_ExceptionMatches
      # define PyEval_InitThreads dll_PyEval_InitThreads
      # define PyEval_RestoreThread dll_PyEval_RestoreThread
      # define PyEval_SaveThread dll_PyEval_SaveThread
      ***************
      *** 184,189 ****
      --- 185,191 ----
      # define PyLong_Type (*dll_PyLong_Type)
      # define PyList_GetItem dll_PyList_GetItem
      # define PyList_Append dll_PyList_Append
      + # define PyList_Insert dll_PyList_Insert
      # define PyList_New dll_PyList_New
      # define PyList_SetItem dll_PyList_SetItem
      # define PyList_Size dll_PyList_Size
      ***************
      *** 233,238 ****
      --- 235,241 ----
      # define PyFloat_Type (*dll_PyFloat_Type)
      # define PyImport_AddModule (*dll_PyImport_AddModule)
      # define PySys_SetObject dll_PySys_SetObject
      + # define PySys_GetObject dll_PySys_GetObject
      # define PySys_SetArgv dll_PySys_SetArgv
      # define PyType_Type (*dll_PyType_Type)
      # define PyType_Ready (*dll_PyType_Ready)
      ***************
      *** 305,310 ****
      --- 308,314 ----
      static void(*dll_PyErr_SetNone)(PyObject *);
      static void(*dll_PyErr_SetString)(PyObject *, const char *);
      static void(*dll_PyErr_SetObject)(PyObject *, PyObject *);
      + static int(*dll_PyErr_ExceptionMatches)(PyObject *);
      static void(*dll_PyEval_InitThreads)(void);
      static void(*dll_PyEval_RestoreThread)(PyThreadState *);
      static PyThreadState*(*dll_PyEval_SaveThread)(void);
      ***************
      *** 320,326 ****
      static PyTypeObject* dll_PyInt_Type;
      static PyTypeObject* dll_PyLong_Type;
      static PyObject*(*dll_PyList_GetItem)(PyObject *, PyInt);
      ! static PyObject*(*dll_PyList_Append)(PyObject *, PyObject *);
      static PyObject*(*dll_PyList_New)(PyInt size);
      static int(*dll_PyList_SetItem)(PyObject *, PyInt, PyObject *);
      static PyInt(*dll_PyList_Size)(PyObject *);
      --- 324,331 ----
      static PyTypeObject* dll_PyInt_Type;
      static PyTypeObject* dll_PyLong_Type;
      static PyObject*(*dll_PyList_GetItem)(PyObject *, PyInt);
      ! static int(*dll_PyList_Append)(PyObject *, PyObject *);
      ! static int(*dll_PyList_Insert)(PyObject *, int, PyObject *);
      static PyObject*(*dll_PyList_New)(PyInt size);
      static int(*dll_PyList_SetItem)(PyObject *, PyInt, PyObject *);
      static PyInt(*dll_PyList_Size)(PyObject *);
      ***************
      *** 366,371 ****
      --- 371,377 ----
      static PyObject*(*dll_PyFloat_FromDouble)(double);
      static PyTypeObject* dll_PyFloat_Type;
      static int(*dll_PySys_SetObject)(char *, PyObject *);
      + static PyObject *(*dll_PySys_GetObject)(char *);
      static int(*dll_PySys_SetArgv)(int, char **);
      static PyTypeObject* dll_PyType_Type;
      static int (*dll_PyType_Ready)(PyTypeObject *type);
      ***************
      *** 431,436 ****
      --- 437,443 ----
      static PyObject *imp_PyExc_TypeError;
      static PyObject *imp_PyExc_ValueError;
      static PyObject *imp_PyExc_RuntimeError;
      + static PyObject *imp_PyExc_ImportError;

      # define PyExc_AttributeError imp_PyExc_AttributeError
      # define PyExc_IndexError imp_PyExc_IndexError
      ***************
      *** 439,444 ****
      --- 446,452 ----
      # define PyExc_TypeError imp_PyExc_TypeError
      # define PyExc_ValueError imp_PyExc_ValueError
      # define PyExc_RuntimeError imp_PyExc_RuntimeError
      + # define PyExc_ImportError imp_PyExc_ImportError

      /*
      * Table of name to function pointer of python.
      ***************
      *** 471,476 ****
      --- 479,485 ----
      {"PyErr_SetNone", (PYTHON_PROC*)&dll_PyErr_SetNone},
      {"PyErr_SetString", (PYTHON_PROC*)&dll_PyErr_SetString},
      {"PyErr_SetObject", (PYTHON_PROC*)&dll_PyErr_SetObject},
      + {"PyErr_ExceptionMatches", (PYTHON_PROC*)&dll_PyErr_ExceptionMatches},
      {"PyEval_InitThreads", (PYTHON_PROC*)&dll_PyEval_InitThreads},
      {"PyEval_RestoreThread", (PYTHON_PROC*)&dll_PyEval_RestoreThread},
      {"PyEval_SaveThread", (PYTHON_PROC*)&dll_PyEval_SaveThread},
      ***************
      *** 487,492 ****
      --- 496,502 ----
      {"PyLong_Type", (PYTHON_PROC*)&dll_PyLong_Type},
      {"PyList_GetItem", (PYTHON_PROC*)&dll_PyList_GetItem},
      {"PyList_Append", (PYTHON_PROC*)&dll_PyList_Append},
      + {"PyList_Insert", (PYTHON_PROC*)&dll_PyList_Insert},
      {"PyList_New", (PYTHON_PROC*)&dll_PyList_New},
      {"PyList_SetItem", (PYTHON_PROC*)&dll_PyList_SetItem},
      {"PyList_Size", (PYTHON_PROC*)&dll_PyList_Size},
      ***************
      *** 532,537 ****
      --- 542,548 ----
      {"PyFloat_FromDouble", (PYTHON_PROC*)&dll_PyFloat_FromDouble},
      {"PyImport_AddModule", (PYTHON_PROC*)&dll_PyImport_AddModule},
      {"PySys_SetObject", (PYTHON_PROC*)&dll_PySys_SetObject},
      + {"PySys_GetObject", (PYTHON_PROC*)&dll_PySys_GetObject},
      {"PySys_SetArgv", (PYTHON_PROC*)&dll_PySys_SetArgv},
      {"PyType_Type", (PYTHON_PROC*)&dll_PyType_Type},
      {"PyType_Ready", (PYTHON_PROC*)&dll_PyType_Ready},
      ***************
      *** 706,711 ****
      --- 717,723 ----
      imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
      imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
      imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError");
      + imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError");
      Py_XINCREF(imp_PyExc_AttributeError);
      Py_XINCREF(imp_PyExc_IndexError);
      Py_XINCREF(imp_PyExc_KeyError);
      ***************
      *** 713,718 ****
      --- 725,731 ----
      Py_XINCREF(imp_PyExc_TypeError);
      Py_XINCREF(imp_PyExc_ValueError);
      Py_XINCREF(imp_PyExc_RuntimeError);
      + Py_XINCREF(imp_PyExc_ImportError);
      Py_XDECREF(exmod);
      }
      #endif /* DYNAMIC_PYTHON */
      ***************
      *** 735,740 ****
      --- 748,757 ----
      static PyObject *ListGetattr(PyObject *, char *);
      static PyObject *FunctionGetattr(PyObject *, char *);

      + static PyObject *LoaderLoadModule(PyObject *, PyObject *);
      + static PyObject *FinderFindModule(PyObject *, PyObject *);
      + static PyObject *VimPathHook(PyObject *, PyObject *);
      +
      #ifndef Py_VISIT
      # define Py_VISIT(obj) visit(obj, arg)
      #endif
      ***************
      *** 1359,1369 ****
      }
      #endif

      static int
      PythonMod_Init(void)
      {
      - PyObject *mod;
      -
      /* The special value is removed from sys.path in Python_Init(). */
      static char *(argv[2]) = {"/must>not&exist/foo", NULL};

      --- 1376,1487 ----
      }
      #endif

      + static PyObject *
      + LoaderLoadModule(PyObject *self, PyObject *args)
      + {
      + char *fullname;
      + PyObject *path;
      + PyObject *meta_path;
      + PyObject *path_hooks;
      + PyObject *new_path;
      + PyObject *r;
      + PyObject *new_list;
      +
      + if (!PyArg_ParseTuple(args, "s", &fullname))
      + return NULL;
      +
      + if (!(new_path = Vim_GetPaths(self)))
      + return NULL;
      +
      + if (!(new_list = PyList_New(0)))
      + return NULL;
      +
      + #define GET_SYS_OBJECT(objstr, obj) \
      + obj = PySys_GetObject(objstr); \
      + PyErr_Clear(); \
      + Py_XINCREF(obj);
      +
      + GET_SYS_OBJECT("meta_path", meta_path);
      + if (PySys_SetObject("meta_path", new_list))
      + {
      + Py_XDECREF(meta_path);
      + Py_DECREF(new_list);
      + return NULL;
      + }
      + Py_DECREF(new_list); /* Now it becomes a reference borrowed from
      + sys.meta_path */
      +
      + #define RESTORE_SYS_OBJECT(objstr, obj) \
      + if (obj) \
      + { \
      + PySys_SetObject(objstr, obj); \
      + Py_DECREF(obj); \
      + }
      +
      + GET_SYS_OBJECT("path_hooks", path_hooks);
      + if (PySys_SetObject("path_hooks", new_list))
      + {
      + RESTORE_SYS_OBJECT("meta_path", meta_path);
      + Py_XDECREF(path_hooks);
      + return NULL;
      + }
      +
      + GET_SYS_OBJECT("path", path);
      + if (PySys_SetObject("path", new_path))
      + {
      + RESTORE_SYS_OBJECT("meta_path", meta_path);
      + RESTORE_SYS_OBJECT("path_hooks", path_hooks);
      + Py_XDECREF(path);
      + return NULL;
      + }
      + Py_DECREF(new_path);
      +
      + r = PyImport_ImportModule(fullname);
      +
      + RESTORE_SYS_OBJECT("meta_path", meta_path);
      + RESTORE_SYS_OBJECT("path_hooks", path_hooks);
      + RESTORE_SYS_OBJECT("path", path);
      +
      + if (PyErr_Occurred())
      + {
      + Py_XDECREF(r);
      + return NULL;
      + }
      +
      + return r;
      + }
      +
      + static PyObject *
      + FinderFindModule(PyObject *self UNUSED, PyObject *args UNUSED)
      + {
      + /*
      + * Don't bother actually finding the module, it is delegated to the "loader"
      + * object (which is basically the same object: vim module).
      + */
      + Py_INCREF(vim_module);
      + return vim_module;
      + }
      +
      + static PyObject *
      + VimPathHook(PyObject *self UNUSED, PyObject *args)
      + {
      + char *path;
      +
      + if (PyArg_ParseTuple(args, "s", &path)
      + && STRCMP(path, vim_special_path) == 0)
      + {
      + Py_INCREF(vim_module);
      + return vim_module;
      + }
      +
      + PyErr_Clear();
      + PyErr_SetNone(PyExc_ImportError);
      + return NULL;
      + }
      +
      static int
      PythonMod_Init(void)
      {
      /* The special value is removed from sys.path in Python_Init(). */
      static char *(argv[2]) = {"/must>not&exist/foo", NULL};

      ***************
      *** 1373,1382 ****
      /* Set sys.argv[] to avoid a crash in warn(). */
      PySys_SetArgv(1, argv);

      ! mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL,
      ! PYTHON_API_VERSION);

      ! return populate_module(mod, PyModule_AddObject, PyObject_GetAttrString);
      }

      /*************************************************************************
      --- 1491,1507 ----
      /* Set sys.argv[] to avoid a crash in warn(). */
      PySys_SetArgv(1, argv);

      ! vim_module = Py_InitModule4("vim", VimMethods, (char *)NULL,
      ! (PyObject *)NULL, PYTHON_API_VERSION);
      !
      ! if (populate_module(vim_module, PyModule_AddObject,
      ! PyObject_GetAttrString))
      ! return -1;
      !
      ! if (init_sys_path())
      ! return -1;

      ! return 0;
      }

      /*************************************************************************
      *** ../vim-7.3.1162/src/if_python3.c 2013-06-10 18:36:20.000000000 +0200
      --- src/if_python3.c 2013-06-10 20:55:44.000000000 +0200
      ***************
      *** 134,139 ****
      --- 134,140 ----
      # define PyErr_SetNone py3_PyErr_SetNone
      # define PyErr_SetString py3_PyErr_SetString
      # define PyErr_SetObject py3_PyErr_SetObject
      + # define PyErr_ExceptionMatches py3_PyErr_ExceptionMatches
      # define PyEval_InitThreads py3_PyEval_InitThreads
      # define PyEval_RestoreThread py3_PyEval_RestoreThread
      # define PyEval_SaveThread py3_PyEval_SaveThread
      ***************
      *** 143,148 ****
      --- 144,150 ----
      # define PyLong_FromLong py3_PyLong_FromLong
      # define PyList_GetItem py3_PyList_GetItem
      # define PyList_Append py3_PyList_Append
      + # define PyList_Insert py3_PyList_Insert
      # define PyList_New py3_PyList_New
      # define PyList_SetItem py3_PyList_SetItem
      # define PyList_Size py3_PyList_Size
      ***************
      *** 177,182 ****
      --- 179,185 ----
      # define PyEval_GetLocals py3_PyEval_GetLocals
      # define PyEval_GetGlobals py3_PyEval_GetGlobals
      # define PySys_SetObject py3_PySys_SetObject
      + # define PySys_GetObject py3_PySys_GetObject
      # define PySys_SetArgv py3_PySys_SetArgv
      # define PyType_Ready py3_PyType_Ready
      #undef Py_BuildValue
      ***************
      *** 268,274 ****
      static PyGILState_STATE (*py3_PyGILState_Ensure)(void);
      static void (*py3_PyGILState_Release)(PyGILState_STATE);
      static int (*py3_PySys_SetObject)(char *, PyObject *);
      ! static PyObject* (*py3_PyList_Append)(PyObject *, PyObject *);
      static Py_ssize_t (*py3_PyList_Size)(PyObject *);
      static int (*py3_PySequence_Check)(PyObject *);
      static Py_ssize_t (*py3_PySequence_Size)(PyObject *);
      --- 271,279 ----
      static PyGILState_STATE (*py3_PyGILState_Ensure)(void);
      static void (*py3_PyGILState_Release)(PyGILState_STATE);
      static int (*py3_PySys_SetObject)(char *, PyObject *);
      ! static PyObject* (*py3_PySys_GetObject)(char *);
      ! static int (*py3_PyList_Append)(PyObject *, PyObject *);
      ! static int (*py3_PyList_Insert)(PyObject *, int, PyObject *);
      static Py_ssize_t (*py3_PyList_Size)(PyObject *);
      static int (*py3_PySequence_Check)(PyObject *);
      static Py_ssize_t (*py3_PySequence_Size)(PyObject *);
      ***************
      *** 284,289 ****
      --- 289,295 ----
      static void (*py3_Py_Finalize)(void);
      static void (*py3_PyErr_SetString)(PyObject *, const char *);
      static void (*py3_PyErr_SetObject)(PyObject *, PyObject *);
      + static int (*py3_PyErr_ExceptionMatches)(PyObject *);
      static int (*py3_PyRun_SimpleString)(char *);
      static PyObject* (*py3_PyRun_String)(char *, int, PyObject *, PyObject *);
      static PyObject* (*py3_PyObject_GetAttrString)(PyObject *, const char *);
      ***************
      *** 393,398 ****
      --- 399,405 ----
      static PyObject *p3imp_PyExc_TypeError;
      static PyObject *p3imp_PyExc_ValueError;
      static PyObject *p3imp_PyExc_RuntimeError;
      + static PyObject *p3imp_PyExc_ImportError;

      # define PyExc_AttributeError p3imp_PyExc_AttributeError
      # define PyExc_IndexError p3imp_PyExc_IndexError
      ***************
      *** 401,406 ****
      --- 408,414 ----
      # define PyExc_TypeError p3imp_PyExc_TypeError
      # define PyExc_ValueError p3imp_PyExc_ValueError
      # define PyExc_RuntimeError p3imp_PyExc_RuntimeError
      + # define PyExc_ImportError p3imp_PyExc_ImportError

      /*
      * Table of name to function pointer of python.
      ***************
      *** 428,434 ****
      --- 436,444 ----
      {"PyGILState_Ensure", (PYTHON_PROC*)&py3_PyGILState_Ensure},
      {"PyGILState_Release", (PYTHON_PROC*)&py3_PyGILState_Release},
      {"PySys_SetObject", (PYTHON_PROC*)&py3_PySys_SetObject},
      + {"PySys_GetObject", (PYTHON_PROC*)&py3_PySys_GetObject},
      {"PyList_Append", (PYTHON_PROC*)&py3_PyList_Append},
      + {"PyList_Insert", (PYTHON_PROC*)&py3_PyList_Insert},
      {"PyList_Size", (PYTHON_PROC*)&py3_PyList_Size},
      {"PySequence_Check", (PYTHON_PROC*)&py3_PySequence_Check},
      {"PySequence_Size", (PYTHON_PROC*)&py3_PySequence_Size},
      ***************
      *** 441,446 ****
      --- 451,457 ----
      {"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize},
      {"PyErr_SetString", (PYTHON_PROC*)&py3_PyErr_SetString},
      {"PyErr_SetObject", (PYTHON_PROC*)&py3_PyErr_SetObject},
      + {"PyErr_ExceptionMatches", (PYTHON_PROC*)&py3_PyErr_ExceptionMatches},
      {"PyRun_SimpleString", (PYTHON_PROC*)&py3_PyRun_SimpleString},
      {"PyRun_String", (PYTHON_PROC*)&py3_PyRun_String},
      {"PyObject_GetAttrString", (PYTHON_PROC*)&py3_PyObject_GetAttrString},
      ***************
      *** 664,669 ****
      --- 675,681 ----
      p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
      p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
      p3imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError");
      + p3imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError");
      Py_XINCREF(p3imp_PyExc_AttributeError);
      Py_XINCREF(p3imp_PyExc_IndexError);
      Py_XINCREF(p3imp_PyExc_KeyError);
      ***************
      *** 671,676 ****
      --- 683,689 ----
      Py_XINCREF(p3imp_PyExc_TypeError);
      Py_XINCREF(p3imp_PyExc_ValueError);
      Py_XINCREF(p3imp_PyExc_RuntimeError);
      + Py_XINCREF(p3imp_PyExc_ImportError);
      Py_XDECREF(exmod);
      }
      #endif /* DYNAMIC_PYTHON3 */
      ***************
      *** 723,730 ****
      --- 736,748 ----
      static int ListSetattro(PyObject *, PyObject *, PyObject *);
      static PyObject *FunctionGetattro(PyObject *, PyObject *);

      + static PyObject *VimPathHook(PyObject *, PyObject *);
      +
      static struct PyModuleDef vimmodule;

      + static PyObject *path_finder;
      + static PyObject *py_find_module = NULL;
      +
      #define PY_CAN_RECURSE

      /*
      ***************
      *** 1585,1596 ****
      #endif

      static PyObject *
      ! Py3Init_vim(void)
      {
      ! PyObject *mod;

      /* The special value is removed from sys.path in Python3_Init(). */
      static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};

      if (init_types())
      return NULL;
      --- 1603,1672 ----
      #endif

      static PyObject *
      ! VimPathHook(PyObject *self UNUSED, PyObject *args)
      {
      ! char *path;
      !
      ! if (PyArg_ParseTuple(args, "s", &path)
      ! && STRCMP(path, vim_special_path) == 0)
      ! {
      ! Py_INCREF(&FinderType);
      ! return (PyObject *) &FinderType;
      ! }
      !
      ! PyErr_Clear();
      ! PyErr_SetNone(PyExc_ImportError);
      ! return NULL;
      ! }
      !
      ! static PyObject *
      ! FinderFindModule(PyObject *cls UNUSED, PyObject *fullname)
      ! {
      ! PyObject *new_path;
      ! PyObject *r;
      !
      ! if (!(new_path = Vim_GetPaths(NULL)))
      ! return NULL;
      !
      ! /* call find_module of the super() class */
      ! r = PyObject_CallFunctionObjArgs(py_find_module, fullname, new_path, NULL);
      !
      ! Py_DECREF(new_path);
      !
      ! return r;
      ! }

      + static struct PyMethodDef FinderMethods[] = {
      + {"find_module", FinderFindModule, METH_CLASS|METH_O, ""},
      + {NULL, NULL, 0, NULL}
      + };
      +
      + static PyObject *
      + Py3Init_vim(void)
      + {
      /* The special value is removed from sys.path in Python3_Init(). */
      static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
      + PyObject *importlib_machinery;
      +
      + if (!(importlib_machinery = PyImport_ImportModule("importlib.machinery")))
      + return NULL;
      +
      + if (!(path_finder = PyObject_GetAttrString(importlib_machinery,
      + "PathFinder")))
      + {
      + Py_DECREF(importlib_machinery);
      + return NULL;
      + }
      +
      + Py_DECREF(importlib_machinery);
      +
      + vim_memset(&FinderType, 0, sizeof(FinderObject));
      + FinderType.tp_name = "vim.Finder";
      + FinderType.tp_basicsize = sizeof(FinderObject);
      + FinderType.tp_base = (PyTypeObject *) path_finder;
      + FinderType.tp_flags = Py_TPFLAGS_DEFAULT;
      + FinderType.tp_doc = "Vim finder class, for use with path hook";
      + FinderType.tp_methods = FinderMethods;

      if (init_types())
      return NULL;
      ***************
      *** 1598,1611 ****
      /* Set sys.argv[] to avoid a crash in warn(). */
      PySys_SetArgv(1, argv);

      ! mod = PyModule_Create(&vimmodule);
      ! if (mod == NULL)
      return NULL;

      ! if (populate_module(mod, PyModule_AddObject, PyObject_GetAttrString))
      return NULL;

      ! return mod;
      }

      /*************************************************************************
      --- 1674,1689 ----
      /* Set sys.argv[] to avoid a crash in warn(). */
      PySys_SetArgv(1, argv);

      ! if ((vim_module = PyModule_Create(&vimmodule)) == NULL)
      ! return NULL;
      !
      ! if (populate_module(vim_module, PyModule_AddObject, PyObject_GetAttrString))
      return NULL;

      ! if (init_sys_path())
      return NULL;

      ! return vim_module;
      }

      /*************************************************************************
      *** ../vim-7.3.1162/src/testdir/test86.in 2013-06-02 18:54:16.000000000 +0200
      --- src/testdir/test86.in 2013-06-10 21:05:44.000000000 +0200
      ***************
      *** 1069,1074 ****
      --- 1069,1082 ----
      ee('vim.current.xxx = True')
      EOF
      :"
      + :" Test import TODO: BROKEN
      + :"py << EOF
      + :"vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\')
      + :"from module import dir as d
      + :"from modulex import ddir
      + :"cb.append(d + ',' + ddir)
      + :"EOF
      + :"
      :" Test exceptions
      :fun Exe(e)
      : execute a:e
      *** ../vim-7.3.1162/src/testdir/test87.in 2013-06-02 18:54:16.000000000 +0200
      --- src/testdir/test87.in 2013-06-10 21:06:37.000000000 +0200
      ***************
      *** 1036,1041 ****
      --- 1036,1049 ----
      ee('vim.current.xxx = True')
      EOF
      :"
      + :" Test import TODO: BROKEN
      + :"py3 << EOF
      + :"vim.options['rtp'] = os.getcwd().replace(',', '\\,').replace('\\', '\\\\')
      + :"from module import dir as d
      + :"from modulex import ddir
      + :"cb.append(d + ',' + ddir)
      + :"EOF
      + :"
      :" Test exceptions
      :fun Exe(e)
      : execute a:e
      *** ../vim-7.3.1162/src/auto/configure 2013-06-02 19:14:11.000000000 +0200
      --- src/auto/configure 2013-06-10 21:22:52.000000000 +0200
      ***************
      *** 5289,5298 ****
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vi_cv_var_python_version" >&5
      $as_echo "$vi_cv_var_python_version" >&6; }

      ! { $as_echo "$as_me:${as_lineno-$LINENO}: checking Python is 2.2 or better" >&5
      ! $as_echo_n "checking Python is 2.2 or better... " >&6; }
      if ${vi_cv_path_python} -c \
      ! "import sys; sys.exit(${vi_cv_var_python_version} < 2.2)"
      then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yep" >&5
      $as_echo "yep" >&6; }
      --- 5289,5298 ----
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vi_cv_var_python_version" >&5
      $as_echo "$vi_cv_var_python_version" >&6; }

      ! { $as_echo "$as_me:${as_lineno-$LINENO}: checking Python is 2.3 or better" >&5
      ! $as_echo_n "checking Python is 2.3 or better... " >&6; }
      if ${vi_cv_path_python} -c \
      ! "import sys; sys.exit(${vi_cv_var_python_version} < 2.3)"
      then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yep" >&5
      $as_echo "yep" >&6; }
      *** ../vim-7.3.1162/src/version.c 2013-06-10 20:47:33.000000000 +0200
      --- src/version.c 2013-06-10 20:53:23.000000000 +0200
      ***************
      *** 730,731 ****
      --- 730,733 ----
      { /* Add new patch number below this line */
      + /**/
      + 1163,
      /**/

      --
      The coffee just wasn't strong enough to defend itself -- Tom Waits

      /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
      /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
      \\\ an exciting new programming language -- http://www.Zimbu.org ///
      \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

      --
      --
      You received this message from the "vim_dev" maillist.
      Do not top-post! Type your reply below the text you are replying to.
      For more information, visit http://www.vim.org/maillist.php

      ---
      You received this message because you are subscribed to the Google Groups "vim_dev" group.
      To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
      For more options, visit https://groups.google.com/groups/opt_out.
    • Davido
      ... Hello, It seems to cause problems with some python based plugins ; I guess it comes from this patch, since a yesterday vim build worked perfectly : Error
      Message 2 of 13 , Jun 11, 2013
      • 0 Attachment
        Bram Moolenaar <Bram@...> wrote, on lun 10 jun 21:27 :

        >
        > Patch 7.3.1163
        > Problem: Not easy to load Python modules.
        > Solution: Search "python2", "python3" and "pythonx" directories in
        > 'runtimepath' for Python modules. (ZyX)
        > Files: runtime/doc/if_pyth.txt, src/configure.in, src/ex_cmds2.c,
        > src/if_py_both.h, src/if_python.c, src/if_python3.c,
        > src/testdir/test86.in, src/testdir/test87.in, src/auto/configure

        Hello,

        It seems to cause problems with some python based plugins ; I guess
        it comes from this patch, since a yesterday vim build worked perfectly :

        Error treating [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips.vim :
        ligne 251 :
        Traceback (most recent call last):
        File "<string>", line 1, in <module>
        ImportError: No module named UltiSnips
        ligne 252 :
        Traceback (most recent call last):
        File "<string>", line 1, in <module>
        NameError: name 'UltiSnips_Manager' is not defined
        ligne 253 :
        Traceback (most recent call last):
        File "<string>", line 1, in <module>
        NameError: name 'UltiSnips_Manager' is not defined
        ligne 254 :
        Traceback (most recent call last):
        File "<string>", line 1, in <module>
        NameError: name 'UltiSnips_Manager' is not defined

        I've tried to symlink the python dir to pythonx or plugin/pythonx (or
        2,3), but it doesn't work.

        Similar issue with Ozzy.

        Is it intended behaviour, and the plugins will adjust in time ?

        --
        Regards,

        Davido

        --
        --
        You received this message from the "vim_dev" maillist.
        Do not top-post! Type your reply below the text you are replying to.
        For more information, visit http://www.vim.org/maillist.php

        ---
        You received this message because you are subscribed to the Google Groups "vim_dev" group.
        To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
        For more options, visit https://groups.google.com/groups/opt_out.
      • Bram Moolenaar
        ... The change must be backwards compatible. Where is the UltiSnips python file located? -- I wish there was a knob on the TV to turn up the intelligence.
        Message 3 of 13 , Jun 11, 2013
        • 0 Attachment
          Davido wrote:

          > Bram Moolenaar <Bram@...> wrote, on lun 10 jun 21:27 :
          >
          > >
          > > Patch 7.3.1163
          > > Problem: Not easy to load Python modules.
          > > Solution: Search "python2", "python3" and "pythonx" directories in
          > > 'runtimepath' for Python modules. (ZyX)
          > > Files: runtime/doc/if_pyth.txt, src/configure.in, src/ex_cmds2.c,
          > > src/if_py_both.h, src/if_python.c, src/if_python3.c,
          > > src/testdir/test86.in, src/testdir/test87.in, src/auto/configure
          >
          > Hello,
          >
          > It seems to cause problems with some python based plugins ; I guess
          > it comes from this patch, since a yesterday vim build worked perfectly :
          >
          > Error treating [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips.vim :
          > ligne 251 :
          > Traceback (most recent call last):
          > File "<string>", line 1, in <module>
          > ImportError: No module named UltiSnips
          > ligne 252 :
          > Traceback (most recent call last):
          > File "<string>", line 1, in <module>
          > NameError: name 'UltiSnips_Manager' is not defined
          > ligne 253 :
          > Traceback (most recent call last):
          > File "<string>", line 1, in <module>
          > NameError: name 'UltiSnips_Manager' is not defined
          > ligne 254 :
          > Traceback (most recent call last):
          > File "<string>", line 1, in <module>
          > NameError: name 'UltiSnips_Manager' is not defined
          >
          > I've tried to symlink the python dir to pythonx or plugin/pythonx (or
          > 2,3), but it doesn't work.
          >
          > Similar issue with Ozzy.
          >
          > Is it intended behaviour, and the plugins will adjust in time ?

          The change must be backwards compatible. Where is the UltiSnips python
          file located?

          --
          I wish there was a knob on the TV to turn up the intelligence.
          There's a knob called "brightness", but it doesn't seem to work.

          /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
          /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
          \\\ an exciting new programming language -- http://www.Zimbu.org ///
          \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

          --
          --
          You received this message from the "vim_dev" maillist.
          Do not top-post! Type your reply below the text you are replying to.
          For more information, visit http://www.vim.org/maillist.php

          ---
          You received this message because you are subscribed to the Google Groups "vim_dev" group.
          To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
          For more options, visit https://groups.google.com/groups/opt_out.
        • Davido
          ... All the python files seem located in plugin/UltiSnips, but you have some subdirs inside it. Here is the tree :
          Message 4 of 13 , Jun 11, 2013
          • 0 Attachment
            Bram Moolenaar <Bram@...> wrote, on mar 11 jun 11:46 :

            >
            > Davido wrote:
            >
            > > Bram Moolenaar <Bram@...> wrote, on lun 10 jun 21:27 :
            > >
            > > >
            > > > Patch 7.3.1163
            > > > Problem: Not easy to load Python modules.
            > > > Solution: Search "python2", "python3" and "pythonx" directories in
            > > > 'runtimepath' for Python modules. (ZyX)
            > > > Files: runtime/doc/if_pyth.txt, src/configure.in, src/ex_cmds2.c,
            > > > src/if_py_both.h, src/if_python.c, src/if_python3.c,
            > > > src/testdir/test86.in, src/testdir/test87.in, src/auto/configure
            > >
            > > Hello,
            > >
            > > It seems to cause problems with some python based plugins ; I guess
            > > it comes from this patch, since a yesterday vim build worked perfectly :
            > >
            > > Error treating [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips.vim :
            > > ligne 251 :
            > > Traceback (most recent call last):
            > > File "<string>", line 1, in <module>
            > > ImportError: No module named UltiSnips
            > > ligne 252 :
            > > Traceback (most recent call last):
            > > File "<string>", line 1, in <module>
            > > NameError: name 'UltiSnips_Manager' is not defined
            > > ligne 253 :
            > > Traceback (most recent call last):
            > > File "<string>", line 1, in <module>
            > > NameError: name 'UltiSnips_Manager' is not defined
            > > ligne 254 :
            > > Traceback (most recent call last):
            > > File "<string>", line 1, in <module>
            > > NameError: name 'UltiSnips_Manager' is not defined
            > >
            > > I've tried to symlink the python dir to pythonx or plugin/pythonx (or
            > > 2,3), but it doesn't work.
            > >
            > > Similar issue with Ozzy.
            > >
            > > Is it intended behaviour, and the plugins will adjust in time ?
            >
            > The change must be backwards compatible. Where is the UltiSnips python
            > file located?

            All the python files seem located in plugin/UltiSnips, but you
            have some subdirs inside it. Here is the tree :

            [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips

            __init__.py
            __init__.pyc
            _diff.py
            _diff.pyc
            _vim.py
            _vim.pyc
            compatibility.py
            compatibility.pyc
            compatibility_py2.py
            compatibility_py2.pyc
            compatibility_py3.py
            debug.py
            geometry.py
            geometry.pyc
            util.py
            util.pyc
            +--tests/
            test_diff.py
            test_geometry.py
            +--text_objects/
            __init__.py
            __init__.pyc
            _base.py
            _base.pyc
            _escaped_char.py
            _escaped_char.pyc
            _lexer.py
            _lexer.pyc
            _mirror.py
            _mirror.pyc
            _parser.py
            _parser.pyc
            _python_code.py
            _python_code.pyc
            _shell_code.py
            _shell_code.pyc
            _snippet_instance.py
            _snippet_instance.pyc
            _tabstop.py
            _tabstop.pyc
            _transformation.py
            _transformation.pyc
            _viml_code.py
            _viml_code.pyc
            _visual.py
            _visual.pyc

            > --
            > I wish there was a knob on the TV to turn up the intelligence.
            > There's a knob called "brightness", but it doesn't seem to work.
            >
            > /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
            > /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
            > \\\ an exciting new programming language -- http://www.Zimbu.org ///
            > \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
            >
            > --
            > --
            > You received this message from the "vim_dev" maillist.
            > Do not top-post! Type your reply below the text you are replying to.
            > For more information, visit http://www.vim.org/maillist.php
            >
            > ---
            > You received this message because you are subscribed to the Google Groups "vim_dev" group.
            > To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
            > For more options, visit https://groups.google.com/groups/opt_out.
            >

            --
            Regards,

            Davido

            --
            --
            You received this message from the "vim_dev" maillist.
            Do not top-post! Type your reply below the text you are replying to.
            For more information, visit http://www.vim.org/maillist.php

            ---
            You received this message because you are subscribed to the Google Groups "vim_dev" group.
            To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
            For more options, visit https://groups.google.com/groups/opt_out.
          • Bohr Shaw
            I just ask this question at stackoverflow.com. I was so confused.
            Message 5 of 13 , Jun 11, 2013
            • 0 Attachment
              I just ask this question at stackoverflow.com. I was so confused.
              http://stackoverflow.com/questions/17041782/vim-startup-with-importerror-no-module-named-ultisnips

              On Tuesday, June 11, 2013 3:41:00 PM UTC+8, Davido wrote:
              > Bram Moolenaar <Bram@...> wrote, on lun 10 jun 21:27 :
              >
              >
              >
              > >
              >
              > > Patch 7.3.1163
              >
              > > Problem: Not easy to load Python modules.
              >
              > > Solution: Search "python2", "python3" and "pythonx" directories in
              >
              > > 'runtimepath' for Python modules. (ZyX)
              >
              > > Files: runtime/doc/if_pyth.txt, src/configure.in, src/ex_cmds2.c,
              >
              > > src/if_py_both.h, src/if_python.c, src/if_python3.c,
              >
              > > src/testdir/test86.in, src/testdir/test87.in, src/auto/configure
              >
              >
              >
              > Hello,
              >
              >
              >
              > It seems to cause problems with some python based plugins ; I guess
              >
              > it comes from this patch, since a yesterday vim build worked perfectly :
              >
              >
              >
              > Error treating [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips.vim :
              >
              > ligne 251 :
              >
              > Traceback (most recent call last):
              >
              > File "<string>", line 1, in <module>
              >
              > ImportError: No module named UltiSnips
              >
              > ligne 252 :
              >
              > Traceback (most recent call last):
              >
              > File "<string>", line 1, in <module>
              >
              > NameError: name 'UltiSnips_Manager' is not defined
              >
              > ligne 253 :
              >
              > Traceback (most recent call last):
              >
              > File "<string>", line 1, in <module>
              >
              > NameError: name 'UltiSnips_Manager' is not defined
              >
              > ligne 254 :
              >
              > Traceback (most recent call last):
              >
              > File "<string>", line 1, in <module>
              >
              > NameError: name 'UltiSnips_Manager' is not defined
              >
              >
              >
              > I've tried to symlink the python dir to pythonx or plugin/pythonx (or
              >
              > 2,3), but it doesn't work.
              >
              >
              >
              > Similar issue with Ozzy.
              >
              >
              >
              > Is it intended behaviour, and the plugins will adjust in time ?
              >
              >
              >
              > --
              >
              > Regards,
              >
              >
              >
              > Davido

              --
              --
              You received this message from the "vim_dev" maillist.
              Do not top-post! Type your reply below the text you are replying to.
              For more information, visit http://www.vim.org/maillist.php

              ---
              You received this message because you are subscribed to the Google Groups "vim_dev" group.
              To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
              For more options, visit https://groups.google.com/groups/opt_out.
            • Bram Moolenaar
              ... [...] Hmm, that s a lot of files. So how did it find these (or at least the one included from Vim script) before? Does it specify a path in the import ?
              Message 6 of 13 , Jun 11, 2013
              • 0 Attachment
                Davido wrote:

                > Bram Moolenaar <Bram@...> wrote, on mar 11 jun 11:46 :
                >
                > >
                > > Davido wrote:
                > >
                > > > Bram Moolenaar <Bram@...> wrote, on lun 10 jun 21:27 :
                > > >
                > > > >
                > > > > Patch 7.3.1163
                > > > > Problem: Not easy to load Python modules.
                > > > > Solution: Search "python2", "python3" and "pythonx" directories in
                > > > > 'runtimepath' for Python modules. (ZyX)
                > > > > Files: runtime/doc/if_pyth.txt, src/configure.in, src/ex_cmds2.c,
                > > > > src/if_py_both.h, src/if_python.c, src/if_python3.c,
                > > > > src/testdir/test86.in, src/testdir/test87.in, src/auto/configure
                > > >
                > > > Hello,
                > > >
                > > > It seems to cause problems with some python based plugins ; I guess
                > > > it comes from this patch, since a yesterday vim build worked perfectly :
                > > >
                > > > Error treating [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips.vim :
                > > > ligne 251 :
                > > > Traceback (most recent call last):
                > > > File "<string>", line 1, in <module>
                > > > ImportError: No module named UltiSnips
                > > > ligne 252 :
                > > > Traceback (most recent call last):
                > > > File "<string>", line 1, in <module>
                > > > NameError: name 'UltiSnips_Manager' is not defined
                > > > ligne 253 :
                > > > Traceback (most recent call last):
                > > > File "<string>", line 1, in <module>
                > > > NameError: name 'UltiSnips_Manager' is not defined
                > > > ligne 254 :
                > > > Traceback (most recent call last):
                > > > File "<string>", line 1, in <module>
                > > > NameError: name 'UltiSnips_Manager' is not defined
                > > >
                > > > I've tried to symlink the python dir to pythonx or plugin/pythonx (or
                > > > 2,3), but it doesn't work.
                > > >
                > > > Similar issue with Ozzy.
                > > >
                > > > Is it intended behaviour, and the plugins will adjust in time ?
                > >
                > > The change must be backwards compatible. Where is the UltiSnips python
                > > file located?
                >
                > All the python files seem located in plugin/UltiSnips, but you
                > have some subdirs inside it. Here is the tree :
                >
                > [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips
                >
                > __init__.py
                > __init__.pyc
                > _diff.py
                > _diff.pyc
                > _vim.py
                > _vim.pyc
                > compatibility.py
                > compatibility.pyc
                > compatibility_py2.py
                > compatibility_py2.pyc
                > compatibility_py3.py
                > debug.py

                [...]

                Hmm, that's a lot of files. So how did it find these (or at least the
                one included from Vim script) before? Does it specify a path in the
                "import"?


                --
                hundred-and-one symptoms of being an internet addict:
                143. You dream in pallettes of 216 websafe colors.

                /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
                /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
                \\\ an exciting new programming language -- http://www.Zimbu.org ///
                \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

                --
                --
                You received this message from the "vim_dev" maillist.
                Do not top-post! Type your reply below the text you are replying to.
                For more information, visit http://www.vim.org/maillist.php

                ---
                You received this message because you are subscribed to the Google Groups "vim_dev" group.
                To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                For more options, visit https://groups.google.com/groups/opt_out.
              • Davido
                ... In the main UltiSnips.vim file, you have : exec g:_uspy import vim, os, sys exec g:_uspy new_path = vim.eval( expand( :h ) ) exec g:_uspy
                Message 7 of 13 , Jun 11, 2013
                • 0 Attachment
                  > > All the python files seem located in plugin/UltiSnips, but you
                  > > have some subdirs inside it. Here is the tree :
                  > >
                  > > [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips
                  > >
                  > > __init__.py
                  > > __init__.pyc
                  > > _diff.py
                  > > _diff.pyc
                  > > _vim.py
                  > > _vim.pyc
                  > > compatibility.py
                  > > compatibility.pyc
                  > > compatibility_py2.py
                  > > compatibility_py2.pyc
                  > > compatibility_py3.py
                  > > debug.py
                  >
                  > [...]
                  >
                  > Hmm, that's a lot of files. So how did it find these (or at least the
                  > one included from Vim script) before? Does it specify a path in the
                  > "import"?

                  In the main UltiSnips.vim file, you have :

                  exec g:_uspy "import vim, os, sys"
                  exec g:_uspy "new_path = vim.eval('expand(\"<sfile>:h\")')"
                  exec g:_uspy "vim.command(\"let g:UltiSnipsPythonPath = '%s'\" % new_path)"
                  exec g:_uspy "sys.path.append(new_path)"
                  exec g:_uspy "from UltiSnips import UltiSnips_Manager"

                  where g:_uspy is ":py" or ":py3", automatically set. In the python dir,
                  __init__.py contains :

                  from UltiSnips.compatibility import as_unicode, byte2col
                  from UltiSnips._diff import diff, guess_edit
                  from UltiSnips.geometry import Position
                  from UltiSnips.text_objects import SnippetInstance
                  from UltiSnips.util import IndentUtil
                  import UltiSnips._vim as _vim

                  Note that the value of g:UltiSnipsPythonPath is correct :

                  [...]/vim-addon-manager/UltiSnips/plugin

                  as in the previous vim version (1156)

                  I also checked the value of sys.path, once vim started. It contains the
                  value of g:UltiSnipsPythonPath. In fact, both lists (from versions 1156
                  and 1163) seem identical, except for a strange :

                  _vim_path_

                  new element.

                  --
                  --
                  You received this message from the "vim_dev" maillist.
                  Do not top-post! Type your reply below the text you are replying to.
                  For more information, visit http://www.vim.org/maillist.php

                  ---
                  You received this message because you are subscribed to the Google Groups "vim_dev" group.
                  To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                  For more options, visit https://groups.google.com/groups/opt_out.
                • Bram Moolenaar
                  ... Does it work OK if you remove _vim_path_ ? -- hundred-and-one symptoms of being an internet addict: 154. You fondle your mouse. /// Bram Moolenaar --
                  Message 8 of 13 , Jun 11, 2013
                  • 0 Attachment
                    Davido wrote:

                    > > > All the python files seem located in plugin/UltiSnips, but you
                    > > > have some subdirs inside it. Here is the tree :
                    > > >
                    > > > [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips
                    > > >
                    > > > __init__.py
                    > > > __init__.pyc
                    > > > _diff.py
                    > > > _diff.pyc
                    > > > _vim.py
                    > > > _vim.pyc
                    > > > compatibility.py
                    > > > compatibility.pyc
                    > > > compatibility_py2.py
                    > > > compatibility_py2.pyc
                    > > > compatibility_py3.py
                    > > > debug.py
                    > >
                    > > [...]
                    > >
                    > > Hmm, that's a lot of files. So how did it find these (or at least the
                    > > one included from Vim script) before? Does it specify a path in the
                    > > "import"?
                    >
                    > In the main UltiSnips.vim file, you have :
                    >
                    > exec g:_uspy "import vim, os, sys"
                    > exec g:_uspy "new_path = vim.eval('expand(\"<sfile>:h\")')"
                    > exec g:_uspy "vim.command(\"let g:UltiSnipsPythonPath = '%s'\" % new_path)"
                    > exec g:_uspy "sys.path.append(new_path)"
                    > exec g:_uspy "from UltiSnips import UltiSnips_Manager"
                    >
                    > where g:_uspy is ":py" or ":py3", automatically set. In the python dir,
                    > __init__.py contains :
                    >
                    > from UltiSnips.compatibility import as_unicode, byte2col
                    > from UltiSnips._diff import diff, guess_edit
                    > from UltiSnips.geometry import Position
                    > from UltiSnips.text_objects import SnippetInstance
                    > from UltiSnips.util import IndentUtil
                    > import UltiSnips._vim as _vim
                    >
                    > Note that the value of g:UltiSnipsPythonPath is correct :
                    >
                    > [...]/vim-addon-manager/UltiSnips/plugin
                    >
                    > as in the previous vim version (1156)
                    >
                    > I also checked the value of sys.path, once vim started. It contains the
                    > value of g:UltiSnipsPythonPath. In fact, both lists (from versions 1156
                    > and 1163) seem identical, except for a strange :
                    >
                    > _vim_path_
                    >
                    > new element.

                    Does it work OK if you remove _vim_path_ ?

                    --
                    hundred-and-one symptoms of being an internet addict:
                    154. You fondle your mouse.

                    /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
                    /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
                    \\\ an exciting new programming language -- http://www.Zimbu.org ///
                    \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

                    --
                    --
                    You received this message from the "vim_dev" maillist.
                    Do not top-post! Type your reply below the text you are replying to.
                    For more information, visit http://www.vim.org/maillist.php

                    ---
                    You received this message because you are subscribed to the Google Groups "vim_dev" group.
                    To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                    For more options, visit https://groups.google.com/groups/opt_out.
                  • 陈世用
                    same error appears in this plugin https://github.com/Valloric/MatchTagAlways 2013/6/12 Bram Moolenaar ... -- -- You received this message
                    Message 9 of 13 , Jun 11, 2013
                    • 0 Attachment
                      same error appears in this plugin


                      2013/6/12 Bram Moolenaar <Bram@...>

                      Davido wrote:

                      > > > All the python files seem located in plugin/UltiSnips, but you
                      > > > have some subdirs inside it. Here is the tree :
                      > > >
                      > > > [...]/vim-addon-manager/UltiSnips/plugin/UltiSnips
                      > > >
                      > > > __init__.py
                      > > > __init__.pyc
                      > > > _diff.py
                      > > > _diff.pyc
                      > > > _vim.py
                      > > > _vim.pyc
                      > > > compatibility.py
                      > > > compatibility.pyc
                      > > > compatibility_py2.py
                      > > > compatibility_py2.pyc
                      > > > compatibility_py3.py
                      > > > debug.py
                      > >
                      > > [...]
                      > >
                      > > Hmm, that's a lot of files.  So how did it find these (or at least the
                      > > one included from Vim script) before?  Does it specify a path in the
                      > > "import"?
                      >
                      > In the main UltiSnips.vim file, you have :
                      >
                      >       exec g:_uspy "import vim, os, sys"
                      >       exec g:_uspy "new_path = vim.eval('expand(\"<sfile>:h\")')"
                      >       exec g:_uspy "vim.command(\"let g:UltiSnipsPythonPath = '%s'\" % new_path)"
                      >       exec g:_uspy "sys.path.append(new_path)"
                      >       exec g:_uspy "from UltiSnips import UltiSnips_Manager"
                      >
                      > where g:_uspy is ":py" or ":py3", automatically set. In the python dir,
                      > __init__.py contains :
                      >
                      >       from UltiSnips.compatibility import as_unicode, byte2col
                      >       from UltiSnips._diff import diff, guess_edit
                      >       from UltiSnips.geometry import Position
                      >       from UltiSnips.text_objects import SnippetInstance
                      >       from UltiSnips.util import IndentUtil
                      >       import UltiSnips._vim as _vim
                      >
                      > Note that the value of g:UltiSnipsPythonPath is correct :
                      >
                      >       [...]/vim-addon-manager/UltiSnips/plugin
                      >
                      > as in the previous vim version (1156)
                      >
                      > I also checked the value of sys.path, once vim started. It contains the
                      > value of g:UltiSnipsPythonPath. In fact, both lists (from versions 1156
                      > and 1163) seem identical, except for a strange :
                      >
                      >       _vim_path_
                      >
                      > new element.

                      Does it work OK if you remove _vim_path_ ?

                      --
                      hundred-and-one symptoms of being an internet addict:
                      154. You fondle your mouse.

                       /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net   \\\
                      ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
                      \\\  an exciting new programming language -- http://www.Zimbu.org        ///
                       \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

                      --
                      --
                      You received this message from the "vim_dev" maillist.
                      Do not top-post! Type your reply below the text you are replying to.
                      For more information, visit http://www.vim.org/maillist.php

                      ---
                      You received this message because you are subscribed to the Google Groups "vim_dev" group.
                      To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                      For more options, visit https://groups.google.com/groups/opt_out.



                      --
                      --
                      You received this message from the "vim_dev" maillist.
                      Do not top-post! Type your reply below the text you are replying to.
                      For more information, visit http://www.vim.org/maillist.php
                       
                      ---
                      You received this message because you are subscribed to the Google Groups "vim_dev" group.
                      To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                      For more options, visit https://groups.google.com/groups/opt_out.
                       
                       
                    • Davido
                      ... If forgot to mention that the UltiSnips initialization occurs (and fails) at vim startup, so I don t know how to check this. However, I ve tried to source
                      Message 10 of 13 , Jun 11, 2013
                      • 0 Attachment
                        Bram Moolenaar <Bram@...> wrote, on mar 11 jun 21:12 :

                        > >
                        > > In the main UltiSnips.vim file, you have :
                        > >
                        > > exec g:_uspy "import vim, os, sys"
                        > > exec g:_uspy "new_path = vim.eval('expand(\"<sfile>:h\")')"
                        > > exec g:_uspy "vim.command(\"let g:UltiSnipsPythonPath = '%s'\" % new_path)"
                        > > exec g:_uspy "sys.path.append(new_path)"
                        > > exec g:_uspy "from UltiSnips import UltiSnips_Manager"
                        > >
                        > > where g:_uspy is ":py" or ":py3", automatically set. In the python dir,
                        > > __init__.py contains :
                        > >
                        > > from UltiSnips.compatibility import as_unicode, byte2col
                        > > from UltiSnips._diff import diff, guess_edit
                        > > from UltiSnips.geometry import Position
                        > > from UltiSnips.text_objects import SnippetInstance
                        > > from UltiSnips.util import IndentUtil
                        > > import UltiSnips._vim as _vim
                        > >
                        > > Note that the value of g:UltiSnipsPythonPath is correct :
                        > >
                        > > [...]/vim-addon-manager/UltiSnips/plugin
                        > >
                        > > as in the previous vim version (1156)
                        > >
                        > > I also checked the value of sys.path, once vim started. It contains the
                        > > value of g:UltiSnipsPythonPath. In fact, both lists (from versions 1156
                        > > and 1163) seem identical, except for a strange :
                        > >
                        > > _vim_path_
                        > >
                        > > new element.
                        >
                        > Does it work OK if you remove _vim_path_ ?

                        If forgot to mention that the UltiSnips initialization occurs (and fails)
                        at vim startup, so I don't know how to check this. However, I've tried
                        to source UltiSnips.vim from inside vim :

                        let did_UltiSnips_vim=0
                        so ./plugin/UltiSnips.vim

                        the script is silent, with or without '_vim_path_', but other errors,
                        caused by UltiSnips_CursorMoved, remain.

                        I've also discovered that all errors disappear if vim is launched from
                        this directory :

                        [...]/vim-addon-manager/UltiSnips/plugin

                        Then, the according path is present *twice* in sys.path : the first time,
                        in the middle of the list, is from the $PWD I launched vim, and the second
                        time, at the end of the list, is probably from the plugin initialization.

                        --
                        --
                        You received this message from the "vim_dev" maillist.
                        Do not top-post! Type your reply below the text you are replying to.
                        For more information, visit http://www.vim.org/maillist.php

                        ---
                        You received this message because you are subscribed to the Google Groups "vim_dev" group.
                        To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                        For more options, visit https://groups.google.com/groups/opt_out.
                      • Davido
                        I m glad to inform you that UltiSnips works fine again with patchlevel 1174 -- Regards, Davido -- -- You received this message from the vim_dev maillist. Do
                        Message 11 of 13 , Jun 12, 2013
                        • 0 Attachment
                          I'm glad to inform you that UltiSnips works fine again with patchlevel 1174

                          --
                          Regards,

                          Davido

                          --
                          --
                          You received this message from the "vim_dev" maillist.
                          Do not top-post! Type your reply below the text you are replying to.
                          For more information, visit http://www.vim.org/maillist.php

                          ---
                          You received this message because you are subscribed to the Google Groups "vim_dev" group.
                          To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                          For more options, visit https://groups.google.com/groups/opt_out.
                        • Bram Moolenaar
                          ... Thanks for checking. With this kind of change it s hard to tell wether a solution doesn t break something else. It was weird that the text output of a
                          Message 12 of 13 , Jun 12, 2013
                          • 0 Attachment
                            Davido wrote:

                            > I'm glad to inform you that UltiSnips works fine again with patchlevel 1174

                            Thanks for checking. With this kind of change it's hard to tell wether
                            a solution doesn't break something else.

                            It was weird that the text output of a function reference is passed as
                            an argument to another function... Anyway, I hope this solution makes
                            it work for everyone.

                            --
                            An error has occurred. Hit any user to continue.

                            /// Bram Moolenaar -- Bram@... -- http://www.Moolenaar.net \\\
                            /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
                            \\\ an exciting new programming language -- http://www.Zimbu.org ///
                            \\\ help me help AIDS victims -- http://ICCF-Holland.org ///

                            --
                            --
                            You received this message from the "vim_dev" maillist.
                            Do not top-post! Type your reply below the text you are replying to.
                            For more information, visit http://www.vim.org/maillist.php

                            ---
                            You received this message because you are subscribed to the Google Groups "vim_dev" group.
                            To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                            For more options, visit https://groups.google.com/groups/opt_out.
                          • Benyu Zhang
                            It seems doesn t work for vim-assist yet with patchlevel 1203. I opened an issue in https://github.com/xieyu/vim-assist/issues/1 which includes some more
                            Message 13 of 13 , Jun 16, 2013
                            • 0 Attachment
                              It seems doesn't work for vim-assist yet with patchlevel 1203. I opened an issue in https://github.com/xieyu/vim-assist/issues/1 which includes some more information.

                              On Wednesday, June 12, 2013 10:03:44 PM UTC+8, Davido wrote:
                              > I'm glad to inform you that UltiSnips works fine again with patchlevel 1174
                              >
                              >
                              >
                              > --
                              >
                              > Regards,
                              >
                              >
                              >
                              > Davido

                              --
                              --
                              You received this message from the "vim_dev" maillist.
                              Do not top-post! Type your reply below the text you are replying to.
                              For more information, visit http://www.vim.org/maillist.php

                              ---
                              You received this message because you are subscribed to the Google Groups "vim_dev" group.
                              To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
                              For more options, visit https://groups.google.com/groups/opt_out.
                            Your message has been successfully submitted and would be delivered to recipients shortly.