วิธีการเปิดหลายไฟล์ที่ตรงกับนิพจน์ตัวแทน?


10

ฉันต้องการแก้ไขไฟล์หลายไฟล์ที่ตรงกับนิพจน์ glob ตัวอย่างเช่นหากต้องการแก้ไขไฟล์ git config ทั้งหมดในไดเรกทอรีลูกฉันสามารถทำได้ในเชลล์:

vim */.git/config

ที่เป็นกลุ่ม:บรรทัดคำสั่งที่ฉันคาดหวัง:find */.git/configที่จะทำบางสิ่งบางอย่างที่คล้ายกัน (เช่นเปิดไฟล์ทั้งหมดที่ตรงกับการแสดงออก glob) E77: Too many file namesแต่แทนที่จะบ่น

มีคำสั่งเป็นกลุ่มหรือหนึ่งซับเพื่อเปิดหลายไฟล์ที่ตรงกับการแสดงออก wildcard / glob (ที่ไม่เกี่ยวข้องกับการเขียนฟังก์ชั่น)?

คำตอบ:


8

:args {glob}คุณสามารถใช้ ใน glob ของคุณ**จะสำรวจไดเรกทอรีซ้ำ

สิ่งนี้จะเติมรายการอาร์กิวเมนต์ซึ่งเป็นรายการเดียวกับที่ได้รับการเติมเมื่อคุณเริ่ม Vim ด้วยชื่อไฟล์อย่างน้อยหนึ่งชื่อเป็นอาร์กิวเมนต์

เมื่อรายการอาร์กิวเมนต์ของคุณเป็นประชากรที่คุณสามารถเลื่อนได้ใช้และ:next :previousนอกจากนี้คุณยังสามารถข้ามไปที่รายการแรกและสุดท้ายด้วย:firstและ:lastคำสั่ง


1
Nice :) :args */.git/configเติมรายการบัฟเฟอร์ด้วยเช่นกันดังนั้น:bnextก็ทำงานเช่นกัน มันดูแปลกไหม? (กลุ่ม 7.4.52 และ Neovim)
จัสตินเอ็มคีย์ส

1
นอกจากนี้ยังเป็นการเตือนความทรงจำแก่ผู้อื่น]aรอบ:argsรายการหากgithub.com/tpope/vim-unimpaired ได้รับการติดตั้ง
Justin M. Keyes

ยัง:argadd file*สามารถทำ
kenorb

รูปแบบการใช้งาน glob ( **) คุณจะต้องมีglobstarชุดดู: Match ไฟล์ทั้งหมดภายใต้ไดเรกทอรีที่ซ้อนกันทั้งหมดที่มีเปลือก globbing
kenorb

@ JustinM.Keyes รายการบัฟเฟอร์เป็นชุดของรายการ args ดังนั้นจึงเป็นไปตามที่คาดไว้
jamessan

3

วิธีเปิดไฟล์ที่ตรงกันในแท็บแยก ...

:n */.git/config | tab all

คำอธิบาย: :n ( :next) ตั้งค่ารายการไฟล์ถัดไปเป็นรายการที่ตรงกันทั้งหมด tab allเปิดไฟล์ทั้งหมดในรายการไฟล์ถัดไปในแท็บใหม่

… หรือ …

for f in glob("*.py", 0, 1) | exe "tabe" f | endfor

คำอธิบาย: ในglob(…)ที่ 0 หมายถึงการที่จะรวมทุกไฟล์ที่ตรงกันถึงแม้ว่าพวกเขามิฉะนั้นจะถูกละเว้นเนื่องจากการsuffixesหรือwildignorecaseการตั้งค่า 1 หมายถึงการส่งคืนรายการแทนที่จะเป็นสตริง exe "tabe" fเป็นรูปแบบสั้น ๆexecute "tabedit" fและหมายถึงการเปิดไฟล์ที่ระบุโดยตัวแปรfในแท็บใหม่


1
ดูเหมือน:n */.git/config | bufferงาน
Mateen Ulhaq

2

ที่เป็นกลุ่มที่บรรทัดคำสั่งที่ฉันคาดหวัง:find */.git/configที่จะทำบางสิ่งบางอย่างที่คล้ายกัน (เช่นเปิดไฟล์ทั้งหมดที่ตรงกับการแสดงออก glob) E77: Too many file namesแต่แทนที่จะบ่น

อย่าคาดหวังอะไรก่อนอ่านเอกสาร

นอกจากคำตอบของทอมคุณสามารถใช้:nextเป็นทางเลือก:argsโดยตรง


0

การเปิดไฟล์โดยใช้งานได้vim */.git/configแน่นอน หากไม่เป็นเช่นนั้นคุณควรอัพเกรด Vim ของคุณเป็น 7.4 (เวอร์ชั่นก่อนหน้านั้นมีค่าบั๊กมากขึ้น)

หรือลองใช้วิธีใดวิธีหนึ่งต่อไปนี้ (ภายในตัวแก้ไข):

:n `find .git/ -name config`
:args `find . -name config`

คุณไม่ได้อ่านคำถามของฉันอย่างระมัดระวัง :argsและคำตอบที่ได้รับการยอมรับแล้วกล่าว
Justin M. Keyes

@ JustinM.Keyes ขอบคุณสำหรับคะแนนของคุณ สัญลักษณ์แทนควรทำงานตามค่าเริ่มต้นและนี่เป็นคำตอบเดียวที่บอกว่าควรใช้งานได้ใน 7.4 (เพราะฉันมีข้อผิดพลาดเดียวกันก่อนการอัพเกรด) ใช้argsเป็นเพียงการแก้ปัญหา แต่ต่อไปอีกมันแสดงให้เห็นวิธีการใช้การขยายตัวของเปลือกภายในกลุ่มมันด้วยตัวเองในกรณีที่ผู้ใช้ต้องการต่อไปที่จะใช้สำหรับการแก้ปัญหาที่ซับซ้อนมากขึ้นโดยใช้findเช่นนี้ ดังนั้นฉันคิดว่ามันให้คุณค่าเพิ่มเติมกับคำถามของคุณ ดังนั้นฉันหวังว่ามันจะดีกับคุณ
kenorb

ฉันไม่เคยมีปัญหากับvim */fooและไม่มีทางที่จะเกี่ยวข้องกับเวอร์ชั่น Vim เพราะนั่นเป็นคุณสมบัติของเชลล์
Justin M. Keyes

0

ชัดเจน แต่ไม่อยู่ในรายการด้านบน - ตัวอย่างค้นหาไฟล์ sql ทั้งหมดที่มีสตริง create_table ในชื่อ

:args **/*create_table*sql

และตรวจสอบพวกเขา

:ls

และเปิดอันแรก

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