1 - หากคุณมีช่องว่างและต้องการแท็บ
ก่อนอื่นคุณต้องตัดสินใจว่าจะมีช่องว่างจำนวนเท่าใดในแท็บเดียว ที่กล่าวว่าสมมติว่าคุณมีเส้นที่มีช่องว่างนำหน้า 4 หรือ 8 ... กว่าที่คุณรู้ว่าคุณอาจต้องการแท็บเป็นช่องว่าง 4 ขณะนี้มีข้อมูลที่คุณทำ:
:set ts=4
:set noet
:%retab!
มีปัญหาอยู่ที่นี่! ลำดับของคำสั่งนี้จะค้นหาข้อความทั้งหมดของคุณไม่เพียงเว้นวรรคในตอนต้นของบรรทัด นั่นหมายความว่าสตริงเช่น: "Hey,␣this␣␣␣␣is␣4␣spaces"
จะกลายเป็น"Hey,␣this⇥is␣4␣spaces"
แต่ไม่ใช่! แท็บ!
ที่จะชำระปัญหาเล็ก ๆ น้อย ๆ นี้ฉันขอแนะนำแทนsearch
retab
:%s/^\(^I*\)␣␣␣␣/\1^I/g
การค้นหานี้จะค้นหาไฟล์ทั้งหมดสำหรับบรรทัดใด ๆ ที่ขึ้นต้นด้วยจำนวนแท็บใดก็ตามตามด้วยช่องว่าง 4 อันและแทนที่ด้วยแท็บใดก็ได้ที่พบจำนวนหนึ่งบวกหนึ่งแท็บ
น่าเสียดายที่นี่จะไม่ทำงานทันที!
ตอนแรกไฟล์จะมีบรรทัดที่ขึ้นต้นด้วยช่องว่าง การค้นหาจะแปลงเฉพาะ 4 ช่องว่างแรกไปเป็นแท็บและปล่อยต่อไปนี้ ...
คุณต้องทำซ้ำคำสั่ง กี่ครั้ง? pattern not found
จนกว่าคุณจะได้รับ ฉันไม่สามารถคิดวิธีที่จะทำให้กระบวนการอัตโนมัติ แต่ถ้าคุณทำ:
`10@:`
คุณทำเสร็จแล้ว คำสั่งนี้ทำการค้นหา / แทนที่ครั้งสุดท้ายซ้ำ 10 ครั้ง ไม่น่าเป็นไปได้ที่โปรแกรมของคุณจะมีการเยื้องจำนวนมาก @@
หากมีเพียงแค่ทำซ้ำอีกครั้ง
ตอนนี้เพียงเพื่อตอบคำถาม ฉันรู้ว่าคุณถามถึงสิ่งที่ตรงกันข้าม แต่คุณไม่มีทางรู้ว่าจะต้องเลิกทำเมื่อไหร่
2 - คุณมีแท็บและต้องการเว้นวรรค
ก่อนอื่นให้ตัดสินใจว่าคุณต้องการให้มีการแปลงแท็บจำนวนเท่าใด สมมติว่าคุณต้องการให้แต่ละแท็บเป็น 2 ช่องว่าง จากนั้นคุณ:
:set ts=2
:set et
:%retab!
นี่จะมีปัญหาเดียวกันกับสตริง แต่เนื่องจากรูปแบบการเขียนโปรแกรมที่ดีกว่าที่จะไม่ใช้แท็บฮาร์ดภายในสตริงคุณจึงกำลังทำสิ่งที่ดีที่นี่ \t
หากคุณต้องการแท็บจริงๆภายในสตริงใช้
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) จะปรากฏขึ้นเพื่อแปลงช่องว่างทั้งหมดไม่ใช่เฉพาะช่องว่างนำหน้า ในตัวอย่างที่สอง (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
) มันจะแทนที่ช่องว่างแรกในแต่ละบรรทัดด้วยแท็บและปล่อยให้ส่วนที่เหลือของพวกเขา