If_pyth
Nvim の :help
ページ。 生成された ソースは こちら で、 tree-sitter-vimdoc パーサーを使用して生成されています。
: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 を参照してください。
例
function! IcecreamInitialize()
python << EOF
class StrawberryIcecream:
def __call__(self):
print('EAT ME')
EOF
endfunction
使用している Python のバージョンを確認するには
:python print(sys.version)
"import sys" はデフォルトで実行されるため、必要ありません。
注意: 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 の場合は、実行するコードが指定されたファイルの内容です。
引数を渡すには、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" は、先行する空白文字のない行の先頭に配置する必要があります。
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-commandvim (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-evalvim 組み込み式評価器を使用して式 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-strwidthstrwidth() と同様です。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-fchdiros.chdir または os.fchdir を実行し、その後、すべての適切な vim の処理を行います。
注意: これらの関数を直接使用しないでください。代わりに os.chdir と os.fchdir を使用してください。os.fchdir が存在しない場合の vim.fchdir の動作は未定義です。
"vim" モジュールのエラーオブジェクト
vim.error
python-errorVim エラーが発生すると、Python は vim.error 型の例外を発生させます。例:
try:
vim.command("put a")
except vim.error:
# nothing in register a
"vim" モジュールの定数
これらは実際には定数ではありません。再代入できます。ただし、これはばかげたことです。変数が参照する vim オブジェクトへのアクセスを失うためです。
vim.buffers
python-buffersvim バッファのリストへのアクセスを提供するマッピングオブジェクト。このオブジェクトは次の操作をサポートします。
: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-windowsvim ウィンドウのリストへのアクセスを提供するシーケンスオブジェクト。このオブジェクトは次の操作をサポートします。
: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-tabpagesvim タブページのリストへのアクセスを提供するシーケンスオブジェクト。このオブジェクトは次の操作をサポートします。
: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-currentvim で使用可能なさまざまな「現在の」オブジェクトへのアクセスを提供するオブジェクト (特定の属性を介して): 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-buffer、
python-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.options
python-optionsマッピングプロトコルを部分的にサポートするオブジェクト (アイテムの設定と取得をサポート) で、グローバルオプションへの読み書きアクセスを提供します。
注意: :set とは異なり、グローバルオプションのみにアクセスできます。このオブジェクトを使用してローカルオプションの値を取得または設定したり、ローカルのみのオプションにアクセスすることはできません。グローバルオプション名が存在しない場合、KeyError を発生させます (
global-local オプションとグローバルのみのオプションの場合は KeyError を発生させませんが、ウィンドウとバッファのローカルオプションの場合は発生させます)。バッファローカルオプションにアクセスするには
python-buffer オブジェクトを、ウィンドウローカルオプションにアクセスするには
python-window オブジェクトを使用します。
このオブジェクトの型は、vim モジュールの "Options" 属性を介して使用できます。
Python からの出力
python-outputVim はすべての 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_PATHvim パスフックと組み合わせて使用される文字列定数。vim によってインストールされたパスフックが vim.VIM_SPECIAL_PATH 定数に等しくないパスを処理するように要求された場合、ImportError を発生させます。その他の場合は、特別なローダーを使用します。
注意: この定数の値を直接使用しないでください。常に vim.VIM_SPECIAL_PATH オブジェクトを使用してください。
vim.find_module(...)
python-find_modulevim.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 ディレクトリのリストを返します。
バッファオブジェクトは vim バッファを表します。これらはいくつかの方法で取得できます。
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への代入時に
BufFilePreと
BufFilePostの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<
範囲オブジェクトはvimバッファの一部を表します。いくつかの方法で取得できます。
範囲オブジェクトは、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))
ウィンドウオブジェクトはvimのウィンドウを表します。いくつかの方法で取得できます。
ウィンドウオブジェクトは、その属性を通してのみ操作できます。メソッド、シーケンス、その他のインターフェースはありません。
ウィンドウ属性は以下のとおりです。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"属性を使用して取得できます。
タブページオブジェクトはvimのタブページを表します。いくつかの方法で取得できます。
このオブジェクトを使用して、タブページのウィンドウにアクセスできます。メソッド、シーケンス、その他のインターフェースはありません。
タブページ属性は以下のとおりです。number
tabpagenr()によって返されるものと同じタブページ番号。windows
python-windowsに似ていますが、現在のタブページ用です。vars タブページの
t:変数。window 現在のタブページウィンドウ。valid 真偽値。対応するタブページが閉じられると、TabPageオブジェクトは無効になります。
TabPageオブジェクトの型は、vimモジュールの"TabPage"属性を使用して取得できます。
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を返します。
"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)
:pyxdo
:pyxdo
は
:py3do
と同じように動作します。
has-pythonx pyx*
関数とコマンドが使用可能かどうかを確認するには
if has('pythonx')
echo 'pyx* commands are available. (Python ' .. &pyx .. ')'
endif