]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.966 v7.3.966
authorBram Moolenaar <Bram@vim.org>
Fri, 17 May 2013 14:40:06 +0000 (16:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 17 May 2013 14:40:06 +0000 (16:40 +0200)
Problem:    There is ":py3do" but no ":pydo".
Solution:   Add the ":pydo" command. (Lilydjwg)

runtime/doc/if_pyth.txt
src/ex_cmds.h
src/ex_docmd.c
src/if_py_both.h
src/if_python.c
src/if_python3.c
src/proto/if_python.pro
src/version.c

index 051dfacaf33a99b39e000008ae9d1df4b581003a..a2c949e34bc830850a7079ca8a6ceb02421dfb03 100644 (file)
@@ -57,6 +57,22 @@ Example: >
 Note: Python is very sensitive to the indenting.  Make sure the "class" line
 and "EOF" do not have any indent.
 
+                                                       *:pydo*
+:[range]pydo {body}    Execute Python function "def _vim_pydo(line, linenr):
+                       {body}" for each line in the [range], with the
+                       function arguments being set to the text of each line
+                       in turn, without a trailing <EOL>, and the current
+                       line number. The function should return a string or
+                       None. If a string is returned, it becomes the text of
+                       the line in the current turn. The default for [range]
+                       is the whole file: "1,$".
+                       {not in Vi}
+
+Examples:
+>
+       :pydo return "%s\t%d" % (line[::-1], len(line))
+       :pydo if line: return "%4d: %s" % (linenr, line)
+<
                                                        *:pyfile* *:pyf*
 :[range]pyf[ile] {file}
                        Execute the Python script in {file}.  The whole
@@ -485,27 +501,14 @@ sure edit "gvim.exe" and search for "python\d*.dll\c".
 8. Python 3                                            *python3*
 
                                                        *:py3* *:python3*
-The |:py3| and |:python3| commands work similar to |:python|.  A simple check
+The `:py3` and `:python3` commands work similar to `:python`.  A simple check
 if the `:py3` command is working: >
        :py3 print("Hello")
 <                                                      *:py3file*
-The |:py3file| command works similar to |:pyfile|.
-
+The `:py3file` command works similar to `:pyfile`.
                                                        *:py3do* *E863*
-:[range]py3do {body}   Execute Python function "def _vim_pydo(line, linenr):
-                       {body}" for each line in the [range], with the
-                       function arguments being set to the text of each line
-                       in turn, without a trailing <EOL>, and the current
-                       line number. The function should return a string or
-                       None. If a string is returned, it becomes the text of
-                       the line in the current turn. The default for [range]
-                       is the whole file: "1,$".
-                       {not in Vi}
+The `:py3do` command works similar to `:pydo`.
 
-Examples:
->
-       :py3do return "%s\t%d" % (line[::-1], len(line))
-       :py3do if line: return "%4d: %s" % (linenr, line)
 
 Vim can be built in four ways (:version output):
 1. No Python support       (-python, -python3)
index b9ad364ff9cc1a1c37b3bb9f4f441cf26cfacbd5..75e1724e5f276d0d701b2d13d10bd960f24c3fd6 100644 (file)
@@ -739,6 +739,8 @@ EX(CMD_pwd,         "pwd",          ex_pwd,
                        TRLBAR|CMDWIN),
 EX(CMD_python,         "python",       ex_python,
                        RANGE|EXTRA|NEEDARG|CMDWIN),
+EX(CMD_pydo,           "pydo",         ex_pydo,
+                       RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN),
 EX(CMD_pyfile,         "pyfile",       ex_pyfile,
                        RANGE|FILE1|NEEDARG|CMDWIN),
 EX(CMD_py3,            "py3",          ex_py3,
index 5ce0b5d97f403d03d73f097b7c899097202bc568..056339e7eac5af4391f5e0a437895a189795dc1a 100644 (file)
@@ -268,6 +268,7 @@ static void ex_popup __ARGS((exarg_T *eap));
 #endif
 #ifndef FEAT_PYTHON
 # define ex_python             ex_script_ni
+# define ex_pydo               ex_ni
 # define ex_pyfile             ex_ni
 #endif
 #ifndef FEAT_PYTHON3
index c25be53e9b07250e8146b50bd103de6dc282adcd..280c24841223ee8e7c48fef65bc30215d19a1cb7 100644 (file)
@@ -22,6 +22,7 @@ typedef int Py_ssize_t;  /* Python 2.4 and earlier don't have this type. */
 #else
 # define ENC_OPT "latin1"
 #endif
+#define DOPY_FUNC "_vim_pydo"
 
 #define PyErr_SetVim(str) PyErr_SetString(VimError, str)
 
index baa8cab878112633d866626a63a03eb9feba786e..5874103f0fe31300ebd0ba5015124a28d89dbf82 100644 (file)
@@ -198,6 +198,9 @@ struct PyMethodDef { Py_ssize_t a; };
 # define PyModule_GetDict dll_PyModule_GetDict
 # define PyRun_SimpleString dll_PyRun_SimpleString
 # define PyRun_String dll_PyRun_String
+# define PyObject_GetAttrString dll_PyObject_GetAttrString
+# define PyObject_SetAttrString dll_PyObject_SetAttrString
+# define PyObject_CallFunctionObjArgs dll_PyObject_CallFunctionObjArgs
 # define PyString_AsString dll_PyString_AsString
 # define PyString_AsStringAndSize dll_PyString_AsStringAndSize
 # define PyString_FromString dll_PyString_FromString
@@ -303,6 +306,9 @@ static PyObject* (*dll_PyIter_Next)(PyObject *);
 static PyObject*(*dll_PyModule_GetDict)(PyObject *);
 static int(*dll_PyRun_SimpleString)(char *);
 static PyObject *(*dll_PyRun_String)(char *, int, PyObject *, PyObject *);
+static PyObject* (*dll_PyObject_GetAttrString)(PyObject *, const char *);
+static PyObject* (*dll_PyObject_SetAttrString)(PyObject *, const char *, PyObject *);
+static PyObject* (*dll_PyObject_CallFunctionObjArgs)(PyObject *, ...);
 static char*(*dll_PyString_AsString)(PyObject *);
 static int(*dll_PyString_AsStringAndSize)(PyObject *, char **, int *);
 static PyObject*(*dll_PyString_FromString)(const char *);
@@ -440,6 +446,9 @@ static struct
     {"PyModule_GetDict", (PYTHON_PROC*)&dll_PyModule_GetDict},
     {"PyRun_SimpleString", (PYTHON_PROC*)&dll_PyRun_SimpleString},
     {"PyRun_String", (PYTHON_PROC*)&dll_PyRun_String},
+    {"PyObject_GetAttrString", (PYTHON_PROC*)&dll_PyObject_GetAttrString},
+    {"PyObject_SetAttrString", (PYTHON_PROC*)&dll_PyObject_SetAttrString},
+    {"PyObject_CallFunctionObjArgs", (PYTHON_PROC*)&dll_PyObject_CallFunctionObjArgs},
     {"PyString_AsString", (PYTHON_PROC*)&dll_PyString_AsString},
     {"PyString_AsStringAndSize", (PYTHON_PROC*)&dll_PyString_AsStringAndSize},
     {"PyString_FromString", (PYTHON_PROC*)&dll_PyString_FromString},
@@ -995,6 +1004,93 @@ ex_pyfile(exarg_T *eap)
     DoPythonCommand(eap, buffer, NULL);
 }
 
+    void
+ex_pydo(exarg_T *eap)
+{
+    linenr_T           i;
+    const char         *code_hdr = "def " DOPY_FUNC "(line, linenr):\n ";
+    const char         *s = (const char *) eap->arg;
+    size_t             len;
+    char               *code;
+    int                        status;
+    PyObject           *pyfunc, *pymain;
+    PyGILState_STATE   pygilstate;
+
+    if (Python_Init())
+        return;
+
+    if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
+    {
+       EMSG(_("cannot save undo information"));
+       return;
+    }
+    len = strlen(code_hdr) + strlen(s);
+    code = malloc(len + 1);
+    STRCPY(code, code_hdr);
+    STRNCAT(code, s, len + 1);
+    pygilstate = PyGILState_Ensure();
+    status = PyRun_SimpleString(code);
+    vim_free(code);
+    if (status)
+    {
+       EMSG(_("failed to run the code"));
+       return;
+    }
+    status = 0; /* good */
+    pymain = PyImport_AddModule("__main__");
+    pyfunc = PyObject_GetAttrString(pymain, DOPY_FUNC);
+    PyGILState_Release(pygilstate);
+
+    for (i = eap->line1; i <= eap->line2; i++)
+    {
+       const char *line;
+       PyObject *pyline, *pylinenr, *pyret;
+
+       line = (char *)ml_get(i);
+       pygilstate = PyGILState_Ensure();
+       pyline = PyString_FromStringAndSize(line, strlen(line));
+       pylinenr = PyLong_FromLong(i);
+       pyret = PyObject_CallFunctionObjArgs(pyfunc, pyline, pylinenr, NULL);
+       Py_DECREF(pyline);
+       Py_DECREF(pylinenr);
+       if (!pyret)
+       {
+           PyErr_PrintEx(0);
+           PythonIO_Flush();
+           status = 1;
+           goto out;
+       }
+
+       if (pyret && pyret != Py_None)
+       {
+           if (!PyString_Check(pyret))
+           {
+               EMSG(_("E863: return value must be an instance of str"));
+               Py_XDECREF(pyret);
+               status = 1;
+               goto out;
+           }
+           ml_replace(i, (char_u *) PyString_AsString(pyret), 1);
+           changed();
+#ifdef SYNTAX_HL
+           syn_changed(i); /* recompute syntax hl. for this line */
+#endif
+       }
+       Py_XDECREF(pyret);
+       PythonIO_Flush();
+       PyGILState_Release(pygilstate);
+    }
+    pygilstate = PyGILState_Ensure();
+out:
+    Py_DECREF(pyfunc);
+    PyObject_SetAttrString(pymain, DOPY_FUNC, NULL);
+    PyGILState_Release(pygilstate);
+    if (status)
+       return;
+    check_cursor();
+    update_curbuf(NOT_VALID);
+}
+
 /******************************************************
  * 2. Python output stream: writes output via [e]msg().
  */
index 7ceb13d932d01c08590f24f21481652e2281be8b..0aeb2cd00a9f252697619425eb7b518e3aed7da6 100644 (file)
@@ -76,7 +76,6 @@ static void init_structs(void);
 #else
 # define CODEC_ERROR_HANDLER NULL
 #endif
-#define DOPY_FUNC "_vim_pydo"
 
 /* Python 3 does not support CObjects, always use Capsules */
 #define PY_USE_CAPSULE
index 4ba977cfb88f3ae1dc641d88c83268194ba0196b..8aa76746382096dd07149bfe50a9eb6b7c4f7a9e 100644 (file)
@@ -3,6 +3,7 @@ int python_enabled __ARGS((int verbose));
 void python_end __ARGS((void));
 int python_loaded __ARGS((void));
 void ex_python __ARGS((exarg_T *eap));
+void ex_pydo __ARGS((exarg_T *eap));
 void ex_pyfile __ARGS((exarg_T *eap));
 void python_buffer_free __ARGS((buf_T *buf));
 void python_window_free __ARGS((win_T *win));
index b76e9c44274af3a5f398c113e400041a245abf1d..97611e487ade5500bd10d10fb372dd420a28dda0 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    966,
 /**/
     965,
 /**/