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

Patch 7.3.911

Expand Messages
  • Bram Moolenaar
    Patch 7.3.911 Problem: Python: Access to Vim variables is not so easy. Solution: Define vim.vars and vim.vvars. (ZyX) Files: runtime/doc/if_pyth.txt,
    Message 1 of 1 , Apr 24, 2013
    • 0 Attachment
      Patch 7.3.911
      Problem: Python: Access to Vim variables is not so easy.
      Solution: Define vim.vars and vim.vvars. (ZyX)
      Files: runtime/doc/if_pyth.txt, src/eval.c, src/globals.h,
      src/if_py_both.h, src/if_python3.c, src/if_python.c,
      src/testdir/test86.in, src/testdir/test86.ok,
      src/testdir/test87.in, src/testdir/test87.ok


      *** ../vim-7.3.910/runtime/doc/if_pyth.txt 2012-09-21 14:00:05.000000000 +0200
      --- runtime/doc/if_pyth.txt 2013-04-24 13:54:23.000000000 +0200
      ***************
      *** 54,61 ****
      EOF
      endfunction
      <
      ! Note: Python is very sensitive to the indenting. Also make sure the "class"
      ! line and "EOF" do not have any indent.

      *:pyfile* *:pyf*
      :[range]pyf[ile] {file}
      --- 54,61 ----
      EOF
      endfunction
      <
      ! Note: Python is very sensitive to the indenting. Make sure the "class" line
      ! and "EOF" do not have any indent.

      *:pyfile* *:pyf*
      :[range]pyf[ile] {file}
      ***************
      *** 165,171 ****
      Value Meaning ~
      zero Variable is not locked
      vim.VAR_LOCKED Variable is locked, but can be unlocked
      ! vim.VAR_FIXED Variable is locked and can’t be unlocked
      integer constants. If variable is not fixed, you can do
      `var.locked=True` to lock it and `var.locked=False` to unlock.
      There is no recursive locking like |:lockvar|! does. There is also
      --- 165,171 ----
      Value Meaning ~
      zero Variable is not locked
      vim.VAR_LOCKED Variable is locked, but can be unlocked
      ! vim.VAR_FIXED Variable is locked and can't be unlocked
      integer constants. If variable is not fixed, you can do
      `var.locked=True` to lock it and `var.locked=False` to unlock.
      There is no recursive locking like |:lockvar|! does. There is also
      ***************
      *** 237,242 ****
      --- 237,247 ----
      "current range". A range is a bit like a buffer, but with all access
      restricted to a subset of lines. See |python-range| for more details.

      + vim.vars *python-vars*
      + vim.vvars *python-vvars*
      + Dictionary-like objects holding dictionaries with global (|g:|) and
      + vim (|v:|) variables respectively. Identical to `vim.bindeval("g:")`,
      + but faster.

      Output from Python *python-output*
      Vim displays all Python code output in the Vim message area. Normal
      ***************
      *** 307,312 ****
      --- 312,318 ----
      :py n = len(b) # number of lines
      :py (row,col) = b.mark('a') # named mark
      :py r = b.range(1,5) # a sub-range of the buffer
      + :py b.vars["foo"] = "bar" # assign b:foo variable

      ==============================================================================
      4. Range objects *python-range*
      ***************
      *** 354,359 ****
      --- 360,368 ----
      This is a tuple, (row,col).
      height (read-write) The window height, in rows
      width (read-write) The window width, in columns
      + vars (read-only) The window |w:| variables. Attribute is
      + unassignable, but you can change window
      + variables this way
      The height attribute is writable only if the screen is split horizontally.
      The width attribute is writable only if the screen is split vertically.

      ***************
      *** 385,391 ****

      *:py3* *:python3*
      The |:py3| and |:python3| commands work similar to |:python|. A simple check
      ! if the `:py3` command is wrong: >
      :py3 print("Hello")
      < *:py3file*
      The |:py3file| command works similar to |:pyfile|.
      --- 394,400 ----

      *:py3* *:python3*
      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|.
      *** ../vim-7.3.910/src/eval.c 2013-04-15 18:25:55.000000000 +0200
      --- src/eval.c 2013-04-24 14:02:45.000000000 +0200
      ***************
      *** 113,124 ****
      static char *e_nofunc = N_("E130: Unknown function: %s");
      static char *e_illvar = N_("E461: Illegal variable name: %s");

      ! /*
      ! * All user-defined global variables are stored in dictionary "globvardict".
      ! * "globvars_var" is the variable that is used for "g:".
      ! */
      ! static dict_T globvardict;
      ! static dictitem_T globvars_var;
      #define globvarht globvardict.dv_hashtab

      /*
      --- 113,119 ----
      static char *e_nofunc = N_("E130: Unknown function: %s");
      static char *e_illvar = N_("E461: Illegal variable name: %s");

      ! static dictitem_T globvars_var; /* variable used for g: */
      #define globvarht globvardict.dv_hashtab

      /*
      ***************
      *** 370,381 ****
      #define vv_list vv_di.di_tv.vval.v_list
      #define vv_tv vv_di.di_tv

      ! /*
      ! * The v: variables are stored in dictionary "vimvardict".
      ! * "vimvars_var" is the variable that is used for the "l:" scope.
      ! */
      ! static dict_T vimvardict;
      ! static dictitem_T vimvars_var;
      #define vimvarht vimvardict.dv_hashtab

      static void prepare_vimvar __ARGS((int idx, typval_T *save_tv));
      --- 365,371 ----
      #define vv_list vv_di.di_tv.vval.v_list
      #define vv_tv vv_di.di_tv

      ! static dictitem_T vimvars_var; /* variable used for v: */
      #define vimvarht vimvardict.dv_hashtab

      static void prepare_vimvar __ARGS((int idx, typval_T *save_tv));
      *** ../vim-7.3.910/src/globals.h 2013-03-19 13:33:18.000000000 +0100
      --- src/globals.h 2013-04-24 13:57:51.000000000 +0200
      ***************
      *** 180,185 ****
      --- 180,187 ----
      EXTERN int emsg_severe INIT(= FALSE); /* use message of next of several
      emsg() calls for throw */
      EXTERN int did_endif INIT(= FALSE); /* just had ":endif" */
      + EXTERN dict_T vimvardict; /* Dictionary with v: variables */
      + EXTERN dict_T globvardict; /* Dictionary with g: variables */
      #endif
      EXTERN int did_emsg; /* set by emsg() when the message
      is displayed or thrown */
      *** ../vim-7.3.910/src/if_py_both.h 2013-04-24 13:47:36.000000000 +0200
      --- src/if_py_both.h 2013-04-24 13:54:23.000000000 +0200
      ***************
      *** 1532,1539 ****
      else if (strcmp(name, "width") == 0)
      return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
      #endif
      else if (strcmp(name,"__members__") == 0)
      ! return Py_BuildValue("[sss]", "buffer", "cursor", "height");
      else
      return NULL;
      }
      --- 1532,1541 ----
      else if (strcmp(name, "width") == 0)
      return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
      #endif
      + else if (strcmp(name, "vars") == 0)
      + return DictionaryNew(this->win->w_vars);
      else if (strcmp(name,"__members__") == 0)
      ! return Py_BuildValue("[ssss]", "buffer", "cursor", "height", "vars");
      else
      return NULL;
      }
      ***************
      *** 2495,2502 ****
      return Py_BuildValue("s", this->buf->b_ffname);
      else if (strcmp(name, "number") == 0)
      return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
      else if (strcmp(name,"__members__") == 0)
      ! return Py_BuildValue("[ss]", "name", "number");
      else
      return NULL;
      }
      --- 2497,2506 ----
      return Py_BuildValue("s", this->buf->b_ffname);
      else if (strcmp(name, "number") == 0)
      return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
      + else if (strcmp(name, "vars") == 0)
      + return DictionaryNew(this->buf->b_vars);
      else if (strcmp(name,"__members__") == 0)
      ! return Py_BuildValue("[sss]", "name", "number", "vars");
      else
      return NULL;
      }
      *** ../vim-7.3.910/src/if_python3.c 2013-04-24 13:39:11.000000000 +0200
      --- src/if_python3.c 2013-04-24 13:54:23.000000000 +0200
      ***************
      *** 1647,1652 ****
      --- 1647,1655 ----
      Py_INCREF((PyObject *)(void *)&TheWindowList);
      PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList);

      + PyModule_AddObject(mod, "vars", DictionaryNew(&globvardict));
      + PyModule_AddObject(mod, "vvars", DictionaryNew(&vimvardict));
      +
      #define ADD_INT_CONSTANT(name, value) \
      tmp = PyLong_FromLong(value); \
      Py_INCREF(tmp); \
      *** ../vim-7.3.910/src/if_python.c 2013-04-24 13:47:36.000000000 +0200
      --- src/if_python.c 2013-04-24 13:54:33.000000000 +0200
      ***************
      *** 1330,1335 ****
      --- 1330,1336 ----
      {
      PyObject *mod;
      PyObject *dict;
      + PyObject *tmp;
      /* The special value is removed from sys.path in Python_Init(). */
      static char *(argv[2]) = {"/must>not&exist/foo", NULL};

      ***************
      *** 1353,1358 ****
      --- 1354,1365 ----
      PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferList);
      PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
      PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
      + tmp = DictionaryNew(&globvardict);
      + PyDict_SetItemString(dict, "vars", tmp);
      + Py_DECREF(tmp);
      + tmp = DictionaryNew(&vimvardict);
      + PyDict_SetItemString(dict, "vvars", tmp);
      + Py_DECREF(tmp);
      PyDict_SetItemString(dict, "VAR_LOCKED", PyInt_FromLong(VAR_LOCKED));
      PyDict_SetItemString(dict, "VAR_FIXED", PyInt_FromLong(VAR_FIXED));
      PyDict_SetItemString(dict, "VAR_SCOPE", PyInt_FromLong(VAR_SCOPE));
      *** ../vim-7.3.910/src/testdir/test86.in 2013-04-05 19:32:30.000000000 +0200
      --- src/testdir/test86.in 2013-04-24 13:54:33.000000000 +0200
      ***************
      *** 346,351 ****
      --- 346,364 ----
      :$put =string(pyeval('l'))
      :py l = ll[-10:10]
      :$put =string(pyeval('l'))
      + :"
      + :" Vars
      + :let g:foo = 'bac'
      + :let w:abc = 'def'
      + :let b:baz = 'bar'
      + :try
      + : throw "Abc"
      + :catch
      + : put =pyeval('vim.vvars[''exception'']')
      + :endtry
      + :put =pyeval('vim.vars[''foo'']')
      + :put =pyeval('vim.current.window.vars[''abc'']')
      + :put =pyeval('vim.current.buffer.vars[''baz'']')
      :endfun
      :"
      :call Test()
      *** ../vim-7.3.910/src/testdir/test86.ok 2013-04-24 13:04:21.000000000 +0200
      --- src/testdir/test86.ok 2013-04-24 13:54:33.000000000 +0200
      ***************
      *** 76,78 ****
      --- 76,82 ----
      [0, 1, 2, 3, 4, 5]
      [0, 1, 2, 3, 4, 5]
      [0, 1, 2, 3, 4, 5]
      + Abc
      + bac
      + def
      + bar
      *** ../vim-7.3.910/src/testdir/test87.in 2013-02-13 14:17:00.000000000 +0100
      --- src/testdir/test87.in 2013-04-24 13:54:33.000000000 +0200
      ***************
      *** 315,320 ****
      --- 315,333 ----
      :py3 trace_main()
      :py3 sys.settrace(None)
      :$put =string(l)
      + :"
      + :" Vars
      + :let g:foo = 'bac'
      + :let w:abc = 'def'
      + :let b:baz = 'bar'
      + :try
      + : throw "Abc"
      + :catch
      + : put =py3eval('vim.vvars[''exception'']')
      + :endtry
      + :put =py3eval('vim.vars[''foo'']')
      + :put =py3eval('vim.current.window.vars[''abc'']')
      + :put =py3eval('vim.current.buffer.vars[''baz'']')
      :endfun
      :"
      :call Test()
      *** ../vim-7.3.910/src/testdir/test87.ok 2013-04-24 13:04:21.000000000 +0200
      --- src/testdir/test87.ok 2013-04-24 13:54:33.000000000 +0200
      ***************
      *** 65,67 ****
      --- 65,71 ----
      vim: Vim(let):E861:
      [1]
      [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
      + Abc
      + bac
      + def
      + bar
      *** ../vim-7.3.910/src/version.c 2013-04-24 13:47:36.000000000 +0200
      --- src/version.c 2013-04-24 13:54:00.000000000 +0200
      ***************
      *** 730,731 ****
      --- 730,733 ----
      { /* Add new patch number below this line */
      + /**/
      + 911,
      /**/

      --
      hundred-and-one symptoms of being an internet addict:
      222. You send more than 20 personal e-mails a day.

      /// 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.
    Your message has been successfully submitted and would be delivered to recipients shortly.