Word Wrap in Vim (รักษาการเยื้อง)


92

ฉันเพิ่งดูโพสต์นี้ซึ่งอธิบายถึงวิธีการรวมคำทั้งหมดเป็นกลุ่ม วิธีแก้ปัญหาที่ยอมรับคือ:

:set formatoptions=l
:set lbr

ซึ่งรับข้อความนี้ (แท็บแสดงเป็น \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

สิ่งนี้ทำให้เกิดพฤติกรรมเช่นนี้ (แท็บแสดงเป็น \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

อย่างไรก็ตามฉันต้องการกำหนดฟังก์ชันนี้ใหม่ ฉันต้องการให้บรรทัดที่ห่อไว้มีจำนวนแท็บที่อยู่ด้านหน้าเท่ากับที่บรรทัดด้านบนบวก ได้แก่ :

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

ความคิดใด ๆ ?


34
+1 สำหรับความพยายามในการทำให้คำถามชัดเจนที่สุด
Jeffrey Jose

คุณต้องการให้ข้อความนุ่มห่อที่ขอบหน้าต่างหรือห่อแบบแข็งเมื่อเส้นยาวถึงระดับที่กำหนด? ฉันคิดว่าคุณต้องการการตัดที่ยาก (โดยที่บรรทัดใหม่ถูกแทรกลงในข้อความของคุณหลังคำว่า "will") แต่มันยากที่จะบอกจากตัวอย่างของคุณ
Bill Odom

@Bill ฉันสนใจเรื่อง softwrapping เป็นส่วนใหญ่ แต่วิธีการห่อแบบแข็งก็เป็นที่ยอมรับเช่นกัน
sixtyfootersdude

1
ฟังก์ชันที่คุณต้องการยังไม่ได้สร้างขึ้นใน Vim อย่างไรก็ตามมีแพตช์ที่เข้ามาใกล้: groups.google.com/group/vim_dev/web/vim-patches (คือ # 15 "การเยื้องบรรทัดที่ถูกต้อง")
Bill Odom

ที่เกี่ยวข้อง: VimCasts มีตอนที่ดีในการใช้ยูทิลิตี้ Unix ภายนอกเพื่อจัดการปัญหานี้: vimcasts.org/e/18
Damien Wilson

คำตอบ:


18

แพทช์ breakindentมีสิ่งที่คุณกำลังมองหา ฉันใช้มันสำเร็จโดยใช้คำแนะนำที่พบในหัวข้อนี้:

Patch Vim ด้วยแพตช์ breakindent บน OS X พร้อม Homebrew

โดยเฉพาะสูตร Homebrew ของ echristopherson

ฉันรู้ว่ากระทู้นี้เก่า แต่เป็นที่นิยมใน Google และฉันเจอมันหลายครั้งเมื่อพยายามหาวิธีแก้ปัญหา

แก้ไข: ตอนนี้แพทช์นี้รวมอยู่ในกลุ่มเป็นแพทช์ 7.4.338 ดู: https://retracile.net/blog/2014/07/18/18.00

ใน Yosemite (Mac OS X) ฉันใช้คำสั่งของ snowbound กับ hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 

แพทช์ดูเหมือนจะไม่ทำงานกับ macvim ล่าสุดบน homebrew? @ Exit42 คุณทำให้มันทำงานได้อย่างไร?
snowbound

nvm. ฉันรวบรวม macvim ด้วยขอบตกเลือด homebrewbrew install macvim --with-features=huge --override-system-vim --HEAD
snowbound

1
ดูคำตอบของฉันด้านล่าง: stackoverflow.com/questions/2828174/… ไม่จำเป็นต้องมีโปรแกรมแก้ไขใน vim เวอร์ชันใหม่กว่า
JoshuaD

26

สิ่งนี้ใช้ไม่ได้เมื่อถามคำถามในตอนแรก แต่ในวันที่ 25 มิถุนายน 2014 จะใช้งานได้ (สมมติว่าคุณอัปเดตกลุ่มของคุณเป็นเวอร์ชันที่ใหม่กว่าวันที่นั้น)

เพิ่มใน. vimrc ของคุณ:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

เท่านี้เอง!

-

บางคน (รวมตัวเองด้วย) แชร์. vimrc เดียวกับคอมพิวเตอร์หลายเครื่อง ในกรณีนี้สิ่งสำคัญคือต้องทำให้บรรทัดนี้มีประสิทธิภาพ (เพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดที่น่ารำคาญ) ดีกว่าเล็กน้อย:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

ด้วยวิธีนี้หากคุณใช้ vim เวอร์ชันก่อนหน้าคุณจะไม่ได้รับข้อความแสดงข้อผิดพลาด


ที่น่าสนใจสิ่งนี้ใช้ได้กับ vim 7.4 ของ cygwin ของฉัน แต่ไม่ใช่ในกลุ่ม 7.4 vim ของ unbuntu ฉันเดาว่ามันจะต้องแพร่หลายมากขึ้นอีกหน่อย แต่จะได้เห็นการนำไปใช้อย่างแพร่หลายในไม่ช้า
JoshuaD

1
ทำงานใน Vim 7.4 @ ArchLinux
Andy Mikhaylenko

1
คุณสามารถใช้การทดสอบนี้แทนได้:if has("patch-7.4.354")
Lawrence Kesteloot

นี้ไม่ได้ตอบคำถามเกี่ยวกับคำพูดของ OP: หมายเลขเดียวกันของแท็บ ( ... ) บวกหนึ่ง ในความคิดของฉันมีความสำคัญมากเช่นกันคุณอาจต้องการเว้นการเยื้องเพิ่มเติมและเปลี่ยนส่วนที่ห่อด้วยแสงไปทางขวา (รายการที่จัดเรียงอย่างแน่นหนาบันทึกย่อ ฯลฯ )
bloody

8

สิ่งที่ดีที่สุดที่คุณจะได้รับคือshowbreakตัวเลือกที่จะวางสตริงคงที่ไว้ด้านหน้าของแต่ละบรรทัดที่พันไว้ (ฉันใช้set showbreak=...)


@AlexanderBird ตาม:help 'showbreak'ไม่คุณทำไม่ได้ - showbreakเป็นเพียงสตริงเท่านั้น
Rory O'Kane

4

ฉันเห็นด้วยกับคำตอบที่ระบุว่า 'showbreak' เป็นตัวเลือกที่ดีที่สุด โดยทั่วไปแล้ว Showbreak ไม่อนุญาตให้คุณใส่อักขระที่ไม่มีการพิมพ์ (เช่นช่องว่างหรือแท็บ) ลงในสตริง showbreak ดังนั้นตามที่ใช้โดยทั่วไปแล้วมันจะให้ตัวบ่งชี้ที่ขอบซ้ายกล่าวคือไม่มีการเยื้องจริง สิ่งนี้ไม่ดีนักเนื่องจากเป้าหมายหลักของ OP ฉันคิดว่าคือการให้เส้นที่ห่อไว้และเยื้องเพื่อป้องกันไม่ให้พื้นที่ขอบด้านซ้ายรกรุงรังและดูเหมือนเส้นของตัวเอง

วิธีหนึ่งในการเพิ่มการเยื้อง (น่าเกลียด) โดยใช้ showbreak คือการใช้อักขระจำนวนมาก, .eg, ": set showbreak => --------------->" สิ่งนี้ทำให้เกิดสิ่งที่มีลักษณะดังนี้:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

ทางเลือกที่ดีกว่าอาจใช้ประโยชน์จากอักขระเว้นวรรค (สมมติว่าอินสแตนซ์ของ Vim เปิดใช้งาน Unicode) ซึ่งแต่ละตัวสามารถป้อนลงในสตริง showbreak โดยใช้ลำดับคีย์ของ ctrl-v, 160 ด้วยวิธีนี้คุณสามารถป้อนสตริง showbreak ที่ว่างทางด้านซ้ายและดูเหมือนว่าจะเป็นการเยื้องจริง เช่น ": set showbreak =......... >>" where each ". ในคำสั่งเป็นอักขระเว้นวรรคที่ป้อนโดยการกด ctrl-V, 160 ด้วยวิธีนี้คุณจะได้ห่อที่เยื้องอย่างดีเช่นนี้:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

คุณยังไม่มีความสามารถในการปรับเปลี่ยนระดับการเยื้องตามการเยื้องของบรรทัดก่อนหน้า แต่อย่างน้อยคุณก็จะได้รับการเยื้องของเส้นที่ถูกห่อโดยไม่เกะกะสายตามากมายตามขอบด้านซ้ายของหน้าต่าง อาจยังมีความสับสนหากการเยื้องของบรรทัดที่ห่อไว้น้อยกว่าจุดเริ่มต้นของบรรทัดจริง แต่อาจหลีกเลี่ยงได้โดยการทำให้ showbreak "เยื้อง" ค่อนข้างใหญ่ (กล่าวคือมากกว่าการเยื้องใด ๆ ที่พบโดยทั่วไปในโค้ดของคุณ ) แต่ก็ยังเล็กพอที่จะมีพื้นที่เพียงพอสำหรับการตัดข้อความที่ชัดเจน สำหรับการใช้งานจำนวนมากฉันคิดว่าการเยื้อง Showbreak ที่มีช่องว่าง 40 หรือ 50 ช่องจะทำได้ดี


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