ฉันจะเรียกใช้ฟังก์ชั่นหรือมาโครข้ามโฟลเดอร์ของไฟล์ได้อย่างไร?


12

StripWhitespaceสมมติว่าผมมีฟังก์ชั่นการตั้งชื่อ

:StripWhitespaceฉันสามารถทำงานบนไฟล์เดียวโดยการเปิดไฟล์และทำงาน

ฉันจะเรียกใช้ฟังก์ชั่นนั้นกับโฟลเดอร์ของไฟล์โดยอัตโนมัติและบันทึกผลลัพธ์เมื่อฉันไปได้อย่างไร


3
รายละเอียดโปรด!
200_success

คำตอบ:


10

คุณสามารถใช้-cอาร์กิวเมนต์เพื่อเรียกใช้คำสั่งเมื่อเริ่มต้นจากvim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

ตัวอย่าง:

vim -c ':call StripWhitespace()' file1 file2

หากต้องการออกหลังจากนั้นให้เพิ่ม| :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2

1
คุณต้องการ: argdo, ถ้าคุณเรียกใช้งานไฟล์นี้สองสามไฟล์ใน commandline
Christian Brabandt

19

หากคุณอยู่ใน Vim อยู่แล้วคุณสามารถใช้คำสั่ง:argdoหรือ:bufdoคำสั่งเพื่อรันคำสั่งในทุกรายการในรายการอาร์กิวเมนต์หรือรายการบัฟเฟอร์ตามลำดับ

เช่นเรียกใช้:คำสั่งในทุกไฟล์ในรายการอาร์กิวเมนต์:

:argdo StripWhitespace

หรือเรียกใช้ฟังก์ชันจากทุกไฟล์ในรายการบัฟเฟอร์:

:bufdo call StripWhitespace()

หรือเรียกใช้แมโครqในทุกไฟล์ในรายการอาร์กิวเมนต์:

:argdo normal @q

แล้วบันทึกบัฟเฟอร์การเปลี่ยนแปลงทั้งหมดที่มีคุณสามารถหรือบันทึกทั้งหมดและเลิกเป็นกลุ่มที่มี:wall:wqall

หากคุณต้องการเขียนไฟล์ตามที่คุณไปคุณสามารถเพิ่มในการโทรไป:updateเช่น:

:argdo s/foo/bar/ge | update

มีหลายวิธีที่คุณสามารถนำไฟล์เข้า Vim ได้ในครั้งแรก ได้แก่ :

  • ระบุพารามิเตอร์ไปยังบรรทัดคำสั่ง vim: vim *(สิ่งนี้จะเพิ่มไฟล์ทั้งหมดลงในรายการอาร์กิวเมนต์)
  • ใช้:argsคำสั่ง (ซึ่งรองรับไวด์การ์ดและนิพจน์ backtick) เพื่อเติมรายการอาร์กิวเมนต์หรือ:argaddคำสั่งเพื่อเพิ่มไฟล์ลงไป
  • เพียงแค่เปิดพวกเขาทั้งหมดด้วยตนเอง:e, :Exหรือปลั๊กอินไฟล์เปิด

1
ฉันชอบคำตอบนี้เพราะไม่ต้องการออกเป็นกลุ่มซึ่งในความคิดของฉันแพงเกินไป (รายการบัฟเฟอร์ที่มีค่าของฉัน!) ฉันมีบันทึกบางส่วน (1) ออกจากบัฟเฟอร์โดยไม่ต้องเขียนต้อง'hidden'มีการตั้งค่า; (2) : updateคำสั่งเป็นการปรับปรุงเล็กน้อย:wเพราะจะเขียนเฉพาะเมื่อมีการเปลี่ยนแปลงดังนั้น:bufdo updateหรือ:argdo updateจะเขียนบัฟเฟอร์หรืออาร์กิวเมนต์ที่ปรับเปลี่ยนทั้งหมด
tommcdo

updateจุดที่ดีใน ฉันคิดว่าพูดถึงhiddenตอนที่ฉันเขียนคำตอบ แต่ก็ตัดสินใจเพราะฉันไม่ต้องการที่จะพูดให้เข้าใจง่ายเกินไป ในการไตร่ตรองแม้ว่ามันควรจะอยู่ในนั้น ฉันจะอัปเดตคำตอบเพื่อรวมทั้งข้อเสนอแนะในปัจจุบัน
รวย

@tommcdo เพิ่งตรวจสอบเอกสารสำหรับ: wall และมันเขียนเฉพาะบัฟเฟอร์ที่ถูกเปลี่ยนดังนั้นดังนั้น bufdo update ไม่จำเป็นต้องทำหลังจากทั้งหมด
รวย

จับดีเกี่ยวกับ:wallซึ่งยังมีข้อได้เปรียบของการไม่ขี่ผ่านบัฟเฟอร์และย้ายคุณออกไปจากที่ที่คุณเริ่ม ฉันคิดว่า:argdo updateยังคงเป็นเรื่องที่แตกต่าง - บางทีคุณอาจไม่ต้องการเขียนถึงบัฟเฟอร์ที่ไม่ได้อยู่ในรายการอาร์กิวเมนต์ของคุณ
tommcdo

@tommcdo จุดดี
รวย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.