Bagaimana cara menjalankan pernyataan python untuk setiap baris?

10

Saya memiliki kode sampel berikut yang mengubah baris saat ini menggunakan pernyataan Python:

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

Bagaimana saya bisa menjalankan pernyataan ini untuk setiap baris dalam file saat ini?

Terkait: Bagaimana Anda bisa menggunakan Python di Vim? di stackoverflow

kenorb
sumber

Jawaban:

10

Anda dapat menggunakan pydoperintah yang tersedia sejak Vim 7.4, manual yang menjelaskan cara kerjanya lebih baik daripada yang saya bisa:

: [range] pydo {body}

Jalankan fungsi Python "def _vim_pydo (line, linenr): {body}" untuk setiap baris dalam [range], dengan argumen fungsi diset ke teks dari setiap baris secara bergantian, tanpa <EOL> tertinggal, dan arus nomor baris. Fungsi harus mengembalikan string atau Tidak Ada. Jika string dikembalikan, itu menjadi teks dari baris pada giliran saat ini. Default untuk [range] adalah seluruh file: "1, $".

Sebagai contoh Anda, Anda dapat menggunakan perintah seperti:

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

The linenr - 1bit ada karena garis di vim.current.bufferadalah 0-diindeks tapi Vim mulai menghitung garis dari 1.

Yang menyenangkan adalah Anda dapat dengan mudah mendefinisikan perintah khusus untuk mengeksekusi kode Python Anda pada berbagai baris:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line
toro2k
sumber
1
Ini tersedia sejak vim 7.4.
kenorb
7

Anda bisa mendapatkan buffer saat ini vim.current.buffer, yang merupakan iterable; Anda dapat menggunakan forperulangan untuk mendapatkan setiap baris.

Anda dapat mengubah garis dengan menetapkannya; jadi dengan menggabungkan itu, kita mendapatkan:

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

Lihat juga :help python-buffer.

Martin Tournoij
sumber