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

Patch 7.3.996

Expand Messages
  • Bram Moolenaar
    Patch 7.3.996 Problem: Python: Can t check types of what is returned by bindeval(). Solution: Add vim.List, vim.Dictionary and vim.Function types. (ZyX)
    Message 1 of 1 , May 21, 2013
    • 0 Attachment
      Patch 7.3.996
      Problem: Python: Can't check types of what is returned by bindeval().
      Solution: Add vim.List, vim.Dictionary and vim.Function types. (ZyX)
      Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/testdir/test86.in,
      src/testdir/test86.ok, src/testdir/test87.in,
      src/testdir/test87.ok


      *** ../vim-7.3.995/runtime/doc/if_pyth.txt 2013-05-17 16:39:59.000000000 +0200
      --- runtime/doc/if_pyth.txt 2013-05-21 19:21:58.000000000 +0200
      ***************
      *** 11,19 ****
      3. Buffer objects |python-buffer|
      4. Range objects |python-range|
      5. Window objects |python-window|
      ! 6. pyeval(), py3eval() Vim functions |python-pyeval|
      ! 7. Dynamic loading |python-dynamic|
      ! 8. Python 3 |python3|

      {Vi does not have any of these commands}

      --- 11,20 ----
      3. Buffer objects |python-buffer|
      4. Range objects |python-range|
      5. Window objects |python-window|
      ! 6. Tab page objects |python-tabpage|
      ! 7. pyeval(), py3eval() Vim functions |python-pyeval|
      ! 8. Dynamic loading |python-dynamic|
      ! 9. Python 3 |python3|

      {Vi does not have any of these commands}

      ***************
      *** 176,182 ****
      list or dictionary. Thus modifications to these objects imply
      modifications of the original.

      ! Additionally, vimlist and vimdictionary type have read-write
      `.locked` attribute that returns
      Value Meaning ~
      zero Variable is not locked
      --- 177,183 ----
      list or dictionary. Thus modifications to these objects imply
      modifications of the original.

      ! Additionally, vim.List and vim.Dictionary type have read-write
      `.locked` attribute that returns
      Value Meaning ~
      zero Variable is not locked
      ***************
      *** 189,202 ****
      case these locks are ignored by anything except |:let|: |extend()|
      does not care, neither does python interface).

      ! Vimdictionary type also supports `.scope` attribute which is one of
      Value Meaning ~
      zero Dictionary is not a scope one
      vim.VAR_DEF_SCOPE Function-local or global scope dictionary
      vim.VAR_SCOPE Other scope dictionary

      2. if expression evaluates to a function reference, then it returns
      ! callable vimfunction object. Use self keyword argument to assign
      |self| object for dictionary functions.

      Note: this function has the same behavior as |lua-eval| (except that
      --- 190,204 ----
      case these locks are ignored by anything except |:let|: |extend()|
      does not care, neither does python interface).

      ! vim.Dictionary type also supports `.scope` attribute which is one
      ! of
      Value Meaning ~
      zero Dictionary is not a scope one
      vim.VAR_DEF_SCOPE Function-local or global scope dictionary
      vim.VAR_SCOPE Other scope dictionary

      2. if expression evaluates to a function reference, then it returns
      ! callable vim.Function object. Use self keyword argument to assign
      |self| object for dictionary functions.

      Note: this function has the same behavior as |lua-eval| (except that
      ***************
      *** 205,210 ****
      --- 207,216 ----
      relying on outputs of vim.eval() being a copy of original or
      vim.eval("1") returning a string.

      + You can use "List", "Dictionary" and "Function" vim module attributes
      + to test whether object has given type. These types are currently not
      + subclassable, neither they contain constructors, so you can use them
      + only for checks like `isinstance(obj, vim.List)`.


      Error object of the "vim" module
      ***************
      *** 302,307 ****
      --- 308,316 ----
      buffer-local options and |python-window| objects to access to
      window-local options.

      + Type of this object is available via "Options" attribute of vim
      + module.
      +
      Output from Python *python-output*
      Vim displays all Python code output in the Vim message area. Normal
      output appears as information messages, and error output appears as
      ***************
      *** 371,376 ****
      --- 380,387 ----
      A trailing '\n' is allowed and ignored, so that you can do: >
      :py b.append(f.readlines())

      + Buffer object type is available using "Buffer" attribute of vim module.
      +
      Examples (assume b is the current buffer) >
      :py print b.name # write the buffer file name
      :py b[0] = "hello!!!" # replace the top line
      ***************
      *** 412,417 ****
      --- 423,430 ----
      for Python's built-in list objects.
      r.append(list, nr) Idem, after line "nr"

      + Range object type is available using "Range" attribute of vim module.
      +
      Example (assume r is the current range):
      # Send all lines in a range to the default printer
      vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1))
      ***************
      *** 456,461 ****
      --- 469,476 ----
      The height attribute is writable only if the screen is split horizontally.
      The width attribute is writable only if the screen is split vertically.

      + Window object type is available using "Window" attribute of vim module.
      +
      ==============================================================================
      6. Tab page objects *python-tabpage*

      ***************
      *** 474,487 ****
      vars The tab page |t:| variables.
      window Current tabpage window.

      ==============================================================================
      ! 6. pyeval() and py3eval() Vim functions *python-pyeval*

      To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
      functions to evaluate Python expressions and pass their values to VimL.

      ==============================================================================
      ! 7. Dynamic loading *python-dynamic*

      On MS-Windows the Python library can be loaded dynamically. The |:version|
      output then includes |+python/dyn|.
      --- 489,504 ----
      vars The tab page |t:| variables.
      window Current tabpage window.

      + TabPage object type is available using "TabPage" attribute of vim module.
      +
      ==============================================================================
      ! 7. pyeval() and py3eval() Vim functions *python-pyeval*

      To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
      functions to evaluate Python expressions and pass their values to VimL.

      ==============================================================================
      ! 8. Dynamic loading *python-dynamic*

      On MS-Windows the Python library can be loaded dynamically. The |:version|
      output then includes |+python/dyn|.
      ***************
      *** 498,504 ****
      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
      --- 515,521 ----
      sure edit "gvim.exe" and search for "python\d*.dll\c".

      ==============================================================================
      ! 9. Python 3 *python3*

      *:py3* *:python3*
      The `:py3` and `:python3` commands work similar to `:python`. A simple check
      *** ../vim-7.3.995/src/if_py_both.h 2013-05-21 19:10:56.000000000 +0200
      --- src/if_py_both.h 2013-05-21 19:21:58.000000000 +0200
      ***************
      *** 4245,4250 ****
      --- 4245,4259 ----
      {"windows", (PyObject *)(void *)&TheWindowList},
      {"tabpages", (PyObject *)(void *)&TheTabPageList},
      {"current", (PyObject *)(void *)&TheCurrent},
      +
      + {"Buffer", (PyObject *)&BufferType},
      + {"Range", (PyObject *)&RangeType},
      + {"Window", (PyObject *)&WindowType},
      + {"TabPage", (PyObject *)&TabPageType},
      + {"Dictionary", (PyObject *)&DictionaryType},
      + {"List", (PyObject *)&ListType},
      + {"Function", (PyObject *)&FunctionType},
      + {"Options", (PyObject *)&OptionsType},
      };

      typedef int (*object_adder)(PyObject *, const char *, PyObject *);
      *** ../vim-7.3.995/src/testdir/test86.in 2013-05-17 13:37:57.000000000 +0200
      --- src/testdir/test86.in 2013-05-21 19:21:58.000000000 +0200
      ***************
      *** 631,640 ****
      cb.append('Current line: ' + repr(vim.current.line))
      for b in vim.buffers:
      if b is not cb:
      ! vim.command('bwipeout! ' + b.number)
      EOF
      :tabonly!
      :only!
      :endfun
      :"
      :call Test()
      --- 631,656 ----
      cb.append('Current line: ' + repr(vim.current.line))
      for b in vim.buffers:
      if b is not cb:
      ! vim.command('bwipeout! ' + str(b.number))
      EOF
      :tabonly!
      :only!
      + :"
      + :" Test types
      + py << EOF
      + for expr, attr in (
      + ('vim.vars', 'Dictionary'),
      + ('vim.options', 'Options'),
      + ('vim.bindeval("{}")', 'Dictionary'),
      + ('vim.bindeval("[]")', 'List'),
      + ('vim.bindeval("function(\'tr\')")', 'Function'),
      + ('vim.current.buffer', 'Buffer'),
      + ('vim.current.range', 'Range'),
      + ('vim.current.window', 'Window'),
      + ('vim.current.tabpage', 'TabPage'),
      + ):
      + cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
      + EOF
      :endfun
      :"
      :call Test()
      *** ../vim-7.3.995/src/testdir/test86.ok 2013-05-17 16:18:27.000000000 +0200
      --- src/testdir/test86.ok 2013-05-21 19:21:58.000000000 +0200
      ***************
      *** 333,339 ****
      Current tab pages:
      <tabpage 0>(1): 1 windows, current is <window object (unknown)>
      Windows:
      ! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (954, 0)
      <tabpage 1>(2): 1 windows, current is <window object (unknown)>
      Windows:
      <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
      --- 333,339 ----
      Current tab pages:
      <tabpage 0>(1): 1 windows, current is <window object (unknown)>
      Windows:
      ! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (970, 0)
      <tabpage 1>(2): 1 windows, current is <window object (unknown)>
      Windows:
      <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
      ***************
      *** 359,361 ****
      --- 359,370 ----
      Current window: <window 0>
      Current buffer: <buffer test86.in>
      Current line: 'Type error at assigning None to vim.current.buffer'
      + vim.vars:Dictionary:True
      + vim.options:Options:True
      + vim.bindeval("{}"):Dictionary:True
      + vim.bindeval("[]"):List:True
      + vim.bindeval("function('tr')"):Function:True
      + vim.current.buffer:Buffer:True
      + vim.current.range:Range:True
      + vim.current.window:Window:True
      + vim.current.tabpage:TabPage:True
      *** ../vim-7.3.995/src/testdir/test87.in 2013-05-17 13:37:57.000000000 +0200
      --- src/testdir/test87.in 2013-05-21 19:21:58.000000000 +0200
      ***************
      *** 622,627 ****
      --- 622,643 ----
      EOF
      :tabonly!
      :only!
      + :"
      + :" Test types
      + py3 << EOF
      + for expr, attr in (
      + ('vim.vars', 'Dictionary'),
      + ('vim.options', 'Options'),
      + ('vim.bindeval("{}")', 'Dictionary'),
      + ('vim.bindeval("[]")', 'List'),
      + ('vim.bindeval("function(\'tr\')")', 'Function'),
      + ('vim.current.buffer', 'Buffer'),
      + ('vim.current.range', 'Range'),
      + ('vim.current.window', 'Window'),
      + ('vim.current.tabpage', 'TabPage'),
      + ):
      + cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
      + EOF
      :endfun
      :"
      :call Test()
      *** ../vim-7.3.995/src/testdir/test87.ok 2013-05-21 18:19:33.000000000 +0200
      --- src/testdir/test87.ok 2013-05-21 19:21:58.000000000 +0200
      ***************
      *** 322,328 ****
      Current tab pages:
      <tabpage 0>(1): 1 windows, current is <window object (unknown)>
      Windows:
      ! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (930, 0)
      <tabpage 1>(2): 1 windows, current is <window object (unknown)>
      Windows:
      <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
      --- 322,328 ----
      Current tab pages:
      <tabpage 0>(1): 1 windows, current is <window object (unknown)>
      Windows:
      ! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (946, 0)
      <tabpage 1>(2): 1 windows, current is <window object (unknown)>
      Windows:
      <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
      ***************
      *** 348,350 ****
      --- 348,359 ----
      Current window: <window 0>
      Current buffer: <buffer test87.in>
      Current line: 'Type error at assigning None to vim.current.buffer'
      + vim.vars:Dictionary:True
      + vim.options:Options:True
      + vim.bindeval("{}"):Dictionary:True
      + vim.bindeval("[]"):List:True
      + vim.bindeval("function('tr')"):Function:True
      + vim.current.buffer:Buffer:True
      + vim.current.range:Range:True
      + vim.current.window:Window:True
      + vim.current.tabpage:TabPage:True
      *** ../vim-7.3.995/src/version.c 2013-05-21 19:10:56.000000000 +0200
      --- src/version.c 2013-05-21 19:48:38.000000000 +0200
      ***************
      *** 730,731 ****
      --- 730,733 ----
      { /* Add new patch number below this line */
      + /**/
      + 996,
      /**/

      --
      SUPERIMPOSE "England AD 787". After a few more seconds we hear hoofbeats in
      the distance. They come slowly closer. Then out of the mist comes KING
      ARTHUR followed by a SERVANT who is banging two half coconuts together.
      "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

      /// 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.