Up: 目次   [Index]


Python インターフェイス

*if_pyth.txt*   For Vim バージョン 8.1.  Last change: 2019 Jul 21


                  VIMリファレンスマニュアル    by Paul Moore

Vim の Python インターフェイス

1. コマンド|python-commands|
2. vim モジュール|python-vim|
3. バッファオブジェクト|python-buffer|
4. レンジオブジェクト|python-range|
5. ウィンドウオブジェクト|python-window|
6. タブページオブジェクト|python-tabpage|
7. vim.bindeval オブジェクト|python-bindeval-objects|
8. Vim 函數 pyeval() と py3eval()|python-pyeval|
9. 動的ローディング|python-dynamic|
10. Python 3|python3|
11. Python X|python_x|
12. Python 對應付きでビルドする|python-building|

Python 2.x インターフェイスは Vim が |+python| 機能付きでコンパイルされたときのみ利用できます。

Python 3 インターフェイスは Vim が |+python3| 機能付きでコンパイルされたときのみ利用できます。

兩方を同時に利用することはできますが、|python-2-and-3| をお讀みください。

1. コマンド

:[range]py[thon] {stmt}

Python のステートメント {stmt} を實行します。‘:python‘ コマンドが機能するか簡單にチェックするには:

:python print "Hello"
:[range]py[thon] << [endmarker]
{script}
{endmarker}

Python のスクリプト {script} を實行します。

Note:
このコマンドは Python 用の機能を含めてコンパイルされてゐないときは機能しません。エラーを抑制するには |script-here| を參照してください。

{script} 以降の {endmarker} の前に空白を置かないでください。

"<<" の後に [endmarker] を省略した時は |:append| や |:insert| のやうに ’.’ は {script} の後に使はれなければなりません。

この形の |:python| コマンドは Vim script に Python コードを埋め込むのに特に便利です。

例:

function! IcecreamInitialize()
python << EOF
class StrawberryIcecreame:
        def __call__(self):
                print 'EAT ME'
EOF
endfunction

使つてゐる Python のバージョンを見るには:

:python print(sys.version)

sys をインポートする必要はない。これはデフォルトで行はれる。

Note:
Python はインデントに關して非常に繊細です。"class" の行と "EOF" の行はまつたくインデントしないでください。

:[range]pydo {body}

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 を用ゐて範圍をフィルターするために、‘:py‘ と連動して ‘:pydo‘ を使ふことができます。例へば:

: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)
:[range]pyf[ile] {file}

{file} 內の Python スクリプトを實行します。引數はそのまま 1 つのファイル名として使はれます。

これら 2 つのコマンドは、本質的には同じことを行ひます - つまり、Python のコードを、與へられた "現在の範圍" |python-range| に對して實行します。

:python の場合には、實行されるコードはコマンドラインで與へられたものです。

:pyfile の場合には、實行されるコードは與へられたファイルの中身です。

Python のコマンドは |sandbox| の中では使へません。

引數を渡すためには明示的に sys.argv[] を使つて設定してください。例:

:python sys.argv = ["foo", "bar"]
:pyfile myscript.py

いくつか例を擧げます

:python from vim import *
:python from string import upper
:python current.line = upper(current.line)
:python print "Hello"
:python str = current.buffer[42]

Note:
變更 - importsなど - は、Python インタープリターと同樣に、次のコマンドに引き繼がれます。

2. vim モジュール

Python コードは、vim モジュールを通して、vim に自由にアクセスすることができます (ただひとつの例外を除いて - 以下の |python-output| を參照)。vim モジュールは 2 つのメソッド、3 つの定數、そして 1 つのエラーオブジェクトを實裝してゐます。これを使ふには vim モジュールを import する必要があります。

:python import vim

槪要

:py print "Hello"メッセージを表示
:py vim.command(cmd)ex コマンドを實行
:py w = vim.windows[n]ウィンドウ "n" を得る
:py cw = vim.current.window現在のウィンドウを得る
:py b = vim.buffers[n]バッファ "n" を得る
:py cb = vim.current.buffer現在のバッファを得る
:py w.height = linesウィンドウの高さを設定する
:py w.cursor = (row, col)ウィンドウのカーソル位置を設定する
:py pos = w.cursor(row, col) の組を得る
:py name = b.nameバッファのファイル名を得る
:py line = b[n]バッファから 1 行を得る
:py lines = b[n:m]バッファから一聯の行を得る
:py num = len(b)行數を得る
:py b[n] = strバッファ內の 1 行を設定する
:py b[n:m] = [str1, str2, str3]1 度に數行を設定する
:py del b[n]1 行を削除する
:py del b[n:m]數行を削除する

"vim" モジュールのメソッド

vim.command(str)

vim (ex モード) のコマンド str を實行します。戾り値はありません。

例:

:py vim.command("set tw=72")
:py vim.command("%s/aaa/bbb/g")

ノーマルモードのコマンドを實行するには、次の定義が使はれます:

def normal(str):
        vim.command("normal "+str)
# '...' は、二重引用符を含む文字列の境界に使はれることに注意
normal('"a2dd"aP')

":python" コマンドは、Python 2.2 かそれより古いものでは再歸的に使へません。Python 2.3 かそれより新しいものを使つてください。

:py vim.command("python print 'Hello again Python'")
vim.eval(str)

vim 內の式評價を使つて、式を評價します (|expression| を參照)。戾り値は、次の通り:

辭書とリストは再歸的に展開されます。

例:

:" 'textwidth' オプションの値
:py text_width = vim.eval("&tw")
:
:" 'a' レジスタの內容
:py a_reg = vim.eval("@a") 
:
:" 結果は文字列!數値に變換するために string.atoi() を使ひます。
:py str = vim.eval("12+12")
:
:py tagList = vim.eval('taglist("eval_expr")')

最後のコマンドは Python 辭書の Python リストを返します。

例:

[{'cmd': '/^eval_expr(arg, nextcmd)$/', 'static': 0, 'name':
'eval_expr', 'kind': 'f', 'filename': './src/eval.c'}]
vim.bindeval(str)

|python-eval| と似てゐますが、特殊なオブジェクトを返します (|python-bindeval-objects| 參照)。これを使ふと Vim のリスト (|List|) や辭書 (|Dictionary|) を變更したり、Vim の函數 (|Funcref|) を呼び出したりできます。

vim.strwidth(str)

|strwidth()| と同じ。str の畫面上の幅を數値で返す。タブ文字は 1 幅としてカウントされる。

vim.foreach_rtp(callable)

runtimepath’ の各パスについてコーラブル (callable) を呼び出す。コーラブルが None 以外の値を返すか、例外が發生するか、パスの最後まで處理が進むと停止する。コーラブルが None 以外の値を返して停止した場合は、vim.foreach_rtp 函數はその値を返す。

vim.chdir(*args, **kwargs)
vim.fchdir(*args, **kwargs)

os.chdir、os.fchdir を實行し、Vim にそのことを通知する。

Note:
これらの函數は直接は使用しない。代はりに os.chdir と os.fchdir を使ふ。os.fchdir が存在しない場合の vim.fchdir の動作は未定義。

"vim" モジュールのエラーオブジェクト

vim.error

vim のエラーに遭遇したとき、Python は型 vim.error の例外を發生させます。

例:

try:
        vim.command("put a")
except vim.error:
        # レジスタaが空

モジュール "vim" の定數

Note:
モジュール "vim" の定數は、實際には定數ではありません。よつて代入し直すことができます。しかし、それは馬鹿げたことです。その變數が參照してゐる vim オブジェクトへのアクセスができなくなつてしまふからです。

vim.buffers

一聯の vim バッファへのアクセスを提供するマッピングオブジェクト。次の操作がサポートされてゐます:

:py b = vim.buffers[i]インデックス化する (讀取り專用)
:py b in vim.buffersメンバかどうか調べる
:py n = len(vim.buffers)要素の個數
:py for b in vim.buffers:バッファリストのイテレート
vim.windows

一聯の vim ウィンドウへのアクセスを提供するシーケンスオブジェクト。このオブジェクトは次の操作をサポートしてゐます:

:py w = vim.windows[i]インデックス化する (讀取り專用)
:py w in vim.windowsメンバかどうか調べる
:py n = len(vim.windows)要素の個數
:py for w in vim.windows:シーケンシャルアクセス

None:
vim.windows オブジェクトは常に現在のタブページ內にアクセスします。|python-tabpage|.windows オブジェクトは親である |python-tabpage| オブジェクトに結びつけられて、常にそのタブページのウィンドウを參照します (タブページが削除されてゐたときは vim.error 例外が發生します)。vim モジュールや |python-tabpage| オブジェクトへの參照を維持しなくても、參照は保持されます。プロパティも失はれません。

vim.tabpages

Vim のタブページの一覽へのアクセスを提供するシーケンスオブジェクト。このオブジェクトは次の操作をサポートしてゐます:

:py t = vim.tabpages[i]インデックス化する (讀取り專用)
:py t in vim.tabpagesメンバかどうか調べる
:py n = len(vim.tabpages)要素の個數
:py for t in vim.tabpages:シーケンシャルアクセス
vim.current

vim 內で使へる樣々な "現在の" オブジェクトへの、(特定の屬性を通した) アクセスを提供するオブジェクト:

vim.current.line現在の行 (RW)String
vim.current.buffer現在のバッファ (RW)Buffer
vim.current.window現在のウィンドウ (RW)Window
vim.current.tabpage現在のタブページ (RW)TabPage
vim.current.range現在の行の範圍 (RO)Range

最後のものに關しては、若干の說明が必要でせう。:python, :pyfile コマンドで、範圍が指定された場合、この行の範圍は、"現在の範圍" として扱はれます。範圍はバッファに少し似てゐますが、全てのアクセスは行のサブセットに制限されます。詳細は |python-range| を參照してください。

Note:
vim.current.{buffer,window,tabpage} に値を代入するときはその値が有效なオブジェクト (|python-buffer|, |python-window|, |python-tabpage|) であることが期待されます。

値を代入するとバッファ、ウィンドウ、またはタブページの切り替へが起こります (|autocommand| も實行される)。これが唯一 python で UI オブジェクトを切り替へる方法です。

|python-tabpage|.window 屬性に代入することはできません。自動コマンドを發行させずに切り替へるには次のやうにします:

py << EOF
saved_eventignore = vim.options['eventignore']
vim.options['eventignore'] = 'all'
try:
    vim.current.buffer = vim.buffers[2] # バッファ 2 へ切り替へ
finally:
    vim.options['eventignore'] = saved_eventignore
EOF
vim.vars
vim.vvars

辭書に似たオブジェクトで、グローバル變數 (|g:|) と Vim 變數 (|v:|) への參照です。‘vim.bindeval("g:")‘ と同じですが、こちらの方が速いです。

vim.options

グローバルオプションへの讀み書きアクセスを提供するマップオブジェクト (値の取得と設定のみ對應)。

Note:
|:set| と違ひ、グローバルオプションへのアクセスのみ提供します。このオブジェクトを使つてローカルオプションの値を讀み書きすることはできません。

指定した名前のグローバルオプションが存在しない場合は KeyError 例外が發生します (例へば |global-local| オプションやグローバルオプションへのアクセスでは KeyError は發生しませんが、ウィンドウオプションやバッファオプションへのアクセスでは例外が發生します)。

バッファオプションへのアクセスには |python-buffer| オブジェクトを使ひます。ウィンドウオプションへのアクセスには |python-window| オブジェクトを使ひます。

このオブジェクトの型は vim モジュールの "Options" 屬性で取得できます。

Pythonからの出力

Python コードからの全ての出力は、Vim のメッセージエリアに表示されます。標準出力はインフォメーションメッセージとして、エラー出力はエラーメッセージとして表示されます。

實裝のレベルでいふと、sys.stdout (print ステートメントによる出力も含む) に向けられる全ての出力が、インフォメーションメッセージとして vim に表示され、sys.stderr (エラートレースバックを含む) に向けられる全ての出力が、エラーメッセージとして vim に表示されてゐます。

入力 (sys.stdin を通した入力、input(), raw_input() を含む) はサポートされず、プログラムをクラッシュさせる可能性があります。これはたぶん修正されるべき問題です。

Python における ’runtimepath’ の處理

Python では、’runtimepath’ のパスのリストを使ふ代はりに、vim.VIM_SPECIAL_PATH といふ特別なディレクトリが使はれます。このディレクトリが sys.path 內で使はれるとき、そして vim.path_hooks が sys.path_hooks 內で使はれるとき、’runtimepath’ の各パス {rtp} に對して {rtp}/python2 (or 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

Vim のパスフックに關聯付けられた文字列定數。Vim によつて設定されたパスフックが vim.VIM_SPECIAL_PATH 定數以外のパスに對して呼び出された場合は ImportError が發生します。さうでなければ特殊ローダが使用されます。

Note:
この定數の値を直接使用しないこと。常に vim.VIM_SPECIAL_PATH オブジェクトを使用してください。

vim.find_module(...)
vim.path_hook(path)

上述のパスフックの實裝に使はれるメソッドとオブジェクト。sys.meta_path で vim.path_hook を使つて何かをするやうなことがなければ、これらを直接使用することはないでせう。これらのオブジェクトが Vim の將來のバージョンでも存在するかどうかは保證されません。

vim._get_paths

パスフックで檢索されるパスのリストを返すメソッド。將來のバージョンのことを考へるならこのメソッドに依存すべきではありません。デバッグなどに使ひます。

runtimepath’ の各パスに對して {rtp}/python2 (or {rtp}/python3) と {rtp}/pythonx ディレクトリのリストを返します。

3. バッファオブジェクト

バッファオブジェクトは、vim のバッファを表します。バッファオブジェクトを取得するはいくつかの方法があります:

バッファオブジェクトは 2 つの讀み取り專用屬性を持つてゐます。name はバッファのフルファイル名です。number はバッファ番號です。バッファオブジェクトは 3 つのメソッドを持つてゐます (append, mark, range 以下參照)。

バッファオブジェクトは、シーケンスオブジェクトとして扱ふこともできます。この文脈では、バッファオブジェクトは文字列のリスト (さう、これは mutable です) のやうに振舞ひます。

各要素はバッファの行です。有用なシーケンス操作の全て、つまり、インデックス操作、インデックスによる代入、スライシング、スライスへの代入が期待通りに機能します。

Note:
バッファのインデックス操作 (スライシング) の結果は、文字列 (文字列のリスト) であることを注意しておきます。これはひとつの例外的な結果をもたらします - b[:] は b とは異なるのです。特に、"b[:] = None" はバッファの全てを削除するが、"b = None" は變數 b を更新するだけで、バッファには何の影響も與へません。

バッファのインデックスは、Python では普通はゼロから始まります。これは、1 から始まる vim の行番號と異なります。これは、特に vim の行番號を使ふ marks (以下を參照) を扱ふ際に問題となります。

バッファオブジェクトの屬性は次の通りです:

b.varsバッファ變數 (|buffer-variable|) にアクセスするための辭書オブジェクト。
b.optionsバッファオプションにアクセスするためのマップオブジェクト (値の取得、設定、削除をサポート)。ウィンドウオプションへのアクセスは |python-window|.options を使つてください。ウィンドウオプションに對しては KeyError 例外が發生します。グローバルの値とローカルの値を兩方持つオプション (|global-local|) で、ローカルの値がない場合は None が返ります。
b.name文字列。讀み書き可。バッファ名 (フルパス)。

Note:
b.name に値を設定すると自動コマンドの |BufFilePre| と |BufFilePost| イベントが發生します。

b.numberバッファ番號。|python-buffers| のキーとして使へます。讀み込み專用。
b.validTrue または False。關聯バッファが破毀されるとバッファオブジェクトは無效となる。

バッファオブジェクトのメソッドは次の通りです:

b.append(str)バッファに行を追加
b.append(str, nr)バッファの "nr" 行目の下に行を追加。
b.append(list)バッファに一聯の行を追加

Note:
append メソッドに文字列のリストを與へるオプションは、Python 組込みのリストオブジェクトの等價なメソッドとは違ふことに注意してください

b.append(list, nr)バッファの "nr" 行目の下に一聯の行を追加
b.mark(name)名前付きマークの位置を示す(row,col)の組を返す (これは[]"<> marksでも得られる)
b.range(s,e)與へられたバッファの s 行目から e 行目 (s 行と e 行も含む |inclusive|) を示すレンジオブジェクト (|python-range| を參照) を返す

Note:
行を追加するときは、その行に改行文字 ’\n’ が含まれてはなりません。末尾の ’\n’ は許されますが、無視されます。そのため次のやうなことができます:

:py b.append(f.readlines())

バッファオブジェクトの型は vim モジュールの "Buffer" 屬性で取得できます。

例 (b は現在のバッファに割り當てられてゐるとします)

:py print b.nameバッファのファイル名を出力
:py b[0] = "hello!!!"先頭の行を置換
:py b[:] = None全てのバッファを削除
:py del b[:]全てのバッファを削除
:py b[0:0] = "add a line"先頭に行を追加
:py del b[2]行を削除 (3番目)
:py b.append("bottom")最後に行を追加
:py n = len(b)行數
:py (row,col) = b.mark(’a’)名前付きマーク
:py r = b.range(1,5)バッファの部分範圍
:py b.vars["foo"] = "bar"b:foo への代入
:py b.options["ff"] = "dos"ファイルフォーマット設定
:py del b.options["ar"]:set autoread< と同じ

4. レンジオブジェクト

レンジオブジェクトは、vim バッファの一部分を表します。レンジオブジェクトを取得するにはいくつかの方法があります:

レンジオブジェクトの操作は、バッファオブジェクトのそれとほとんど同じです。しかし、全ての操作は範圍內の行に制限されます (もちろん、行の範圍は部分の割當て、行の削除、あるいは range.append() メソッドによつて變更できます)。

レンジオブジェクトの屬性:

r.start選擇範圍でのバッファ內の最初の行。
r.end選擇範圍でのバッファ內の最後の行。

レンジオブジェクトのメソッド:

r.append(str)その範圍に行を追加する
r.append(str, nr)"nr" 行目の後に追加する
r.append(list)その範圍にリストで與へられた複數行を追加する

Note:
これは Python のリストオブジェクトに對する操作とは異なることに注意してください。

r.append(list, nr)"nr" 行目の後に追加する

Range オブジェクトの型は vim モジュールの "Range" 屬性で取得できます。

例 (r は現在の範圍であるとする):

# 既定のプリンタに範圍內の全ての行を送る
vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1))

5. ウィンドウオブジェクト

ウィンドウオブジェクトは、vim のウィンドウを表現します。ウィンドウオブジェクトを取得するには、いくつかの方法があります:

ウィンドウオブジェクトは、それらの屬性を通してのみ操作できます。これらはメソッドを持たず、シーケンスも他のインターフェイスもありません。

ウィンドウの屬性:

buffer (讀取り專用)そのウィンドウに表示されてゐるバッファ
cursor (讀み書き)そのウィンドウの現在のカーソルの位置これは (row,col) の組で表される
height (讀み書き)ウィンドウの高さ、行の數で
width (讀み書き)ウィンドウの幅、列の數で
vars (讀み專用)ウィンドウの |w:| 變數。この屬性自體には代入できないが、この屬性を使つてウィンドウ變數を變更できる。
options (讀み專用)ウィンドウオプション。この屬性自體には代入できないが、この屬性を使つてウィンドウオプションを變更できる。ウィンドウオプションのみアクセス可能。バッファオプションは |python-buffer| で、グローバルオプションは |python-options| でアクセスする。オプションがグローバルの値とローカルの値を兩方持つオプション (|global-local|) で、ローカルの値がない場合は None が返ります。
number (讀み專用)ウィンドウ番號。1 つ目のウィンドウの番號は 1 です。番號が不明な場合は 0 が返ります (例へば、他のタブページに關聯付けられたウィンドウオブジェクトである場合)。
row, col (讀み專用)スクリーン上でのウィンドウの表示位置。値は 0 から始まります。
tabpage (讀み專用)ウィンドウのタブページ。
valid (read-write)True または False。關聯ウィンドウが閉ぢられるとウィンドウオブジェクトは無效になる。

height はスクリーンが水平方向に分割されてゐるときのみ書き込み可能です。

width はスクリーンが垂直方向に分割されてゐるときのみ書き込み可能です。

Window オブジェクトの型は vim モジュールの "Window" 屬性で取得できます。

6. タブページオブジェクト

タブページオブジェクトは、vim のタブページを表現します。タブページオブジェクトを取得するにはいくつかの方法があります:

このオブジェクトを使つてタブページウィンドウにアクセスすることができます。これらはメソッドを持たず、シーケンスも他のインターフェイスもありません。

タブページの屬性:

number|tabpagenr()| が返すやうなタブページ番號。
windows|python-windows| と同樣だが、現在のタブページ用。
varsタブページの |t:| 變數。
window現在のタブページウィンドウ。
validTrue または False。タブページオブジェクトは、關聯するタブページがクローズされると無效になる。

タブページオブジェクトの型は vim モジュールの "TabPage" 屬性で取得できます。

7. vim.bindeval オブジェクト

vim.Dictionary オブジェクト

Vim の辭書 (|Dictionary|) にアクセスするための辭書系オブジェクト。

屬性:

locked

次の値のどれか

說明
ゼロ變數はロックされてゐない
vim.VAR_LOCKED變數はロックされてゐる。ロック解除可能
vim.VAR_FIXED變數はロックされてゐる。ロック解除不可能

讀み書き可。‘True‘ か ‘False‘ を代入することでロックを變更できる。再歸的なロックはサポートされてゐない。

scope

次の値のどれか

說明
ゼロ辭書はスコープ辭書ではない
vim.VAR_DEF_SCOPE辭書は |g:| か |l:| である。
vim.VAR_SCOPE他のスコープ變數 |internal-variables| 參照。

メソッド (Note: キーワード引數はサポートされてゐない):

メソッド說明
keys()辭書のキーのリストを返す。
values()辭書の値のリストを返す。
items()辭書の內容を 2 値タプルのリストで返す。
update(iterable), update(dictionary), update(**kwargs)辭書にキーを追加する。
get(key[, default=None])辭書からキーの値を取得する。キーが存在しない場合は default が返る。
pop(key[, default])辭書からキーを取り除き、その値を返す。キーが存在しない場合は、default が指定されてゐたらその値を返す。指定されてゐなければ KeyError 例外が發生する。
popitem()辭書からランダムにキーを取り除き (key, value) のペアを返す。
has_key(key)辭書がキーを持つてゐるかを確認する。‘key in dict‘ と同じ。
__new__(), __new__(iterable), __new__(dictionary), __new__(update)‘vim.Dictionary()‘ を使つて vim の辭書を作成できる。‘d=vim.Dictionary(arg)‘ は ‘d=vim.bindeval(’{}’);d.update(arg)‘ と同じ。引數がない場合は空の辭書が作成される。

例:

d = vim.Dictionary(food="bar")コンストラクタ
d[’a’] = ’b’アイテム代入
print d[’a’]アイテム取得
d.update({’c’: ’d’}).update(dictionary)
d.update(e=’f’).update(**kwargs)
d.update(((’g’, ’h’), (’i’, ’j’))).update(iterable)
for key in d.keys():.keys()
for val in d.values():.values()
for key, val in d.items():.items()
print isinstance(d, vim.Dictionary)True
for key in d:キーのイテレーション
class Dict(vim.Dictionary):サブクラス化

Note:
キーをイテレーションしてゐる最中に辭書を變更してはいけない。

vim.List オブジェクト

Vim のリスト (|List|) にアクセスするためのシーケンス系オブジェクト。‘.locked‘ 屬性をサポートしてゐる (|python-.locked| 參照)。さらに以下のメソッドをサポートしてゐる:

メソッド說明
extend(item)リストにアイテムを追加する。
__new__(), __new__(iterable)‘vim.List()‘ を使つて vim のリストを作成できる。‘l=vim.List(iterable)‘ は ‘l=vim.bindeval(’[]’);l.extend(iterable)‘ と同じ。引數がない場合は空のリストが作成される。

例:

l = vim.List("abc")コンストラクタ。結果: [’a’, ’b’, ’c’]
l.extend([’abc’, ’def’]).extend() メソッド
print l[1:]スライス
l[:0] = [’ghi’, ’jkl’]スライス代入
print l[0]アイテム取得
l[0] = ’mno’代入
for i in l:イテレーション
print isinstance(l, vim.List)True
class List(vim.List):サブクラス化

vim.Function オブジェクト

Vim の函數參照 (|Funcref|) と似た動作をする函數系オブジェクト。特別な引數として ‘self‘ を指定できる (|Dictionary-function| 參照)。‘vim.Function(name)‘ を使つて作成することもできる。これは ‘vim.bindeval(’function(%s)’%json.dumps(name))‘ と同じ。

屬性 (讀み取り專用):

屬性名說明
name函數名
args‘None‘ または引數を示す |python-List| オブジェクト。これはこの屬性をリクエストするたびに作られる引數のコピーであることに注意してください。このリストに對する變更は無視されます。(ただし引數リスト內のコンテナについては無視されません。これは |deepcopy()| ではなく |copy()| と同樣です)
self‘None‘ または自身の辭書である |python-Dictionary| オブジェクト。呼び出し時に明示的な ‘self‘ キーワードが使はれた場合には、渡されるオブジェクトでこの屬性はオーバーライドされます。
auto_rebindブール値。Python のオブジェクトから作られ Vim script の辭書に格納された部分適用が、その辭書が參照された際に自動的に再バインドされる場合に ‘True‘ となります。Vim script で說明すると ‘dict.func‘ (auto_rebind=True) と‘function(dict.func,dict)‘ (auto_rebind=False) の違ひになります。‘self‘ 屬性の値が ‘None‘ の場合には、この屬性値には意味がありません。

コンストラクタは、加へて ‘args‘, ‘self‘ そして ‘auto_rebind‘ キーワードを受け付けます。‘args‘ と ‘self‘ どちらか一方、もしくは兩方が與へられた場合には、部分適用が生成されます。詳しくは |function()| を參照してください。‘auto_rebind‘ は ‘self‘ だけが與へられた場合にのみ使はれます。さうでない場合には、それが與へられたかどうかにかかはらず ‘True‘ であると見做されます。‘self‘ が與へられた場合には、そのデフォルト値は ‘False‘ です。

例:

f = vim.Function('tr')                  # コンストラクタ
print f('abc', 'a', 'b')                # tr('abc', 'a', 'b') 呼び出し
vim.command('''
    function DictFun() dict
        return self
    endfunction
''')
f = vim.bindeval('function("DictFun")')
print f(self={})                        # call('DictFun', [],{})と同じ
print isinstance(f, vim.Function)       # True

p = vim.Function('DictFun', self={})
print f()
p = vim.Function('tr', args=['abc', 'a'])
print f('b')

8. Vim 函數 pyeval() と py3eval()

雙方向インターフェイスを容易にするため、|pyeval()| 函數と |py3eval()| 函數を使つて Python の式を評價して、その値を Vim script に渡すことができます。|pyxeval()| も使用可能です。

Python での "None" は v:none に變換されます。

9. 動的ローディング

MS-Windows と UNIX では Python ライブラリを動的に讀み込むことが可能です。これを行ふと |:version| の出力に |+python/dyn| もしくは |+python3/dyn| が含まれるやうになります。

この場合、Vim は必要なときだけ Python の DLL ファイル、もしくは共有ライブラリファイルを檢索します。Python インターフェイスを使はないときは DLL を必要としないので、DLL なしで Vim を使ふことができます。

MS-Windows

Windows で Python インターフェイスを使ふには、Python の DLL が檢索パス內に存在しなければなりません。コンソールウィンドウで "path" とタイプすると、どのディレクトリが檢索パスとなるか表示することができます。また ’pythondll’ か ’pythonthreedll’ オプションを Python の DLL を指定するのに使ふこともできます。

DLL の名前は Vim をコンパイルした時の Python のバージョンに一致しなければなりません。現在その名前は "python27.dll" です。これは Python 2.7 用です。これは ’pythondll’ の既定値です。Python 3 の場合は python36.dll (Python3.6) です。これを確かめるには、"gvim.exe" を開き、"python\d*.dll\c" を檢索してください。

Unix

pythondll’ と ’pythonthreedll’ オプションを、コンパイル時に DYNAMIC_PYTHON_DLL と DYNAMIC_PYTHON3_DLL で指定されてゐる Python の共有ライブラリのファイルの、代はりを指定するのに使へます。共有ライブラリのバージョンは Vim をコンパイルする時に用いた Python 2.x または Python 3 のバージョンと一致してゐなければなりません。

10. Python 3

|:py3| コマンドと |:python3| コマンドは |:python| と同樣に機能します。‘:py3‘ コマンドが機能するか簡單にチェックするには:

:py3 print("Hello")

使つてゐる Python のバージョンを見るには:

:py3 import sys
:py3 print(sys.version)

‘:py3file‘ コマンドは ‘:pyfile‘ と同樣に機能します。 ‘:py3do‘ コマンドは ‘:pydo‘ と同樣に機能します。

Vim のビルドは 4 種類あります (:version の出力):

  1. Python サポートなし (-python, -python3)
  2. Python 2 サポートのみ (+python or +python/dyn, -python3)
  3. Python 3 サポートのみ (-python, +python3 or +python3/dyn)
  4. Python 2 と 3 のサポート (+python/dyn, +python3/dyn)

特殊ケース 4 に付いてもう少し詳細に說明します:

Python 2 と Python 3 をサポートするにはそれらを動的ロードする必要があります。

Linux/Unix システムで動的ロード時にグローバルシンボルをインポートすると、2 番目にロードした Python が使はれたときにクラッシュが發生します。そのため、グローバルシンボルをロードして 1 つの Python バージョンだけを使ふか、グローバルシンボルをロードしないかのどちらかしかありません。後者は特定のライブラリ (シンボルが Vim から提供されてゐることを期待してゐるライブラリ) において Python の"import" が失敗するやうになります。

Vim のコンフィグスクリプトは、ある標準の Python ライブラリ (termios) に基づき、すべてのライブラリについて推測を行ひます。このライブラリを兩方の Python バージョンでインポートできるなら、兩方のバージョンを Vim の中で同時に利用できます。さうでない場合は、どちらか最初に使はれたもののみが利用可能になります。もう一方を使はうとすると E836 か E837 のエラーメッセージが表示されるでせう。

Vim の動作はコンフィグを實行したシステムに依存します。Python の兩方のバージョンが ‘--enable-shared’ 付きでビルドされてゐるなら、兩方のバージョンを同時に使用できます。ただし libPython にリンクしてゐないサードパーティライブラリに對してはまだ問題は解決しません。

これらの問題に對する對處療法:

  1. 問題のライブラリを libpython.so にリンクする形で再コンパイルする。
  2. Vim を再コンパイルして 1 つの Python バージョンのみ有效にする。
  3. コンフィグ實行後に auto/config.h の PY_NO_RTLD_GLOBAL の定義を削除する。これは Vim がクラッシュするやうになるでせう。

Python 內で SystemExit 例外を發生させても Vim は終了しない。次のやうにする:

:py vim.command("qall!")

どのバージョンの Python が利用可能になつてゐるかは次のコマンドで確認できます:

if has('python')
  echo 'there is Python 2.x'
endif
if has('python3')
  echo 'there is Python 3.x'
endif

Note:
Python の 2 と 3 の兩方が利用可能で、Python が動的ロードされるやうになつてゐる場合、この has() 呼び出しによつてそれらがロードされます。もし、同時にロードできるのがどちらか一方だけだつた場合、Python の 2 と 3 のどちらが利用できるか調べるだけで、もう一方は利用できなくなります。

この動的ライブラリのローディングを防ぐためには、單に Vim が Python をサポートした狀態でコンパイルされてゐるかどうかを確認します:

if has('python_compiled')
  echo 'compiled with Python 2.x support'
  if has('python_dynamic')
    echo 'Python 2.x dynamically loaded'
  endif
endif
if has('python3_compiled')
  echo 'compiled with Python 3.x support'
  if has('python3_dynamic')
    echo 'Python 3.x dynamically loaded'
  endif
endif

實行時ライブラリが見つからなかつた場合は Python の動的ローディングは失敗しますが、このコードは正しくロードされたかどうかを表示することにもなります。

11. Python X

多くの python コードは、python 2.6+ と python 3 の兩方で動くことができるやうに書けるため、pyx* 函數とコマンドが用意されました。それらは、Python 2 や 3 向けの變種とまつたく同じやうに動作しますが、’pyxversion’ 設定を用ゐて Python のバージョンを選擇できる點が異なります。

Python コマンドに Python 2 と 3 のどちらを使ひたいかに應じて、|.vimrc| の中で ’pyxversion’ を設定してください。もしこの設定を實行時に變更すると、プラグインの狀態 (例へば初期化など) が失はれる危險性があります。

モジュールを使用したい場合には、{rtp}/pythonx ディレクトリの中に置くことができます。|pythonx-directory| を參照してください。

:pyx‘ コマンドと ‘:pythonx‘ コマンドは ‘:python‘ と同樣に機能します。‘:pyx‘ コマンドが機能するか簡單にチェックするには:

:pyx print("Hello")

使つてゐる Python のバージョンを見るには:

:pyx import sys
:pyx print(sys.version)

:pyxfile‘ コマンドは ‘:pyfile‘ と同樣に機能します。しかし、Vim が ‘:pyfile‘ または ‘:py3file‘ を使ふやうに强制したい場合は以下のコメントのうち 1 つを追加することができます:

#!/any string/python2         " Shebang。ファイルの先頭でなければならない。
#!/any string/python3         " Shebang。ファイルの先頭でなければならない。
# requires python 2.x         " 最大行數は '@option{modelines}' に依存。
# requires python 3.x         " 最大行數は '@option{modelines}' に依存。

通常のモードラインとは異なり、ファイルの末尾はチェックされません。いづれのコメントも見つからない場合は、’pyxversion’ の設定が使はれます。 もし Vim が指定された Python のバージョンをサポートしない場合、靜かなメッセージが表示されます。それらを讀むには ‘:messages‘ を使用してください。

:pyxdo‘ コマンドは ‘:pydo‘ と同樣に機能します。

pyx* コマンドが使用できるかどうかを調べるには以下が使へます:

if has('pythonx')
  echo 'pyx* commands are available. (Python ' . &pyx . ')'
endif

|+python| または |+python3| のどちらか一方のみでコンパイルされてゐる場合は、has() は 1 を返します。

|+python| と |+python3| の兩方でコンパイルされてゐる場合は、テストは ’pyxversion’ の設定に依存します。

もし ’pyxversion’ が 0 ならば最初に Python 3 がテストされ、使用可能でなければ Python 2 がテストされます。

もし ’pyxversion’ が 2 または 3 であれば、Python 2 または 3 のそれぞれどちらか一方のみをテストします。

Note:
‘has(’pythonx’)‘ が動作するために、Python 3 または 2 を動的にロードしようとすることがある點に注意してください。これは特に Vim が 2 つのうち 1 つしかロードできない場合に副作用があります。

もしもユーザーが Python 2 を優先し、Python 3 にフォールバックしたい場合は、|.vimrc| で ’pyxversion’ を明示的に設定する必要があります。例:

if has('python')
  set pyx=2
elseif has('python3')
  set pyx=3
endif

12. Python 對應付きでビルドする

Python 2 または 3 對應付きでビルドするためのいくつかのヒントがあります。

UNIX

Python インターフェイスを有效にする方法は src/Makefile を參照してください。

Ubuntu では Python 2 用にこれらのパッケージをインストールする必要があるでせう:

python
python-dev

Python 3 用は:

python3
python3-dev

Python 3.6 用は:

python3.6
python3.6-dev

もしも複數のバージョンの Python 3 がある場合は、configure を實行する前に python3 を望みのバージョンにリンクする必要があります。


Up: 目次   [Index]