neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

if_pyth.txt (24835B)


      1 *if_pyth.txt*   Nvim
      2 
      3 
      4 	  NVIM REFERENCE MANUAL
      5 
      6 
      7 The Python Interface to NVim				*if_pyth* *python* *Python*
      8 
      9 See |provider-python| for more information.
     10 
     11                                      Type |gO| to see the table of contents.
     12 
     13 ==============================================================================
     14 Commands						*python-commands*
     15 
     16 				*:python* *:py* *E263* *E264* *E887*
     17 :[range]py[thon] {stmt}
     18 		Execute Python statement {stmt}.  A simple check if
     19 		the `:python` command is working: >vim
     20 			:python print("Hello")
     21 
     22 :[range]py[thon] << [trim] [{endmarker}]
     23 {script}
     24 {endmarker}
     25 		Execute Python script {script}.  Useful for including
     26 		python code in Vim scripts.  Requires Python, see
     27 		|script-here|.
     28 
     29 If [endmarker] is omitted from after the "<<", a dot '.' must be used after
     30 {script}, like for the |:append| and |:insert| commands.  Refer to
     31 |:let-heredoc| for more information.
     32 
     33 Example: >vim
     34 function! IcecreamInitialize()
     35 python << EOF
     36 class StrawberryIcecream:
     37 	def __call__(self):
     38 		print('EAT ME')
     39 EOF
     40 endfunction
     41 
     42 To see what version of Python you have: >vim
     43 :python print(sys.version)
     44 
     45 There is no need to "import sys", it's done by default.
     46 
     47 						*python-environment*
     48 Environment variables set in Vim are not always available in Python.  This
     49 depends on how Vim and Python were build.  Also see
     50 https://docs.python.org/3/library/os.html#os.environ
     51 
     52 Note: Python is very sensitive to indenting.  Make sure the "class" line and
     53 "EOF" do not have any indent.
     54 
     55 						*:pydo*
     56 :[range]pydo {body}	Execute Python function "def _vim_pydo(line, linenr):
     57 		{body}" for each line in the [range], with the
     58 		function arguments being set to the text of each line
     59 		in turn, without a trailing <EOL>, and the current
     60 		line number.  The function should return a string or
     61 		None.  If a string is returned, it becomes the text of
     62 		the line in the current turn.  The default for [range]
     63 		is the whole file: "1,$".
     64 
     65 Examples:
     66 >vim
     67 :pydo return "%s\t%d" % (line[::-1], len(line))
     68 :pydo if line: return "%4d: %s" % (linenr, line)
     69 <
     70 One can use `:pydo` in possible conjunction with `:py` to filter a range using
     71 python.  For example: >vim
     72 
     73 :py3 << EOF
     74 needle = vim.eval('@a')
     75 replacement = vim.eval('@b')
     76 
     77 def py_vim_string_replace(str):
     78 	return str.replace(needle, replacement)
     79 EOF
     80 :'<,'>py3do return py_vim_string_replace(line)
     81 <
     82 						*:pyfile* *:pyf*
     83 :[range]pyf[ile] {file}
     84 		Execute the Python script in {file}.  The whole
     85 		argument is used as a single file name.
     86 
     87 Both of these commands do essentially the same thing - they execute a piece of
     88 Python code, with the "current range" |python-range| set to the given line
     89 range.
     90 
     91 In the case of :python, the code to execute is in the command-line.
     92 In the case of :pyfile, the code to execute is the contents of the given file.
     93 
     94 Python commands cannot be used in the |sandbox|.
     95 
     96 To pass arguments you need to set sys.argv[] explicitly.  Example: >vim
     97 
     98 :python sys.argv = ["foo", "bar"]
     99 :pyfile myscript.py
    100 
    101 Here are some examples					*python-examples*
    102 >vim
    103 :python from vim import *
    104 :python current.line = str.upper(current.line)
    105 :python print("Hello")
    106 :python str = current.buffer[42]
    107 
    108 Note that changes (such as the "import" statements) persist from one command
    109 to the next, just like the Python REPL.
    110 
    111 						*script-here*
    112 When using a script language in-line, you might want to skip this when the
    113 language isn't supported.
    114 >vim
    115   if has('python')
    116     python << EOF
    117       print("python works")
    118   EOF
    119   endif
    120 <
    121 Note that "EOF" must be at the start of the line without preceding white
    122 space.
    123 
    124 ==============================================================================
    125 The vim module							*python-vim*
    126 
    127 Python code gets all of its access to vim (with one exception - see
    128 |python-output| below) via the "vim" module.  The vim module implements two
    129 methods, three constants, and one error object.  You need to import the vim
    130 module before using it: >vim
    131 :python import vim
    132 
    133 Overview >vim
    134 :py print("Hello")		# displays a message
    135 :py vim.command(cmd)		# execute an Ex command
    136 :py w = vim.windows[n]		# gets window "n"
    137 :py cw = vim.current.window	# gets the current window
    138 :py b = vim.buffers[n]		# gets buffer "n"
    139 :py cb = vim.current.buffer	# gets the current buffer
    140 :py w.height = lines		# sets the window height
    141 :py w.cursor = (row, col)	# sets the window cursor position
    142 :py pos = w.cursor		# gets a tuple (row, col)
    143 :py name = b.name		# gets the buffer file name
    144 :py line = b[n]			# gets a line from the buffer
    145 :py lines = b[n:m]		# gets a list of lines
    146 :py num = len(b)		# gets the number of lines
    147 :py b[n] = str			# sets a line in the buffer
    148 :py b[n:m] = [str1, str2, str3]	# sets a number of lines at once
    149 :py del b[n]			# deletes a line
    150 :py del b[n:m]			# deletes a number of lines
    151 
    152 
    153 Methods of the "vim" module
    154 
    155 vim.command(str)					*python-command*
    156 Executes the vim (ex-mode) command str.  Returns None.
    157 Examples: >vim
    158     :py vim.command("set tw=72")
    159     :py vim.command("%s/aaa/bbb/g")
    160 <	The following definition executes Normal mode commands: >python
    161 	def normal(str):
    162 		vim.command("normal "+str)
    163 	# Note the use of single quotes to delimit a string containing
    164 	# double quotes
    165 	normal('"a2dd"aP')
    166 
    167 vim.eval(str)						*python-eval*
    168 Evaluates the expression str using the vim internal expression
    169 evaluator (see |expression|).  Returns the expression result as:
    170 - a string if the Vim expression evaluates to a string or number
    171 - a list if the Vim expression evaluates to a Vim |list|
    172 - a dictionary if the Vim expression evaluates to a Vim |dict|
    173 - a boolean if Vim exression evaluates to |v:true| or |v:false|
    174 - `None` if Vim expression evaluates to |v:null|
    175 Dictionaries and lists are recursively expanded.
    176 Examples: >vim
    177     :py text_width = vim.eval("&tw")
    178     :py str = vim.eval("12+12")		# NB result is a string! Use
    179 					# int() to convert to a
    180 					# number.
    181 
    182 vim.strwidth(str)					*python-strwidth*
    183 Like |strwidth()|: returns number of display cells str occupies, tab
    184 is counted as one cell.
    185 
    186 vim.foreach_rtp(callable)				*python-foreach_rtp*
    187 Call the given callable for each path in 'runtimepath' until either
    188 callable returns something but None, the exception is raised or there
    189 are no longer paths.  If stopped in case callable returned non-None,
    190 vim.foreach_rtp function returns the value returned by callable.
    191 
    192 `vim.chdir(*args, **kwargs)`				*python-chdir*
    193 `vim.fchdir(*args, **kwargs)`				*python-fchdir*
    194 Run os.chdir or os.fchdir, then all appropriate vim stuff.
    195 Note: you should not use these functions directly, use os.chdir and
    196       os.fchdir instead.  Behavior of vim.fchdir is undefined in case
    197       os.fchdir does not exist.
    198 
    199 Error object of the "vim" module
    200 
    201 vim.error						*python-error*
    202 Upon encountering a Vim error, Python raises an exception of type
    203 vim.error.
    204 Example: >python
    205 	try:
    206 		vim.command("put a")
    207 	except vim.error:
    208 		# nothing in register a
    209 
    210 Constants of the "vim" module
    211 
    212 Note that these are not actually constants - you could reassign them.
    213 But this is silly, as you would then lose access to the vim objects
    214 to which the variables referred.
    215 
    216 vim.buffers						*python-buffers*
    217 A mapping object providing access to the list of vim buffers.  The
    218 object supports the following operations: >vim
    219     :py b = vim.buffers[i]	# Indexing (read-only)
    220     :py b in vim.buffers	# Membership test
    221     :py n = len(vim.buffers)	# Number of elements
    222     :py for b in vim.buffers:	# Iterating over buffer list
    223 <
    224 vim.windows						*python-windows*
    225 A sequence object providing access to the list of vim windows.  The
    226 object supports the following operations: >vim
    227     :py w = vim.windows[i]	# Indexing (read-only)
    228     :py w in vim.windows	# Membership test
    229     :py n = len(vim.windows)	# Number of elements
    230     :py for w in vim.windows:	# Sequential access
    231 <	Note: vim.windows object always accesses current tab page.
    232 |python-tabpage|.windows objects are bound to parent |python-tabpage|
    233 object and always use windows from that tab page (or throw vim.error
    234 in case tab page was deleted).  You can keep a reference to both
    235 without keeping a reference to vim module object or |python-tabpage|,
    236 they will not lose their properties in this case.
    237 
    238 vim.tabpages						*python-tabpages*
    239 A sequence object providing access to the list of vim tab pages.  The
    240 object supports the following operations: >vim
    241     :py t = vim.tabpages[i]	# Indexing (read-only)
    242     :py t in vim.tabpages	# Membership test
    243     :py n = len(vim.tabpages)	# Number of elements
    244     :py for t in vim.tabpages:	# Sequential access
    245 <
    246 vim.current						*python-current*
    247 An object providing access (via specific attributes) to various
    248 "current" objects available in vim:
    249 	vim.current.line	The current line (RW)		String
    250 	vim.current.buffer	The current buffer (RW)		Buffer
    251 	vim.current.window	The current window (RW)		Window
    252 	vim.current.tabpage	The current tab page (RW)	TabPage
    253 	vim.current.range	The current line range (RO)	Range
    254 
    255 The last case deserves a little explanation.  When the :python or
    256 :pyfile command specifies a range, this range of lines becomes the
    257 "current range".  A range is a bit like a buffer, but with all access
    258 restricted to a subset of lines.  See |python-range| for more details.
    259 
    260 Note: When assigning to vim.current.{buffer,window,tabpage} it expects
    261 valid |python-buffer|, |python-window| or |python-tabpage| objects
    262 respectively.  Assigning triggers normal (with |autocommand|s)
    263 switching to given buffer, window or tab page.  It is the only way to
    264 switch UI objects in python: you can't assign to
    265 |python-tabpage|.window attribute.  To switch without triggering
    266 autocommands use >vim
    267     py << EOF
    268     saved_eventignore = vim.options['eventignore']
    269     vim.options['eventignore'] = 'all'
    270     try:
    271         vim.current.buffer = vim.buffers[2] # Switch to buffer 2
    272     finally:
    273         vim.options['eventignore'] = saved_eventignore
    274     EOF
    275 <
    276 vim.vars						*python-vars*
    277 vim.vvars						*python-vvars*
    278 Dictionary-like objects holding dictionaries with global (|g:|) and
    279 vim (|v:|) variables respectively.
    280 
    281 vim.options						*python-options*
    282 Object partly supporting mapping protocol (supports setting and
    283 getting items) providing a read-write access to global options.
    284 Note: unlike |:set| this provides access only to global options.  You
    285 cannot use this object to obtain or set local options' values or
    286 access local-only options in any fashion.  Raises KeyError if no
    287 global option with such name exists (i.e. does not raise KeyError for
    288 |global-local| options and global only options, but does for window-
    289 and buffer-local ones).  Use |python-buffer| objects to access to
    290 buffer-local options and |python-window| objects to access to
    291 window-local options.
    292 
    293 Type of this object is available via "Options" attribute of vim
    294 module.
    295 
    296 Output from Python					*python-output*
    297 Vim displays all Python code output in the Vim message area.  Normal
    298 output appears as information messages, and error output appears as
    299 error messages.
    300 
    301 In implementation terms, this means that all output to sys.stdout
    302 (including the output from print statements) appears as information
    303 messages, and all output to sys.stderr (including error tracebacks)
    304 appears as error messages.
    305 
    306 						*python-input*
    307 Input (via sys.stdin, including input() and raw_input()) is not
    308 supported, and may cause the program to crash.  This should probably
    309 be fixed.
    310 
    311 			  *python3-directory* *pythonx-directory*
    312 Python 'runtimepath' handling				*python-special-path*
    313 
    314 In python vim.VIM_SPECIAL_PATH special directory is used as a replacement for
    315 the list of paths found in 'runtimepath': with this directory in sys.path and
    316 vim.path_hooks in sys.path_hooks python will try to load module from
    317 {rtp}/python3 and {rtp}/pythonx for each {rtp} found in 'runtimepath'.
    318 
    319 Implementation is similar to the following: >python
    320 
    321    from imp import find_module, load_module
    322    import vim
    323    import sys
    324 
    325    class VimModuleLoader(object):
    326        def __init__(self, module):
    327            self.module = module
    328 
    329        def load_module(self, fullname, path=None):
    330            return self.module
    331 
    332    def _find_module(fullname, oldtail, path):
    333        idx = oldtail.find('.')
    334        if idx > 0:
    335            name = oldtail[:idx]
    336            tail = oldtail[idx+1:]
    337            fmr = find_module(name, path)
    338            module = load_module(fullname[:-len(oldtail)] + name, *fmr)
    339            return _find_module(fullname, tail, module.__path__)
    340        else:
    341            fmr = find_module(fullname, path)
    342            return load_module(fullname, *fmr)
    343 
    344    # It uses vim module itself in place of VimPathFinder class: it does not
    345    # matter for python which object has find_module function attached to as
    346    # an attribute.
    347    class VimPathFinder(object):
    348        @classmethod
    349        def find_module(cls, fullname, path=None):
    350            try:
    351                return VimModuleLoader(_find_module(fullname, fullname, path or vim._get_paths()))
    352            except ImportError:
    353                return None
    354 
    355        @classmethod
    356        def load_module(cls, fullname, path=None):
    357            return _find_module(fullname, fullname, path or vim._get_paths())
    358 
    359    def hook(path):
    360        if path == vim.VIM_SPECIAL_PATH:
    361            return VimPathFinder
    362        else:
    363            raise ImportError
    364 
    365    sys.path_hooks.append(hook)
    366 
    367 vim.VIM_SPECIAL_PATH				*python-VIM_SPECIAL_PATH*
    368 String constant used in conjunction with vim path hook.  If path hook
    369 installed by vim is requested to handle anything but path equal to
    370 vim.VIM_SPECIAL_PATH constant it raises ImportError.  In the only
    371 other case it uses special loader.
    372 
    373 Note: you must not use value of this constant directly, always use
    374       vim.VIM_SPECIAL_PATH object.
    375 
    376 vim.find_module(...)					*python-find_module*
    377 vim.path_hook(path)					*python-path_hook*
    378 Methods or objects used to implement path loading as described above.
    379 You should not be using any of these directly except for vim.path_hook
    380 in case you need to do something with sys.meta_path. It is not
    381 guaranteed that any of the objects will exist in the future vim
    382 versions.
    383 
    384 vim._get_paths						*python-_get_paths*
    385 Methods returning a list of paths which will be searched for by path
    386 hook.  You should not rely on this method being present in future
    387 versions, but can use it for debugging.
    388 
    389 It returns a list of {rtp}/python3 and {rtp}/pythonx
    390 directories for each {rtp} in 'runtimepath'.
    391 
    392 ==============================================================================
    393 Buffer objects						*python-buffer*
    394 
    395 Buffer objects represent vim buffers.  You can obtain them in a number of
    396 ways:
    397 - via vim.current.buffer (|python-current|)
    398 - from indexing vim.buffers (|python-buffers|)
    399 - from the "buffer" attribute of a window (|python-window|)
    400 
    401 Buffer objects have two read-only attributes - name - the full file name for
    402 the buffer, and number - the buffer number.  They also have three methods
    403 (append, mark, and range; see below).
    404 
    405 You can also treat buffer objects as sequence objects.  In this context, they
    406 act as if they were lists (yes, they are mutable) of strings, with each
    407 element being a line of the buffer.  All of the usual sequence operations,
    408 including indexing, index assignment, slicing and slice assignment, work as
    409 you would expect.  Note that the result of indexing (slicing) a buffer is a
    410 string (list of strings).  This has one unusual consequence - b[:] is
    411 different from b.  In particular, "b[:] = None" deletes the whole of the
    412 buffer, whereas "b = None" merely updates the variable b, with no effect on
    413 the buffer.
    414 
    415 Buffer indexes start at zero, as is normal in Python.  This differs from vim
    416 line numbers, which start from 1.  This is particularly relevant when dealing
    417 with marks (see below) which use vim line numbers.
    418 
    419 The buffer object attributes are:
    420 b.vars		Dictionary-like object used to access
    421 		|buffer-variable|s.
    422 b.options	Mapping object (supports item getting, setting and
    423 		deleting) that provides access to buffer-local options
    424 		and buffer-local values of |global-local| options.  Use
    425 		|python-window|.options if option is window-local,
    426 		this object will raise KeyError.  If option is
    427 		|global-local| and local value is missing getting it
    428 		will return None.
    429 b.name		String, RW.  Contains buffer name (full path).
    430 		Note: when assigning to b.name |BufFilePre| and
    431 		|BufFilePost| autocommands are launched.
    432 b.number	Buffer number.  Can be used as |python-buffers| key.
    433 		Read-only.
    434 b.valid		True or False.  Buffer object becomes invalid when
    435 		corresponding buffer is wiped out.
    436 
    437 The buffer object methods are:
    438 b.append(str)	Append a line to the buffer
    439 b.append(str, nr)  Idem, below line "nr"
    440 b.append(list)	Append a list of lines to the buffer
    441 		Note that the option of supplying a list of strings to
    442 		the append method differs from the equivalent method
    443 		for Python's built-in list objects.
    444 b.append(list, nr)  Idem, below line "nr"
    445 b.mark(name)	Return a tuple (row,col) representing the position
    446 		of the named mark (can also get the []"<> marks)
    447 b.range(s,e)	Return a range object (see |python-range|) which
    448 		represents the part of the given buffer between line
    449 		numbers s and e |inclusive|.
    450 
    451 Note that when adding a line it must not contain a line break character '\n'.
    452 A trailing '\n' is allowed and ignored, so that you can do: >vim
    453 :py b.append(f.readlines())
    454 
    455 Buffer object type is available using "Buffer" attribute of vim module.
    456 
    457 Examples (assume b is the current buffer) >vim
    458 :py print(b.name)		# write the buffer file name
    459 :py b[0] = "hello!!!"		# replace the top line
    460 :py b[:] = None			# delete the whole buffer
    461 :py del b[:]			# delete the whole buffer
    462 :py b[0:0] = [ "a line" ]	# add a line at the top
    463 :py del b[2]			# delete a line (the third)
    464 :py b.append("bottom")		# add a line at the bottom
    465 :py n = len(b)			# number of lines
    466 :py (row,col) = b.mark('a')	# named mark
    467 :py r = b.range(1,5)		# a sub-range of the buffer
    468 :py b.vars["foo"] = "bar"	# assign b:foo variable
    469 :py b.options["ff"] = "dos"	# set fileformat
    470 :py del b.options["ar"]		# same as :set autoread<
    471 
    472 ==============================================================================
    473 Range objects						*python-range*
    474 
    475 Range objects represent a part of a vim buffer.  You can obtain them in a
    476 number of ways:
    477 - via vim.current.range (|python-current|)
    478 - from a buffer's range() method (|python-buffer|)
    479 
    480 A range object is almost identical in operation to a buffer object.  However,
    481 all operations are restricted to the lines within the range (this line range
    482 can, of course, change as a result of slice assignments, line deletions, or
    483 the range.append() method).
    484 
    485 The range object attributes are:
    486 r.start		Index of first line into the buffer
    487 r.end		Index of last line into the buffer
    488 
    489 The range object methods are:
    490 r.append(str)	Append a line to the range
    491 r.append(str, nr)  Idem, after line "nr"
    492 r.append(list)	Append a list of lines to the range
    493 		Note that the option of supplying a list of strings to
    494 		the append method differs from the equivalent method
    495 		for Python's built-in list objects.
    496 r.append(list, nr)  Idem, after line "nr"
    497 
    498 Range object type is available using "Range" attribute of vim module.
    499 
    500 Example (assume r is the current range):
    501 # Send all lines in a range to the default printer
    502 vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1))
    503 
    504 ==============================================================================
    505 Window objects						*python-window*
    506 
    507 Window objects represent vim windows.  You can obtain them in a number of
    508 ways:
    509 - via vim.current.window (|python-current|)
    510 - from indexing vim.windows (|python-windows|)
    511 - from indexing "windows" attribute of a tab page (|python-tabpage|)
    512 - from the "window" attribute of a tab page (|python-tabpage|)
    513 
    514 You can manipulate window objects only through their attributes.  They have no
    515 methods, and no sequence or other interface.
    516 
    517 Window attributes are:
    518 buffer (read-only)	The buffer displayed in this window
    519 cursor (read-write)	The current cursor position in the window
    520 			This is a tuple, (row,col).
    521 height (read-write)	The window height, in rows
    522 width (read-write)	The window width, in columns
    523 vars (read-only)	The window |w:| variables. Attribute is
    524 			unassignable, but you can change window
    525 			variables this way
    526 options (read-only)	The window-local options. Attribute is
    527 			unassignable, but you can change window
    528 			options this way. Provides access only to
    529 			window-local options, for buffer-local use
    530 			|python-buffer| and for global ones use
    531 			|python-options|. If option is |global-local|
    532 			and local value is missing getting it will
    533 			return None.
    534 number (read-only)	Window number.  The first window has number 1.
    535 			This is zero in case it cannot be determined
    536 			(e.g. when the window object belongs to other
    537 			tab page).
    538 row, col (read-only)	On-screen window position in display cells.
    539 			First position is zero.
    540 tabpage (read-only)	Window tab page.
    541 valid (read-write)	True or False. Window object becomes invalid
    542 			when corresponding window is closed.
    543 
    544 The height attribute is writable only if the screen is split horizontally.
    545 The width attribute is writable only if the screen is split vertically.
    546 
    547 Window object type is available using "Window" attribute of vim module.
    548 
    549 ==============================================================================
    550 Tab page objects					*python-tabpage*
    551 
    552 Tab page objects represent vim tab pages. You can obtain them in a number of
    553 ways:
    554 - via vim.current.tabpage (|python-current|)
    555 - from indexing vim.tabpages (|python-tabpages|)
    556 
    557 You can use this object to access tab page windows. They have no methods and
    558 no sequence or other interfaces.
    559 
    560 Tab page attributes are:
    561 number		The tab page number like the one returned by
    562 		|tabpagenr()|.
    563 windows		Like |python-windows|, but for current tab page.
    564 vars		The tab page |t:| variables.
    565 window		Current tabpage window.
    566 valid		True or False. Tab page object becomes invalid when
    567 		corresponding tab page is closed.
    568 
    569 TabPage object type is available using "TabPage" attribute of vim module.
    570 
    571 ==============================================================================
    572 pyeval() and py3eval() Vim functions			*python-pyeval*
    573 
    574 To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
    575 functions to evaluate Python expressions and pass their values to Vim script.
    576 |pyxeval()| is also available.
    577 
    578 ==============================================================================
    579 Python 3						*python3*
    580 
    581 As Python 3 is the only supported version in Nvim, "python" is synonymous
    582 with "python3" in the current version. However, code that aims to support older
    583 versions of Nvim, as well as Vim, should prefer to use "python3" variants
    584 explicitly if Python 3 is required.
    585 
    586 						*:py3* *:python3*
    587 :[range]py3 {stmt}
    588 :[range]py3 << [trim] [{endmarker}]
    589 {script}
    590 {endmarker}
    591 
    592 :[range]python3 {stmt}
    593 :[range]python3 << [trim] [{endmarker}]
    594 {script}
    595 {endmarker}
    596 The `:py3` and `:python3` commands work similar to `:python`.  A
    597 simple check if the `:py3` command is working: >vim
    598 	:py3 print("Hello")
    599 <
    600 To see what version of Python you have: >vim
    601 	:py3 import sys
    602 	:py3 print(sys.version)
    603 <							*:py3file*
    604 :[range]py3f[ile] {file}
    605 The `:py3file` command works similar to `:pyfile`.
    606 						*:py3do*
    607 :[range]py3do {body}
    608 The `:py3do` command works similar to `:pydo`.
    609 
    610 						*E880*
    611 Raising SystemExit exception in python isn't endorsed way to quit vim, use:
    612 >vim
    613 :py vim.command("qall!")
    614 <
    615 						*has-python*
    616 You can test if Python is available with: >vim
    617 if has('pythonx')
    618   echo 'there is Python'
    619 endif
    620 if has('python3')
    621   echo 'there is Python 3.x'
    622 endif
    623 
    624 Python 2 is no longer supported. Thus `has('python')` always returns
    625 zero for backwards compatibility reasons.
    626 
    627 ==============================================================================
    628 Python X						*python_x* *pythonx*
    629 
    630 The "pythonx" and "pyx" prefixes were introduced for python code which
    631 works with Python 2.6+ and Python 3. As Nvim only supports Python 3,
    632 all these commands are now synonymous to their "python3" equivalents.
    633 
    634 						*:pyx* *:pythonx*
    635 `:pyx` and `:pythonx` work the same as `:python3`.  To check if `:pyx` works: >vim
    636 :pyx print("Hello")
    637 
    638 To see what version of Python is being used: >vim
    639 :pyx import sys
    640 :pyx print(sys.version)
    641 <
    642 				*:pyxfile* *python_x-special-comments*
    643 `:pyxfile` works the same as `:py3file`.
    644 
    645 						*:pyxdo*
    646 `:pyxdo` works the same as `:py3do`.
    647 
    648 						*has-pythonx*
    649 To check if `pyx*` functions and commands are available: >vim
    650 if has('pythonx')
    651   echo 'pyx* commands are available. (Python ' .. &pyx .. ')'
    652 endif
    653 <
    654 
    655 vim:tw=78:ts=8:noet:ft=help:norl: