Làm thế nào để thực thi câu lệnh python cho mỗi dòng?


10

Tôi đã có mã mẫu sau đây để sửa đổi dòng hiện tại bằng cách sử dụng câu lệnh Python:

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

Làm thế nào tôi có thể thực thi câu lệnh này cho mỗi dòng trong tệp hiện tại?

Liên quan: Làm thế nào bạn có thể sử dụng Python trong Vim? tại stackoverflow

Câu trả lời:


10

Bạn có thể sử dụng pydolệnh có sẵn kể từ Vim 7.4, hướng dẫn sử dụng mô tả cách thức hoạt động tốt hơn tôi có thể:

: [phạm vi] pydo {cơ thể}

Thực thi hàm Python "def _vim_pydo (line, linenr): {body}" cho từng dòng trong [phạm vi], với các đối số chức năng lần lượt được đặt thành văn bản của từng dòng, mà không có dấu <EOL> và hiện tại số dòng. Hàm sẽ trả về một chuỗi hoặc Không có. Nếu một chuỗi được trả về, nó sẽ trở thành văn bản của dòng trong lượt hiện tại. Mặc định cho [phạm vi] là toàn bộ tệp: "1, $".

Ví dụ của bạn, bạn có thể sử dụng một lệnh như:

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

Các linenr - 1bit là có vì dòng trong vim.current.buffer0-lập chỉ mục nhưng Vim bắt đầu đếm dòng từ 1.

Điều thú vị là bạn có thể dễ dàng xác định một lệnh tùy chỉnh để thực thi mã Python của mình trên một loạt các dòng:

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

1
Nó có sẵn từ vim 7.4.
kenorb 16/2/2015

7

Bạn có thể nhận được bộ đệm hiện tại với vim.current.buffer, đó là một lần lặp; bạn có thể sử dụng một forvòng lặp để có được mỗi dòng.

Bạn có thể thay đổi các dòng bằng cách gán cho chúng; để kết hợp chúng lại với nhau, chúng ta có được:

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

Cũng thấy :help python-buffer.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.