If_pyth

Nvim の :help ページ。 生成された ソースは こちら で、 tree-sitter-vimdoc パーサーを使用して生成されています。


NVim の Python インターフェース python Python
詳細は provider-python を参照してください。

コマンド python-commands

:python :py E263 E264 E887 :[range]py[thon] {stmt} Python ステートメント {stmt} を実行します。:pythonコマンドが機能しているかどうかの簡単な確認です。
:python print("Hello")
:[range]py[thon] << [trim] [{endmarker}] {script} {endmarker} Python スクリプト {script} を実行します。Vim スクリプトに Python コードを含めるのに役立ちます。Python が必要です。 script-here を参照してください。
<< の後に [endmarker] が省略されている場合、{script} の後にピリオド '.' を使用する必要があります。これは :append コマンドや :insert コマンドと同様です。詳細は :let-heredoc を参照してください。
function! IcecreamInitialize()
python << EOF
class StrawberryIcecream:
        def __call__(self):
                print('EAT ME')
EOF
endfunction
使用している Python のバージョンを確認するには
:python print(sys.version)
"import sys" はデフォルトで実行されるため、必要ありません。
python-environment
Vim で設定された環境変数は、常に Python で使用できるとは限りません。これは、Vim と Python のビルド方法によって異なります。 https://docs.python.org/3/library/os.html#os.environ も参照してください。
注意: Python はインデントに非常に敏感です。"class" 行と "EOF" にはインデントを入れないでください。
:pydo
:[range]pydo {body} [range]内の各行に対してPython関数 "def _vim_pydo(line, linenr): {body}" を実行します。関数の引数は、末尾の<EOL>のない各行のテキストと現在の行番号に設定されます。関数は文字列またはNoneを返す必要があります。文字列が返された場合、それは現在の回の行のテキストになります。[range]のデフォルトはファイル全体です:"1,$"。
:pydo return "%s\t%d" % (line[::-1], len(line))
:pydo if line: return "%4d: %s" % (linenr, line)
Pythonを使用して範囲をフィルタリングするために、:pydo:pyと組み合わせて使用​​できます。例:
:py3 << EOF
needle = vim.eval('@a')
replacement = vim.eval('@b')
def py_vim_string_replace(str):
        return str.replace(needle, replacement)
EOF
:'<,'>py3do return py_vim_string_replace(line)
:pyfile :pyf :[range]pyf[ile] {file} {file}内のPythonスクリプトを実行します。引数はすべて単一のファイル名として使用されます。
これらのコマンドはどちらも基本的に同じことを行います。つまり、指定された行範囲に「現在の範囲」python-range を設定して、Pythonコードを実行します。
:python の場合は、実行するコードがコマンドラインにあり、:pyfile の場合は、実行するコードが指定されたファイルの内容です。
Pythonコマンドは sandbox では使用できません。
引数を渡すには、sys.argv[] を明示的に設定する必要があります。例:
:python sys.argv = ["foo", "bar"]
:pyfile myscript.py
いくつかの例を以下に示します python-examples
:python from vim import *
:python current.line = str.upper(current.line)
:python print("Hello")
:python str = current.buffer[42]
("import"文など)の変更は、Python REPLと同様に、次のコマンドまで保持されます。
script-here
スクリプト言語をインラインで使用する場合、言語がサポートされていない場合はスキップできます。
if has('python')
  python << EOF
    print("python works")
EOF
endif
"EOF" は、先行する空白文字のない行の先頭に配置する必要があります。

vim モジュール python-vim

Python コードは、(1 つの例外を除き - 以下の python-output を参照) "vim" モジュールを介して vim にアクセスします。vim モジュールは 2 つのメソッド、3 つの定数、1 つのエラーオブジェクトを実装します。使用する前に vim モジュールをインポートする必要があります。
:python import vim
概要
:py print("Hello")                # displays a message
:py vim.command(cmd)                # execute an Ex command
:py w = vim.windows[n]                # gets window "n"
:py cw = vim.current.window        # gets the current window
:py b = vim.buffers[n]                # gets buffer "n"
:py cb = vim.current.buffer        # gets the current buffer
:py w.height = lines                # sets the window height
:py w.cursor = (row, col)        # sets the window cursor position
:py pos = w.cursor                # gets a tuple (row, col)
:py name = b.name                # gets the buffer file name
:py line = b[n]                        # gets a line from the buffer
:py lines = b[n:m]                # gets a list of lines
:py num = len(b)                # gets the number of lines
:py b[n] = str                        # sets a line in the buffer
:py b[n:m] = [str1, str2, str3]        # sets a number of lines at once
:py del b[n]                        # deletes a line
:py del b[n:m]                        # deletes a number of lines
"vim" モジュールのメソッド
vim.command(str) python-command
vim (ex モード)コマンド str を実行します。None を返します。例:
:py vim.command("set tw=72")
:py vim.command("%s/aaa/bbb/g")
次の定義はノーマルモードコマンドを実行します。
def normal(str):
        vim.command("normal "+str)
# Note the use of single quotes to delimit a string containing
# double quotes
normal('"a2dd"aP')
vim.eval(str) python-eval
vim 組み込み式評価器を使用して式 str を評価します ( expression を参照)。式の結果を次のように返します。
Vim 式が文字列または数値に評価される場合、文字列として
Vim 式が Vim リストに評価される場合、リストとして
Vim 式が Vim ディクショナリに評価される場合、ディクショナリとして ディクショナリとリストは再帰的に展開されます。例:
:py text_width = vim.eval("&tw")
:py str = vim.eval("12+12")                # NB result is a string! Use
                                    # int() to convert to a
                                    # number.
vim.strwidth(str) python-strwidth
strwidth() と同様です。str が占める表示セルの数を返します。タブは 1 セルとしてカウントされます。
vim.foreach_rtp(callable) python-foreach_rtp
'runtimepath' の各パスに対して、callable が None 以外の何かを返すか、例外が発生するか、パスがなくなるまで、指定された callable を呼び出します。callable が None 以外を返した場合に停止すると、vim.foreach_rtp 関数は callable が返した値を返します。
vim.chdir(*args, **kwargs) python-chdir
vim.fchdir(*args, **kwargs) python-fchdir
os.chdir または os.fchdir を実行し、その後、すべての適切な vim の処理を行います。 注意: これらの関数を直接使用しないでください。代わりに os.chdir と os.fchdir を使用してください。os.fchdir が存在しない場合の vim.fchdir の動作は未定義です。
"vim" モジュールのエラーオブジェクト
vim.error python-error
Vim エラーが発生すると、Python は vim.error 型の例外を発生させます。例:
try:
        vim.command("put a")
except vim.error:
        # nothing in register a
"vim" モジュールの定数
これらは実際には定数ではありません。再代入できます。ただし、これはばかげたことです。変数が参照する vim オブジェクトへのアクセスを失うためです。
vim.buffers python-buffers
vim バッファのリストへのアクセスを提供するマッピングオブジェクト。このオブジェクトは次の操作をサポートします。
:py b = vim.buffers[i]        # Indexing (read-only)
:py b in vim.buffers        # Membership test
:py n = len(vim.buffers)        # Number of elements
:py for b in vim.buffers:        # Iterating over buffer list
vim.windows python-windows
vim ウィンドウのリストへのアクセスを提供するシーケンスオブジェクト。このオブジェクトは次の操作をサポートします。
:py w = vim.windows[i]        # Indexing (read-only)
:py w in vim.windows        # Membership test
:py n = len(vim.windows)        # Number of elements
:py for w in vim.windows:        # Sequential access
注意: vim.windows オブジェクトは常に現在のタブページにアクセスします。 python-tabpage.windows オブジェクトは親 python-tabpage オブジェクトにバインドされており、常にそのタブページのウィンドウを使用します (タブページが削除された場合は vim.error をスローします)。vim モジュールオブジェクトまたは python-tabpage への参照を保持しなくても、両方の参照を保持できます。この場合、プロパティは失われません。
vim.tabpages python-tabpages
vim タブページのリストへのアクセスを提供するシーケンスオブジェクト。このオブジェクトは次の操作をサポートします。
:py t = vim.tabpages[i]        # Indexing (read-only)
:py t in vim.tabpages        # Membership test
:py n = len(vim.tabpages)        # Number of elements
:py for t in vim.tabpages:        # Sequential access
vim.current python-current
vim で使用可能なさまざまな「現在の」オブジェクトへのアクセスを提供するオブジェクト (特定の属性を介して): vim.current.line 現在の行 (RW) 文字列 vim.current.buffer 現在のバッファ (RW) バッファ vim.current.window 現在のウィンドウ (RW) ウィンドウ vim.current.tabpage 現在のタブページ (RW) タブページ vim.current.range 現在の行範囲 (RO) 範囲
最後のケースについては、少し説明が必要です。:python または :pyfile コマンドで範囲を指定すると、この範囲の行が「現在の範囲」になります。範囲はバッファに似ていますが、行のサブセットへのアクセスのみが制限されています。詳細については、python-range を参照してください。
注意: vim.current.{buffer,window,tabpage} に代入する場合、それぞれ有効な python-bufferpython-window、または python-tabpage オブジェクトが必要です。代入すると、( autocommand を使用して) 指定されたバッファ、ウィンドウ、またはタブページへの通常の切り替えがトリガーされます。これは Python で UI オブジェクトを切り替える唯一の方法です。python-tabpage.window 属性には代入できません。autocommand をトリガーせずに切り替えるには、次を使用します。
py << EOF
saved_eventignore = vim.options['eventignore']
vim.options['eventignore'] = 'all'
try:
    vim.current.buffer = vim.buffers[2] # Switch to buffer 2
finally:
    vim.options['eventignore'] = saved_eventignore
EOF
vim.vars python-vars
vim.vvars python-vvars
それぞれグローバル (g:) および vim (v:) 変数を含むディクショナリを保持するディクショナリのようなオブジェクト。
vim.options python-options
マッピングプロトコルを部分的にサポートするオブジェクト (アイテムの設定と取得をサポート) で、グローバルオプションへの読み書きアクセスを提供します。 注意: :set とは異なり、グローバルオプションのみにアクセスできます。このオブジェクトを使用してローカルオプションの値を取得または設定したり、ローカルのみのオプションにアクセスすることはできません。グローバルオプション名が存在しない場合、KeyError を発生させます ( global-local オプションとグローバルのみのオプションの場合は KeyError を発生させませんが、ウィンドウとバッファのローカルオプションの場合は発生させます)。バッファローカルオプションにアクセスするには python-buffer オブジェクトを、ウィンドウローカルオプションにアクセスするには python-window オブジェクトを使用します。
このオブジェクトの型は、vim モジュールの "Options" 属性を介して使用できます。
Python からの出力 python-output
Vim はすべての Python コード出力を Vim メッセージ領域に表示します。通常の出力は情報メッセージとして表示され、エラー出力はエラーメッセージとして表示されます。
実装の観点から言うと、sys.stdout へのすべての出力 (print 文からの出力を含む) は情報メッセージとして表示され、sys.stderr へのすべての出力 (エラーのトレースバックを含む) はエラーメッセージとして表示されます。
python-input
入力 (sys.stdin を介して、input() と raw_input() を含む) はサポートされておらず、プログラムのクラッシュを引き起こす可能性があります。これは修正する必要があります。
python では、vim.VIM_SPECIAL_PATH 特殊ディレクトリが 'runtimepath' に見つかったパスのリストの代わりに使用されます。このディレクトリが sys.path と sys.path_hooks の vim.path_hooks にあると、python は 'runtimepath' に見つかった各 {rtp} について {rtp}/python3 と {rtp}/pythonx からモジュールを読み込もうとします。
実装は次のものと似ていますが、C で記述されています。
from imp import find_module, load_module
import vim
import sys
class VimModuleLoader(object):
    def __init__(self, module):
        self.module = module
    def load_module(self, fullname, path=None):
        return self.module
def _find_module(fullname, oldtail, path):
    idx = oldtail.find('.')
    if idx > 0:
        name = oldtail[:idx]
        tail = oldtail[idx+1:]
        fmr = find_module(name, path)
        module = load_module(fullname[:-len(oldtail)] + name, *fmr)
        return _find_module(fullname, tail, module.__path__)
    else:
        fmr = find_module(fullname, path)
        return load_module(fullname, *fmr)
# It uses vim module itself in place of VimPathFinder class: it does not
# matter for python which object has find_module function attached to as
# an attribute.
class VimPathFinder(object):
    @classmethod
    def find_module(cls, fullname, path=None):
        try:
            return VimModuleLoader(_find_module(fullname, fullname, path or vim._get_paths()))
        except ImportError:
            return None
    @classmethod
    def load_module(cls, fullname, path=None):
        return _find_module(fullname, fullname, path or vim._get_paths())
def hook(path):
    if path == vim.VIM_SPECIAL_PATH:
        return VimPathFinder
    else:
        raise ImportError
sys.path_hooks.append(hook)
vim.VIM_SPECIAL_PATH python-VIM_SPECIAL_PATH
vim パスフックと組み合わせて使用される文字列定数。vim によってインストールされたパスフックが vim.VIM_SPECIAL_PATH 定数に等しくないパスを処理するように要求された場合、ImportError を発生させます。その他の場合は、特別なローダーを使用します。
注意: この定数の値を直接使用しないでください。常に vim.VIM_SPECIAL_PATH オブジェクトを使用してください。
vim.find_module(...) python-find_module
vim.path_hook(path) python-path_hook
上記のようにパス読み込みを実装するために使用されるメソッドまたはオブジェクト。vim.path_hook を除いて、これらのいずれも直接使用しないでください (sys.meta_path で何かを行う必要がある場合)。将来の vim バージョンにこれらのオブジェクトが存在する保証はありません。
vim._get_paths python-_get_paths
パスフックによって検索されるパスのリストを返すメソッド。将来のバージョンにこのメソッドが存在するとは限らないため、このメソッドに依存しないでください。ただし、デバッグに使用できます。
'runtimepath' の各 {rtp} について、{rtp}/python3 と {rtp}/pythonx ディレクトリのリストを返します。

バッファオブジェクト python-buffer

バッファオブジェクトは vim バッファを表します。これらはいくつかの方法で取得できます。
vim.current.buffer を介して (python-current)
インデックス作成はvim.buffersから行います(python-buffers
ウィンドウの"buffer"属性からも行います(python-window
Bufferオブジェクトには、2つの読み取り専用の属性があります。nameはバッファのフルファイル名、numberはバッファ番号です。また、3つのメソッド(append、mark、range; 以下を参照)も持っています。
Bufferオブジェクトはシーケンスオブジェクトとしても扱うことができます。このコンテキストでは、各要素がバッファの1行である文字列のリスト(はい、変更可能です)のように動作します。インデックス作成、インデックス代入、スライス、スライス代入を含む、通常のシーケンス操作は期待通りに動作します。バッファのインデックス作成(スライス)の結果は、文字列(文字列のリスト)であることに注意してください。これには1つの珍しい結果があります - b[:] は b とは異なります。特に、「b[:] = None」はバッファ全体を削除しますが、「b = None」は単に変数 b を更新するだけで、バッファには影響しません。
バッファのインデックスはPythonの標準に従って0から始まります。これは、1から始まるvimの行番号とは異なります。これは、vimの行番号を使用するマーク(以下を参照)を扱う際に特に重要です。
Bufferオブジェクトの属性は以下のとおりです。b.vars バッファ変数にアクセスするために使用される辞書のようなオブジェクト。b.options バッファローカルオプションとグローバルローカルオプションのバッファローカル値へのアクセスを提供するマッピングオブジェクト(アイテムの取得、設定、削除をサポート)。オプションがウィンドウローカルの場合はpython-window.optionsを使用してください。このオブジェクトはKeyErrorを発生させます。オプションがグローバルローカルでローカル値が存在しない場合、取得するとNoneを返します。b.name 文字列、読み書き可能。バッファ名(フルパス)を含みます。注記: b.nameへの代入時にBufFilePreBufFilePostのautocommandが起動されます。b.number バッファ番号。python-buffersキーとして使用できます。読み取り専用。b.valid 真偽値。対応するバッファが消去されると、Bufferオブジェクトは無効になります。
Bufferオブジェクトのメソッドは以下のとおりです。b.append(str) バッファに1行追加する b.append(str, nr) 同様、"nr"行の下に b.append(list) バッファに複数の行を追加する。文字列のリストをappendメソッドに渡すオプションは、Pythonの組み込みリストオブジェクトの同等のメソッドとは異なることに注意してください。b.append(list, nr) 同様、"nr"行の下に b.mark(name) 名前付きマークの位置を表すタプル(行、列)を返す([]"<>"マークも取得可能) b.range(s,e) 指定されたバッファの行番号sとeの間の部分を表す範囲オブジェクトを返す(python-rangeを参照)。包含的
行を追加する際、改行文字'\n'を含んではいけません。末尾の'\n'は許可され無視されるため、以下のように行うことができます。
:py b.append(f.readlines())
Bufferオブジェクトの型は、vimモジュールの"Buffer"属性を使用して取得できます。
例(bは現在のバッファと仮定)
:py print(b.name)                # write the buffer file name
:py b[0] = "hello!!!"                # replace the top line
:py b[:] = None                        # delete the whole buffer
:py del b[:]                        # delete the whole buffer
:py b[0:0] = [ "a line" ]        # add a line at the top
:py del b[2]                        # delete a line (the third)
:py b.append("bottom")                # add a line at the bottom
: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
:py b.options["ff"] = "dos"        # set fileformat
:py del b.options["ar"]                # same as :set autoread<

範囲オブジェクト python-range

範囲オブジェクトはvimバッファの一部を表します。いくつかの方法で取得できます。
vim.current.rangeから(python-current
バッファのrange()メソッドから(python-buffer
範囲オブジェクトは、Bufferオブジェクトとほぼ同じ操作を行います。ただし、すべての操作は範囲内の行に制限されます(この行範囲は、スライス代入、行削除、またはrange.append()メソッドの結果として変更される可能性があります)。
範囲オブジェクトの属性は以下のとおりです。r.start バッファ内の最初の行のインデックス r.end バッファ内の最後の行のインデックス
範囲オブジェクトのメソッドは以下のとおりです。r.append(str) 範囲に1行追加する r.append(str, nr) 同様、"nr"行の後 r.append(list) 範囲に複数の行を追加する。文字列のリストをappendメソッドに渡すオプションは、Pythonの組み込みリストオブジェクトの同等のメソッドとは異なることに注意してください。r.append(list, nr) 同様、"nr"行の後
範囲オブジェクトの型は、vimモジュールの"Range"属性を使用して取得できます。
例(rは現在の範囲と仮定):# 範囲内のすべての行をデフォルトのプリンターに送信する vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1))

ウィンドウオブジェクト python-window

ウィンドウオブジェクトはvimのウィンドウを表します。いくつかの方法で取得できます。
vim.current.windowから(python-current
vim.windowsのインデックスから(python-windows
タブページの"windows"属性のインデックスから(python-tabpage
タブページの"window"属性から(python-tabpage
ウィンドウオブジェクトは、その属性を通してのみ操作できます。メソッド、シーケンス、その他のインターフェースはありません。
ウィンドウ属性は以下のとおりです。buffer (読み取り専用) このウィンドウに表示されているバッファ cursor (読み書き可能) ウィンドウ内の現在のカーソル位置。これはタプル(行、列)です。 height (読み書き可能) ウィンドウの高さ(行数) width (読み書き可能) ウィンドウの幅(列数) vars (読み取り専用) ウィンドウのw:変数。属性は代入できませんが、このようにしてウィンドウ変数を変更できます。 options (読み取り専用) ウィンドウローカルオプション。属性は代入できませんが、このようにしてウィンドウオプションを変更できます。ウィンドウローカルオプションのみにアクセスできます。バッファローカルの場合はpython-bufferを、グローバルの場合はpython-optionsを使用してください。オプションがグローバルローカルでローカル値が存在しない場合、取得するとNoneを返します。 number (読み取り専用) ウィンドウ番号。最初のウィンドウの番号は1です。ウィンドウオブジェクトが他のタブページに属する場合など、判別できない場合は0になります。 row, col (読み取り専用) ディスプレイセルにおける画面上のウィンドウの位置。最初の位置は0です。 tabpage (読み取り専用) ウィンドウのタブページ。 valid (読み書き可能) 真偽値。対応するウィンドウが閉じられると、Windowオブジェクトは無効になります。
height属性は、画面が水平方向に分割されている場合のみ書き込み可能です。width属性は、画面が垂直方向に分割されている場合のみ書き込み可能です。
Windowオブジェクトの型は、vimモジュールの"Window"属性を使用して取得できます。

タブページオブジェクト python-tabpage

タブページオブジェクトはvimのタブページを表します。いくつかの方法で取得できます。
vim.current.tabpageから(python-current
vim.tabpagesのインデックスから(python-tabpages
このオブジェクトを使用して、タブページのウィンドウにアクセスできます。メソッド、シーケンス、その他のインターフェースはありません。
タブページ属性は以下のとおりです。number tabpagenr()によって返されるものと同じタブページ番号。windows python-windowsに似ていますが、現在のタブページ用です。vars タブページのt:変数。window 現在のタブページウィンドウ。valid 真偽値。対応するタブページが閉じられると、TabPageオブジェクトは無効になります。
TabPageオブジェクトの型は、vimモジュールの"TabPage"属性を使用して取得できます。

pyeval()とpy3eval() Vim関数 python-pyeval

双方向インターフェースを容易にするために、pyeval()py3eval()関数を使用してPython式を評価し、その値をVimスクリプトに渡すことができます。pyxeval()も使用できます。

Python 3 python3

NvímではPython 3のみがサポートされているため、現在のバージョンでは"python"は"python3"と同義です。ただし、以前のバージョンのNvímとVimの両方をサポートすることを目的としたコードでは、Python 3が必要な場合は"python3"のバリアントを明示的に使用する方が望ましいです。
:py3 :python3 :[range]py3 {stmt} :[range]py3 << [trim] [{endmarker}] {script} {endmarker}
:[range]python3 {stmt} :[range]python3 << [trim] [{endmarker}] {script} {endmarker} :py3コマンドと:python3コマンドは:pythonコマンドと同様に動作します。:py3コマンドが動作しているかどうかを確認する簡単なチェック
:py3 print("Hello")
使用している Python のバージョンを確認するには
:py3 import sys
:py3 print(sys.version)
:py3file
:[range]py3f[ile] {file} :py3fileコマンドは:pyfileコマンドと同様に動作します。:py3do
:[range]py3do {body} :py3doコマンドは:pydoコマンドと同様に動作します。
E880
PythonでSystemExit例外を発生させることは、vimを終了する推奨されない方法です。以下を使用してください。
:py vim.command("qall!")
has-python
Pythonが使用可能かどうかをテストするには
if has('pythonx')
  echo 'there is Python'
endif
if has('python3')
  echo 'there is Python 3.x'
endif
Python 2はもはやサポートされていません。そのため、後方互換性のためにhas('python')は常に0を返します。

Python X python_x pythonx

"pythonx"と"pyx"プレフィックスは、Python 2.6+とPython 3で動作するPythonコードのために導入されました。NvímはPython 3のみをサポートするため、これらのコマンドはすべて"python3"と同義です。
:pyx :pythonx :pyx:pythonx:python3と同じように動作します。:pyxが動作しているかどうかを確認するには
:pyx print("Hello")
使用されているPythonのバージョンを確認するには
:pyx import sys
:pyx print(sys.version)
:pyxfile python_x-special-comments :pyxfile:py3fileと同じように動作します。
:pyxdo
:pyxdo:py3doと同じように動作します。
has-pythonx
pyx*関数とコマンドが使用可能かどうかを確認するには
if has('pythonx')
  echo 'pyx* commands are available. (Python ' .. &pyx .. ')'
endif
メイン
コマンドインデックス
クイックリファレンス