วิธีรันคำสั่ง python สำหรับแต่ละบรรทัด?


11

ฉันเป็นตัวอย่างโค้ดต่อไปนี้ซึ่งแก้ไขบรรทัดปัจจุบันโดยใช้คำสั่ง Python:

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

ฉันจะใช้คำสั่งนี้สำหรับแต่ละบรรทัดในไฟล์ปัจจุบันได้อย่างไร

ที่เกี่ยวข้อง: คุณสามารถใช้ Python ใน Vim ได้อย่างไร? ที่ stackoverflow

คำตอบ:


10

คุณสามารถใช้pydoคำสั่งที่มีให้ตั้งแต่ Vim 7.4 คู่มืออธิบายวิธีการทำงานได้ดีกว่าที่ฉันทำได้:

: [ช่วง] pydo {body}

ใช้งานฟังก์ชั่น Python "def _vim_pydo (line, linenr): {body}" สำหรับแต่ละบรรทัดใน [range] โดยที่อาร์กิวเมนต์ของฟังก์ชันถูกตั้งค่าเป็นข้อความของแต่ละบรรทัดโดยไม่ต้องมี <EOL> และกระแส หมายเลขบรรทัด ฟังก์ชั่นควรกลับสตริงหรือไม่มี หากสตริงถูกส่งคืนมันจะกลายเป็นข้อความของบรรทัดในเทิร์นปัจจุบัน ค่าเริ่มต้นสำหรับ [ช่วง] คือไฟล์ทั้งหมด: "1, $"

สำหรับตัวอย่างของคุณคุณสามารถใช้คำสั่งเช่น:

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

linenr - 1บิตเป็นเพราะมีเส้นในvim.current.buffer0 การจัดทำดัชนี แต่เป็นกลุ่มเริ่มนับตั้งแต่วันที่ 1 สาย

สิ่งที่ดีคือคุณสามารถกำหนดคำสั่งที่กำหนดเองเพื่อเรียกใช้งานโค้ด Python ของคุณในช่วงของบรรทัดได้อย่างง่ายดาย:

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

1
มีให้ตั้งแต่ vim 7.4
kenorb

7

คุณสามารถรับบัฟเฟอร์ปัจจุบันด้วยvim.current.bufferซึ่งเป็น iterable; คุณสามารถใช้ใช้การ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.