เป็นไปได้ไหมที่จะแปลงแท็บเป็นช่องว่างในขณะที่ยังคงการจัดแนวข้อความไว้?
เพียงแทนที่งานได้อย่างเป็นประโยชน์เมื่อไม่มีตัวอักษรนำ
เป็นไปได้ไหมที่จะแปลงแท็บเป็นช่องว่างในขณะที่ยังคงการจัดแนวข้อความไว้?
เพียงแทนที่งานได้อย่างเป็นประโยชน์เมื่อไม่มีตัวอักษรนำ
คำตอบ:
คุณสามารถใช้:retab
คำสั่ง จาก
:help :retab
แทนที่ลำดับทั้งหมดของ white-space ที่มี a
<Tab>
ด้วยสตริงใหม่ของ white-space โดยใช้ค่า tabstop ใหม่ที่กำหนด หากคุณไม่ได้ระบุขนาด tabstop ใหม่หรือเป็นศูนย์ Vim จะใช้ค่าปัจจุบัน'tabstop'
เป็น [... ]'expandtab'
เมื่อเปิดเป็นกลุ่มจะแทนที่แท็บทั้งหมดด้วยจำนวนช่องว่างที่เหมาะสม
โปรดทราบว่าคำสั่งยอมรับช่วงเพื่อให้คุณสามารถเลือกภาพและจากนั้นเพียงแค่:retab
บรรทัดที่เลือก
อย่างไรก็ตามคุณสามารถใช้:retab
ตามที่ระบุไว้ซึ่งจะเปลี่ยนแท็บทั้งหมดเป็นช่องว่างไม่ใช่แค่แท็บที่จุดเริ่มต้นของบรรทัด
ดังนั้นนี่ ( ⇥
ตัวอักษรของแท็บอยู่ที่ไหน):
if :; do
⇥echo "⇥hello"
end
ถูกเปลี่ยนเป็น (โดยที่␣
อักขระเว้นวรรค):
if :; do
␣␣echo "␣␣hello"
end
สิ่งนี้สามารถสร้างผลข้างเคียงที่ไม่คาดคิดในบางสถานการณ์และเป็นปัญหามากขึ้นเมื่อเปลี่ยนช่องว่างเป็นแท็บ!
ดังนั้นฉันจึงเขียนฟังก์ชั่นเล็ก ๆ น้อย ๆ เพื่อเปลี่ยนเฉพาะแท็บ / ช่องว่างที่จุดเริ่มต้นของบรรทัด:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
กับรุ่นนี้คุณต้องระบุด้วยตนเองexpandtab
ในการเรียกใช้ฟังก์ชัน (ie. :call Retab(1)
เพื่อเปลี่ยนแท็บไปที่ช่องว่าง) แต่คุณยังสามารถปรับเปลี่ยนให้ใช้ค่าปัจจุบันของ&expandtab
(มันไม่อยู่แล้วด้วย&tabstop
) เช่นเดียว:retab
ไม่ (ฉันบังเอิญต้องการระบุด้วยตนเอง)
a
ในif a:expandtab
หมายถึง?
set expandtab
. vimrc และจากนั้นautocmd BufWritePre * :call Retab(&expandtab)
- การเยื้องจะเปลี่ยนเป็นแท็บแทนที่จะเว้นวรรค
Vim จัดเตรียม!retab
คำสั่งซึ่งจะแทนที่ลำดับทั้งหมด<Tab>
ด้วยสตริงใหม่ของ white-space โดยใช้ค่า tabstop ใหม่ (เช่น:set tabstop=2
) ที่กำหนด แต่แท็บทั้งหมดภายในสตริงสามารถแก้ไขได้ (เช่นในโปรแกรม C คุณควรใช้\t
เพื่อหลีกเลี่ยงสิ่งนี้)!
ดังนั้นคุณสามารถเปลี่ยนแท็บทั้งหมดเป็นช่องว่างโดยใช้คำสั่งต่อไปนี้:
:%s/\t/ /g
หรือตามที่แนะนำโดย@Shahbaz :
:%s/^\t\+/ g
ดังนั้นแท็บที่ใช้ในการเยื้องเท่านั้นจึงถูกแปลง
คำอธิบาย:
%
แสดงถึงบัฟเฟอร์ / ไฟล์ทั้งหมด ( :help :%
)s
ย่อมาจากทดแทน ( :help sub-replace-special
)\t
หรือ^I
ย่อมาจากแท็บ
- ใช้ช่องว่างมากเท่าที่คุณต้องการต่อหนึ่งแท็บg
- ย่อมาจากทั่วโลกและมันจะแปลงแท็บหลายรายการในบรรทัดเดียวกันgg=Gจากนั้นในการแก้ไขการเยื้องของไฟล์ทั้งหมดที่คุณอาจลอง: ตรวจสอบ: การเยื้องรหัสเยื้องที่ไม่ดีสำหรับรายละเอียดเพิ่มเติม
หากต้องการใช้ช่องว่างเป็นค่าเริ่มต้นแทนที่จะเป็นแท็บคุณจะต้องเพิ่มการตั้งค่าต่อไปนี้ใน.vimrc
ไฟล์ของคุณ:
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
โซลูชันทางเลือกคือการใช้ tidy
ที่เกี่ยวข้อง:
%s/^\t\+/ g
นั้นเฉพาะแท็บที่ใช้ในการเยื้องเท่านั้นที่จะถูกแปลง นอกจากนี้gg=G
อาจเป็นความหายนะกับภาษาเช่นหลาม
ลองใช้:
expand -t 4 input_filename output_filename
expand
:!expand
เป็นเครื่องมือบรรทัดคำสั่งเพื่อแปลงแท็บไปที่ช่องว่างซึ่งคุณสามารถเรียกใช้จากเปลือกหรือ
มันอยู่ใน POSIXดังนั้นจึงควรมีอยู่ในระบบส่วนใหญ่ unexpand
จะทำสิ่งที่ตรงกันข้ามโดยวิธี
expand
อะไร
:%!expand -t 4
ภายในของกลุ่ม ยิ่งไปกว่านั้นคุณยังสามารถใช้ตัวเลือกความกว้างของการเลื่อนปัจจุบัน: :exe '%!expand -t ' . &shiftwidth
เพื่อความสมบูรณ์=
ยังสามารถใช้เพื่อแก้ไขการเยื้องหลังจากที่คุณระบุว่าแท็บจะถูกแทนที่ด้วยช่องว่าง :set expandtab
ในโหมดปกติคุณสามารถทำได้โดยการพิมพ์ จากนั้น=
สามารถใช้สองวิธี:
=
จะแก้ไขการเยื้องของบล็อกรหัสที่เลือกgg=G
จะแก้ไขไฟล์ทั้งหมดซึ่งgg
จะย้ายเคอร์เซอร์ไปที่ตำแหน่งเริ่มต้นของไฟล์จากนั้น=
นำไปใช้และG
ย้ายเคอร์เซอร์ไปที่ท้ายไฟล์อ้างอิง: ลิงค์
:h vim-faq
ยากที่จะจดจำแท็ก/tab characters
:h faq-14.16