各行のpythonステートメントを実行する方法は?


10

Pythonステートメントを使用して現在の行を変更する次のサンプルコードがあります。

:py import vim; vim.current.line="["+vim.current.line+"]"

現在のファイルの各行に対してこのステートメントを実行するにはどうすればよいですか?

関連:VimでPythonをどのように使用できますか?スタックオーバーフロー時

回答:


10

pydoVim 7.4以降で使用できるコマンドを使用できます。マニュアルでは、コマンドが私よりもうまく機能する方法が説明されています。

:[範囲] pydo {body}

[範囲]の各行に対してPython関数 "def _vim_pydo(line、linenr):{body}"を実行します。関数の引数は、末尾の<EOL>なしで各行のテキストに順番に設定され、現在の行番号。関数は文字列またはNoneを返す必要があります。文字列が返された場合、それは現在のターンの行のテキストになります。[範囲]のデフォルトはファイル全体: "1、$"です。

たとえば、次のようなコマンドを使用できます。

:python import vim
:pydo vim.current.buffer[linenr - 1] = '[%s]' % line

linenr - 1行が原因ビットが存在するvim.current.buffer0のインデックスが付されているが、Vimは1から行をカウントし始めます。

すばらしいのは、カスタムコマンドを簡単に定義して、さまざまな行でPythonコードを実行できることです。

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line

1
vim 7.4以降で使用できます。
ケノーブ2015

7

現在のバッファvim.current.bufferは、反復可能であるを使用して取得できます。forループを使用して各行を取得できます。

それらに割り当てることにより、行を変更できます。まとめると、次のようになります。

:py from vim import *
:py for i, line in enumerate(current.buffer): current.buffer[i] = '[%s]' % line

もご覧ください:help python-buffer

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.